1. ホーム
  2. git

[解決済み] Gitが無視するdirectoryとdirectory/*の違いは何ですか?

2022-11-30 22:06:51

質問

gitでディレクトリの内容を無視するための正しい方法について混乱しています。

私が以下のようなディレクトリ構造を持っていると仮定します。

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

これを置くと何が違うのか。

www

そして、これは?

www/*

この質問をする理由は、gitでは、ディレクトリが空の場合、gitはそのような空のディレクトリをリポジトリに含めないからです。そこで、ディレクトリの下に追加の.gitkeepファイルを追加して、空にならないようにする、という解決策を試していました。その際、.gitignore ファイルに以下のように記述しています。

www
!*.gitkeep

これはうまくいきません(私の意図は、www以下のすべてのコンテンツを無視し、ディレクトリを維持することです)。しかし、私は以下を試してみてください。

www/* 
!*.gitkeep

とすると、うまくいくのです。ということは、この2つのアプローチには何らかの違いがあるのでしょう。

どのように解決するのですか?

www , www/www/* .

から基本的に ドキュメント と私自身のテストからです。 www はファイルやディレクトリとのマッチを見つけます。 www/ はディレクトリにのみマッチし、一方 www/* の中のディレクトリとファイルにマッチします。 www .

の違いについてだけ説明します。 www/www/* の違いから、ここでは wwwwww/ は明らかです。

については www/ の場合、git はディレクトリを無視します。 www を無視します。つまり、git は中を見ようともしません。しかし www/* の中にあるすべてのファイルやフォルダーをチェックします。 www の中にあるすべてのファイルやフォルダをチェックし、パターン * . git は空のフォルダを追跡しないので、これは同じ結果になるようです。 www を追跡しないからです。そして実際、OPのケースと同じように www/ または www/* を単独で使用することができます。しかし、他のルールと組み合わされた場合は違いが生じます。

例えば、もし私たちが単に www/1.txt のみを含み、それ以外は無視したい場合はどうでしょう。 www ?

次のような .gitignore は動作しません。

www/
!www/1.txt

一方、以下の .gitignore は動作しますが、なぜでしょうか?

www/*
!www/1.txt

前者の場合、git はディレクトリを無視して www というディレクトリを無視し、その中を探そうともしません。 www/1.txt を再びインクルードするために内部を探すことさえしません。最初のルールは、親ディレクトリである www を除外しますが www/1.txt となり、結果的に www/1.txt は " になり得ない。 が再び含まれる "。

しかし、後者の場合、git は最初に www の下にあるすべてのファイルやフォルダを無視し、そのうちのひとつを再びインクルードします。 www/1.txt .

この例では、ドキュメントの次の行が参考になるでしょう。

オプションの接頭辞 "!" は、パターンを否定します。 前のパターンによって除外されたマッチするファイルは、再び含まれるようになります。ただし そのファイルの親ディレクトリが除外されている場合、そのファイルを再び含めることはでき を除外することはできません。