ファイルのgit
使用時にバイナリファイルを無視するにはどうすればよい.gitignore
ですか?
例:
$ g++ hello.c -o hello
「hello」ファイルはバイナリファイルです。git
このファイルを無視できますか?
[^\.]*
ます。
ファイルのgit
使用時にバイナリファイルを無視するにはどうすればよい.gitignore
ですか?
例:
$ g++ hello.c -o hello
「hello」ファイルはバイナリファイルです。git
このファイルを無視できますか?
[^\.]*
ます。
回答:
# Ignore all
*
# Unignore all with extensions
!*.*
# Unignore all dirs
!*/
### Above combination will ignore all files without extension ###
# Ignore files with extension `.class` & `.sm`
*.class
*.sm
# Ignore `bin` dir
bin/
# or
*/bin/*
# Unignore all `.jar` in `bin` dir
!*/bin/*.jar
# Ignore all `library.jar` in `bin` dir
*/bin/library.jar
# Ignore a file with extension
relative/path/to/dir/filename.extension
# Ignore a file without extension
relative/path/to/dir/anotherfile
!/**/
代わりに使用し!*/
ます。どちらが正しいか?/ cc @VonC
のようなものを追加
*.o
.gitignoreファイル内にあり、それをリポジトリのルートに配置します(または、任意のサブディレクトリに配置できます-そのレベルから適用されます)。
編集:
拡張子のないバイナリの場合は、bin/
その他のフォルダに配置することをお勧めします。結局、content-typeに基づく無視はありません。
あなたが試すことができます
*
!*.*
しかし、それは絶対確実ではありません。
gcc
渡して作成されたファイルに対しても同じことを実行しようとしています-o $@
。
すべての実行可能ファイルを.gitignore
(あなたの質問から判断すると、おそらく「バイナリファイル」によって意味される)に追加するには、次のように使用できます。
find . -executable -type f >>.gitignore
の行の順序を気にしない場合は、次のコマンドでを.gitignore
更新して.gitignore
、重複を削除し、アルファベット順をそのまま維持することもできます。
T=$(mktemp); (cat .gitignore; find . -executable -type f | sed -e 's%^\./%%') | sort | uniq >$T; mv $T .gitignore
パイプを使用して出力を直接にパイプすることはできません。これは.gitignore
、ファイルをcat
開いて読み取る前にファイルを切り捨てるためです。また、\! -regex '.*/.*/.*'
サブディレクトリに実行可能ファイルを含めたくないかどうかを確認するオプションとして追加することもできます。
あなたはあなたで試すかもしれません.gitignore
:
*
!*.c
このアプローチには多くの欠点がありますが、小規模なプロジェクトでは受け入れられます。
makefileを使用している場合は、makeルールを変更して、新しいバイナリの名前を.gitignoreファイルに追加してみてください。
以下は、小さなHaskellプロジェクトのMakefileの例です。
all: $(patsubst %.hs, %, $(wildcard *.hs))
%: %.hs
ghc $^
grep -xq "$@" .gitignore || echo $@ >> .gitignore
このメイクファイルは、Haskellコードから実行可能ファイルを作成するためのルールを定義します。ghcが呼び出された後、.gitignoreをチェックして、バイナリが既にそこにあるかどうかを確認します。そうでない場合は、バイナリの名前をファイルに追加します。
多くの場合、バイナリファイルには拡張子がありません。これがあなたの場合はこれを試してください:
*
!/**/
!*.*
ファイルを使用する別のソリューションを次に示します。この方法では、実行可能スクリプトはgitignoreになりません。ファイルからの出力をシステムに合わせて解釈する方法を変更する必要がある場合があります。次に、コミット前のフックを設定して、コミットするたびにこのスクリプトを呼び出すことができます。
import subprocess, os
git_root = subprocess.check_output(['git', 'root']).decode("UTF-8").strip()
exes = []
cut = len(git_root)
for root, dirnames, filenames in os.walk(git_root+"/src/"):
for fname in filenames:
f = os.path.join(root,fname)
if not os.access(f,os.X_OK):
continue
ft = subprocess.check_output(['file', f]).decode("UTF-8")
if 'ELF' in ft and 'executable' in ft:
exes.append(f[cut:])
gifiles = [ str.strip(a) for a in open(git_root + "/.gitignore").readlines() ]
gitignore=frozenset(exes+gifiles)
with open(git_root+"/.gitignore", "w") as g:
for a in sorted(gitignore):
print(a, file=g)
ルートだけでなく、いくつかのサブディレクトリでも無視する方法:
# Ignore everything in a root
/*
# But not files with extension located in a root
!/*.*
# And not my subdir (by name)
!/subdir/
# Ignore everything inside my subdir on any level below
/subdir/**/*
# A bit of magic, removing last slash or changing combination with previous line
# fails everything. Though very possibly it just says not to ignore sub-sub-dirs.
!/subdir/**/
# ...Also excluding (grand-)children files having extension on any level
# below subdir
!/subdir/**/*.*
または、特定の種類のファイルのみを含める場合:
/*
!/*.c
!/*.h
!/subdir/
/subdir/**/*
!/subdir/**/
!/subdir/**/*.c
!/subdir/**/*.h
必要に応じて、すべての新しいサブディレクトリに対しても同様に機能するようです!:
/*
!/*.c
!/*.h
!/*/
/*/**/*
!/*/**/
!/*/**/*.c
!/*/**/*.h
先頭のスラッシュは最初の2行でのみ重要で、その他の行ではオプションです。スラッシュを尾行に!/*/
して!/subdir/
もオプションですが、これだけの行です。
GOPATHディレクトリに2つのエントリを持つ.gitignoreファイルを作成しました。
/bin
/pkg
現在、コンパイルされた開発はすべて無視されます。
.gitignoreは、少なくともLinuxでは、globプログラミングを使用してファイルをフィルタリングします。
私は、Meetupでコーディングの話をしようとしています。準備として、提示する順序に従って名前が付けられたいくつかのサブディレクトリを含むディレクトリを作成しました:01_subject1、02_subject2、03_subject3。各サブディレクトリには、言語に依存する拡張子を持つソースファイルが含まれています。このファイルは、一般的な方法に従って、拡張子のないソースファイル名と名前が一致する実行可能ファイルにコンパイルされます。
次の.gitignore行を使用して、数字の接頭辞が付いたディレクトリにあるコンパイル済みファイルを除外します。
[0-9][0-9]_*/[!\.]*
ドキュメントの私の理解によると、それは動作しないはずです。末尾のアスタリスクは、「。」を含む任意の数の未指定文字と一致する必要があるため、失敗するはずです。+拡張子。末尾のアスタリスクを省略すると[!\.]
、単一の非ピリオド文字にのみ一致するため、失敗します(実際に失敗します)。ただし、正規表現の場合と同様に、末尾にアスタリスクを追加しましたが、機能します。仕事で言うと、gitはソースファイルの変更に気づきますが、コンパイル済みファイルの存在や変更には気づきません。
# Ignore all
*
# Unignore all files with extensions recursively
!**/*.*
# Unignore Makefiles recursively
!**/Makefile
# other .gitignore rules...
この.gitignore
メカニズムは、ファイルの内容ではなく、ファイル名に基づいてのみ機能します。バイナリファイルであることはコンテンツのプロパティであるため、gitにバイナリファイルを直接無視するように依頼することはできませんが、名前でそれらを無視することだけが可能です(他の提案に従って、すべてのバイナリファイル名をに追加するか、適切な命名規則)。.gitignore
.gitignore
ファイル名で機能するという事実は、パフォーマンスに関して重要なプロパティです。Gitはファイルを一覧表示するだけで、無視して無視するファイルを知るためにファイルを開いて読み取る必要はありません。つまり、内容に基づいてファイルを無視するように要求できる場合、Gitは非常に遅くなります。