Gitがディレクトリとdirectory / *を無視することの違いは何ですか?


108

gitのディレクトリの内容を無視する正しい方法は何ですか?

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

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

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

www

この?

www/*

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

www
!*.gitkeep

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

www/* 
!*.gitkeep

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


間の単純な差binとは、bin/前者がファイルやフォルダ、後者のフォルダだけを無視するということです。私は違いを知りませんbin/*
パニック大佐

回答:


203

そこの違いをしているwwwwww/www/*

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

私は唯一の間の差異に説明しますwww/www/*の間の違いから、ここwwwとはwww/明白です。

の場合www/、gitはディレクトリwww自体を無視します。つまり、gitは内部を調べません。しかしの場合www/*、gitは内のすべてのファイル/フォルダーをチェックwwwし、パターンでそれらのすべてを無視します*wwwすべての子ファイル/フォルダーが無視された場合、gitは空のフォルダーを追跡しないため、同じ結果が得られるようです。そして実際の結果は、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、次にそれらの1つを再び含めwww/1.txtます。

この例では、ドキュメントの次の行が役立ちます。

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


2番目のアプローチと同じことwww/1.txtをすると思いませんか?www/
Naveed Butt

8

私はドキュメントを解析しているだけであり、私が知る限り、それらはより高度なパターンでのみ異なる、例えば

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

上記をテストしましたが、に置き換える!/foo!/foo/*、実際に異なる結果が得られます。

注意

foo

すべてのファイルを除外しますfooが、

foo/

fooという名前のディレクトリのみを除外します。


3

すでに取得した完全に良い答えは別として、.gitignoreサブフォルダーを含め、プロジェクトのどこにでも配置できることに注意してください。

したがって、内のすべてのファイルを無視したいが、空の、または選択した名前を使用する代わりに、バージョン管理www対象のwwwフォルダーを使用したい場合は、そこに使用しないで、すべてのファイルを無視するように指示しますか?.gitkeep.dummy.gitignore

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

ルート.gitignore(a)では、wwwフォルダーやその内容について何も言わないでください。

ではwww/.gitignore(b)は次のように置きます:

# ignore all files in this folder except this .gitignore
*
!.gitignore

この方法では、すべてがより整理されたように見えます(少なくとも私には)。


1

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

www/[^.]*

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

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