Gitのホワイトリストとサブディレクトリ


90

テキストファイルのみのホワイトリストを作成しました。

*
!*.txt

今、私はサブディレクトリに追跡されていないテキストファイルを持っています- sub/dir/file.txt、これは表示されません(無視されます)。ただし、ルートディレクトリのテキストファイルは表示されます。

なぜですか、どうすれば修正できますか?



含めたいファイルはサブディレクトリにありますか?その場合、このサブディレクトリは、の最初のスターによってすでに無視されている可能性があります.gitignore
フェイラン

はい。これらのファイルは、私の例では11.1.102.55フォルダと同じくらいディレクトリ構造が低くなります。ネストはフォルダ/製品間で常に同じではありません。
ネイト

1
私はこの機能を知っています。何百ものディレクトリがあります。ディレクトリごとに1つのgitignoreを作成するよりも、不要なファイルタイプを明示的に無視する方が高速です。私は本当に.gitignoreファイルからホワイトリスト機能を取得する方法を探しています。
ネイト

1
これがどのように重複しているかはわかりません。他の質問では、特定のファイルをホワイトリストに登録する方法を尋ねますが、この質問では、サブフォルダーを含む特定のファイルタイプをホワイトリストに登録する方法を尋ねます。実際には、stackoverflow.com / questions / 8024924 / …の複製に似ています。
Big McLargeHuge 2013

回答:


144

そのようにしようとすると、構造内のディレクトリがブラックリストに登録されるため、失敗します。

解決するには、ディレクトリではなく、コミットするファイルの種類ではないすべてのものをブラックリストに登録し、ディレクトリをブラックリストに登録しないようにます。

.gitignoreこれを実行するファイル:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

.txtの存在下でのファイル*.one*.twoおよびリポジトリのルートディレクトリにある*.threeを使用したファイルのホワイトリストの3レベルの構造でこれをテストしました.gitignore-私にとっては機能します。.gitignore構造内のすべてのディレクトリにファイルを追加する必要はありません。

私が答えを見つけるのに使用した情報は、とりわけ、これ(stackoverflow.com)からのものでした。


18
また!.gitignore、を使用する場合は、エントリも必要*です。
sjas 2013

2
ここに私の答えを参照してください:stackoverflow.com/questions/987142/... 使用する方が有用である可能性が/*実際に手段がこれ、再帰的にすべてのフォルダだけで最上位のフォルダをブラックリストに載せるはなく、.gitignoreホワイトリスト、フォルダのサブフォルダに見てはいけません。
ライアンテイラー

1

これを実現する簡単な方法は次のとおりです。

# Blacklist all files...
*.*

# ...except the ones we want
!*.txt

これは、ファイルの下のすべてのレベルにgitignore開始しないパターンを適用するため機能/.gitignoreます。

パターンの先頭または中央(あるいは両方)にセパレータがある場合、パターンは特定の.gitignoreファイル自体のディレクトリレベルに関連しています。そうでない場合、パターンは.gitignoreレベルより下のどのレベルでも一致する可能性があります。

これをディレクトリ内のファイルに対して実行したい場合、状況はさらに複雑になります。

# Blacklist all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

これgitignoreは、次の特別なルールがあるため機能し**ます。

**完全パス名と照合されるパターン内の2つの連続するアスタリスク( " ")は、特別な意味を持つ場合があります。

  • スラッシュとそれに続く2つのアスタリスク、それに続くスラッシュは、0個以上のディレクトリと一致します。たとえば、「a/**/b」は「a/b」、「a/x/b」、「a/x/y/b」などと一致します。

重要なのは、他のルールに関係なく、そのディレクトリ内のすべてのファイルが無視されるため、ディレクトリを無視しないようにすることです。


0

私は長い間探しました:

  1. 再帰的にネストされた〜100.000のディレクトリを持つ大きなフォルダ構造があると仮定します。これらのフォルダーには、約30.000種類のファイル.txt(私の場合はtype *.md)があります。これらの*.mdファイルの横に、追跡したくない500 GB(100万以上)のファイルがあるとします。

  2. すべてのフォルダとサブディレクトリ内の.txt(または*.md)ファイルのみをgitに追跡させたい

正解は次のとおりです。これはGitでは不可能です。

代わりに私がしたこと:

[編集:動作しませんでした-シンボリックリンク(またはハードリンク)を含むフォルダーを作成し、そこにgitを使用しようとしましたが、gitはシンボリックリンクをたどらず、ハードリンクを上書きしました。ド!]

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