バイナリファイルなしのgitignore


141

ファイルのgit使用時にバイナリファイルを無視するにはどうすればよい.gitignoreですか?

例:

$ g++ hello.c -o hello

「hello」ファイルはバイナリファイルです。gitこのファイルを無視できますか?



2
そのような古くて重要な質問に適切な答えがないことに私は非常に驚いています。答えが単純明快であることには、さらに驚き[^\.]*ます。
TamaMcGlinn 2018年

これは機能しません
timotheecour

回答:


136
# 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

1
このソリューションは魅力のように機能します!なぜすべてのディレクトリ「!* /」を無視しないことで、拡張子の付いたsubdirのファイルも無視できないのかわかりません。(例:aaa / bbb.c)ただし、拡張子のないsubdirのファイルは無視します。(例:aaa / ccc)
dragonxlwang 2015年

4
ディレクトリの複数のレイヤーがある場合、この方法は期待どおりに機能しないようです...
dragonxlwang

@dragonxlwang私はこれがうまくいかない場所に興味がありますか?ここで受け入れられているソリューション stackoverflow.com/a/19023985/1426932は少し異なり、の!/**/代わりに使用し!*/ます。どちらが正しいか?/ cc @VonC
timotheecour

Unix文化では、拡張機能なしのシェルスクリプトやバイナリ実行可能ファイルに名前を付けることはかなり一般的です。その場合、このソリューションではスクリプトが無視されます。より良いアイデアは、バイナリ実行可能ファイルをプロジェクトに追加するときはいつでも、手動で.gitignoreに手動で追加することです-通常、それほど頻繁には発生しません。それが面倒すぎる場合は、vedantkが提案するmakefileソリューションの方が適しています。
Peter Helfer

これはメイクファイルを無視します
VMatrix1900

42

のようなものを追加

*.o

.gitignoreファイル内にあり、それをリポジトリのルートに配置します(または、任意のサブディレクトリに配置できます-そのレベルから適用されます)。

編集:

拡張子のないバイナリの場合は、bin/その他のフォルダに配置することをお勧めします。結局、content-typeに基づく無視はありません。

あなたが試すことができます

*
!*.*

しかし、それは絶対確実ではありません。


1
編集を追加しました。バイナリに拡張子を付けたくない理由はありますか
manojlds '19 / 04/11

10
多くの場合、実行可能ファイルには拡張子がありません。ここでgcc渡して作成されたファイルに対しても同じことを実行しようとしています-o $@
Nathan Lilienthal

29

すべての実行可能ファイルを.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 '.*/.*/.*'サブディレクトリに実行可能ファイルを含めたくないかどうかを確認するオプションとして追加することもできます。


23

バイナリを使用する最善の策は、標準パターンで簡単に除外できる拡張子を与えるか、ディレクトリレベルで除外できるディレクトリに配置することです。

拡張機能は標準で基本的に必須であるため、拡張機能の提案はWindowsでより適切ですが、Unixでは、実行可能バイナリで拡張機能を使用する場合と使用しない場合があります。この場合、それらをbin /フォルダーに入れbin/、.gitignoreに追加できます。

非常に具体的で小さなスコープの例でhelloは、.gitignoreを入れるだけです。


15

あなたはあなたで試すかもしれません.gitignore

*
!*.c

このアプローチには多くの欠点がありますが、小規模なプロジェクトでは受け入れられます。


3
主要な不利な点を最低限挙げればいいのですが
pjvds

明らかな欠点は、許可/拒否ルールの順序です。適切な方法は、不要なファイルのみを無視し、すべてを禁止せずに、必要なファイルのみを含めることです。
Andrei Beliankou 2014

13

makefileを使用している場合は、makeルールを変更して、新しいバイナリの名前を.gitignoreファイルに追加してみてください。

以下は、小さなHaskellプロジェクトのMakefileの例です。

all: $(patsubst %.hs, %, $(wildcard *.hs))

%: %.hs
    ghc $^
    grep -xq "$@" .gitignore || echo $@ >> .gitignore

このメイクファイルは、Haskellコードから実行可能ファイルを作成するためのルールを定義します。ghcが呼び出された後、.gitignoreをチェックして、バイナリが既にそこにあるかどうかを確認します。そうでない場合は、バイナリの名前をファイルに追加します。


さて、これは一種の異なるアプローチです。
ルネNyffenegger


5

ファイルを使用する別のソリューションを次に示します。この方法では、実行可能スクリプトは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)

私は同様のスクリプトを作成し、重複した質問に投稿しました: stackoverflow.com/a/28258619/218294 あなたのコードはより良いです:)私はおそらく「ファイル」を1回だけ実行するか、または(xargsを使用して)数回実行するため、より速く実行されます。
Sam Watkins

4

ルートだけでなく、いくつかのサブディレクトリでも無視する方法:

# 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/もオプションですが、これだけの行です。


3

.gitignoreファイルでこれらのコマンドを実行しても、ファイルがまだ表示されているように見える場合は、試してみてください。

git rm --cached FILENAME

その後、.gitignoreを追加し、コミットしてプッシュします。それを理解するのに40分かかった、これが私のような初心者に役立つことを願っています


2

古いスレッドですが、まだ関連があります。リンク後に生成されるバイナリファイルの名前が[filname]になるようにmakefileを変更しました。[filname]だけではなく、bin。次に、gitignoreに* .binファイルを追加しました。
このルーチンは私のニーズを満たしています。


1

他の解決策はわかりませんが、1つずつに追加していきます.gitignore

テストの大まかな方法​​は、fileコマンドの出力をgrepすることです。

find . \( ! -regex '.*/\..*' \) -type f | xargs -n 1 file | egrep "ASCII|text"

編集

単純に実行可能ファイルと名付けませんhello.binか?


実行可能ファイルにファイル拡張子を付けること.binは悪い習慣だからです。
MD XF


0

GOPATHディレクトリに2つのエントリを持つ.gitignoreファイルを作成しました。

/bin
/pkg

現在、コンパイルされた開発はすべて無視されます。


0

.gitignoreは、少なくともLinuxでは、globプログラミングを使用してファイルをフィルタリングします。

私は、Meetupでコーディングの話をしようとしています。準備として、提示する順序に従って名前が付けられたいくつかのサブディレクトリを含むディレクトリを作成しました:01_subject1、02_subject2、03_subject3。各サブディレクトリには、言語に依存する拡張子を持つソースファイルが含まれています。このファイルは、一般的な方法に従って、拡張子のないソースファイル名と名前が一致する実行可能ファイルにコンパイルされます。

次の.gitignore行を使用して、数字の接頭辞が付いたディレクトリにあるコンパイル済みファイルを除外します。

[0-9][0-9]_*/[!\.]*

ドキュメントの私の理解によると、それは動作しないはずです。末尾のアスタリスクは、「。」を含む任意の数の未指定文字と一致する必要があるため、失敗するはずです。+拡張子。末尾のアスタリスクを省略すると[!\.]、単一の非ピリオド文字にのみ一致するため、失敗します(実際に失敗します)。ただし、正規表現の場合と同様に、末尾にアスタリスクを追加しましたが、機能します。仕事で言うと​​、gitはソースファイルの変更に気づきますが、コンパイル済みファイルの存在や変更には気づきません。



0

以下を.gitignoreファイルに追加します。

[^\.]*

説明:

[] encloses a character class, e.g. [a-zA-Z] means "any letter".
^  means "not"
\. means a literal dot - without the backslash . means "any character"
*  means "any number of these characters"

0

この.gitignoreメカニズムは、ファイルの内容ではなく、ファイルに基づいてのみ機能します。バイナリファイルであることはコンテンツのプロパティであるため、gitにバイナリファイルを直接無視するように依頼することはできませんが、名前でそれらを無視することだけが可能です(他の提案に従って、すべてのバイナリファイル名をに追加するか、適切な命名規則)。.gitignore

.gitignoreファイル名で機能するという事実は、パフォーマンスに関して重要なプロパティです。Gitはファイルを一覧表示するだけで、無視して無視するファイルを知るためにファイルを開いて読み取る必要はありません。つまり、内容に基づいてファイルを無視するように要求できる場合、Gitは非常に遅くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.