テキストファイルのみのホワイトリストを作成しました。
*
!*.txt
今、私はサブディレクトリに追跡されていないテキストファイルを持っています- sub/dir/file.txt、これは表示されません(無視されます)。ただし、ルートディレクトリのテキストファイルは表示されます。
なぜですか、どうすれば修正できますか?
テキストファイルのみのホワイトリストを作成しました。
*
!*.txt
今、私はサブディレクトリに追跡されていないテキストファイルを持っています- sub/dir/file.txt、これは表示されません(無視されます)。ただし、ルートディレクトリのテキストファイルは表示されます。
なぜですか、どうすれば修正できますか?
.gitignore。
回答:
そのようにしようとすると、構造内のディレクトリがブラックリストに登録されるため、失敗します。
解決するには、ディレクトリではなく、コミットするファイルの種類ではないすべてのものをブラックリストに登録し、ディレクトリをブラックリストに登録しないようにします。
.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)からのものでした。
!.gitignore、を使用する場合は、エントリも必要*です。
/*実際に手段がこれ、再帰的にすべてのフォルダだけで最上位のフォルダをブラックリストに載せるはなく、.gitignoreホワイトリスト、フォルダのサブフォルダに見てはいけません。
これを実現する簡単な方法は次のとおりです。
# 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」などと一致します。
重要なのは、他のルールに関係なく、そのディレクトリ内のすべてのファイルが無視されるため、ディレクトリを無視しないようにすることです。
私は長い間探しました:
再帰的にネストされた〜100.000のディレクトリを持つ大きなフォルダ構造があると仮定します。これらのフォルダーには、約30.000種類のファイル.txt(私の場合はtype *.md)があります。これらの*.mdファイルの横に、追跡したくない500 GB(100万以上)のファイルがあるとします。
すべてのフォルダとサブディレクトリ内の.txt(または*.md)ファイルのみをgitに追跡させたい
正解は次のとおりです。これはGitでは不可能です。
代わりに私がしたこと:
[編集:動作しませんでした-シンボリックリンク(またはハードリンク)を含むフォルダーを作成し、そこにgitを使用しようとしましたが、gitはシンボリックリンクをたどらず、ハードリンクを上書きしました。ド!]