108

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

次のディレクトリ構造があるとします。

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

これを置くことの違いは何ですか:

www

この?

www/*

私がこの質問をしている理由は次のとおりです。git では、ディレクトリが空の場合、git はそのような空のディレクトリをリポジトリに含めません。そのため、ディレクトリの下に追加の .gitkeep ファイルを追加して、空にならないようにするソリューションを試していました。その解決策を試していたとき、.gitignore ファイルの場合、次のように記述します。

www
!*.gitkeep

機能しません(私の意図は、wwwの下のすべてのコンテンツを無視することですが、ディレクトリを保持することです)。しかし、次のことを試してみると:

www/* 
!*.gitkeep

それはうまくいきます!したがって、2つのアプローチにはいくつかの違いがあるに違いないと思います。

4

4 に答える 4

203

www、 、 の間に違いがありwww/ますwww/*

基本的にドキュメントと私自身のテストからwww、ファイルまたはディレクトリとの一致を見つけ、ディレクトリwww/のみに一致し、www/*ディレクトリとファイル内のファイルに一致しますwww

との違いは明らかであるため、ここではwww/との違いについてのみ説明します。www/*wwwwww/

の場合、git はディレクトリ自体をwww/無視します。つまり、git は内部を調べません。wwwしかし、 の場合www/*、git は 内のすべてのファイル/フォルダーをチェックwwwし、パターンでそれらすべてを無視します*wwwすべての子ファイル/フォルダーが無視されると、git は空のフォルダーを追跡しないため、同じ結果になるようです。www/そして実際、OPの場合でもwww/*スタンドアロンでも結果に違いはありません。しかし、他のルールと組み合わせると違いが生じます。

たとえば、 のみを含めwww/1.txt、他のすべてを無視したい場合はどうwwwでしょうか?

以下.gitignoreは動作しません。

www/
!www/1.txt

以下.gitignoreは機能しますが、なぜですか?

www/*
!www/1.txt

前者の場合、git は directorywwwを無視するだけで、再度インクルードするために内部を調べることさえしませんwww/1.txt。最初のルールは親ディレクトリを除外しますwwwが、除外しないwww/1.txtため、 「再度含めるwww/1.txt」ことはできません。

しかし後者の場合、git は最初に の下wwwにあるすべてのファイル/フォラーを無視し、次にそのうちの 1 つを再び含めますwww/1.txt

この例では、ドキュメントの次の行が役立つ場合があります。

オプションのプレフィックス「!」パターンを否定します。以前のパターンによって除外された一致するファイルは、再び含まれるようになります。そのファイルの親ディレクトリが除外されている場合、ファイルを再インクルードすることはできません。

于 2014-09-08T02:45:26.453 に答える
1

ドットファイルを除くディレクトリ内のすべてを無視するには、次の glob-pattern を で使用できます.gitignore

www/[^.]*

したがって、余分な は必要ありません。ディレクトリにファイルを.gitignore追加するだけです。.keepwww

于 2014-09-09T22:25:44.627 に答える