web-dev-qa-db-ja.com

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

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

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

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

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

www

この?

www/*

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

www
!*.gitkeep

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

www/* 
!*.gitkeep

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

108
Aaron Shen

www、_www/_、_www/*_には違いがあります。

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

wwwと_www/_の違いは明らかなので、ここでは_www/*_と_www/_の違いについてのみ説明します。

_www/_の場合、gitはディレクトリwww自体を無視します。つまり、gitは内部を見ることさえできません。ただし、_www/*_の場合、gitはwww内のすべてのファイル/フォルダーをチェックし、パターン_*_のすべてのファイル/フォルダーを無視します。すべての子ファイル/フォルダーが無視された場合、gitは空のフォルダーwwwを追跡しないため、同じ結果が得られるようです。確かに、結果は、スタンドアロンの_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_を再び「included」。

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

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

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

201
Landys

私は単にドキュメントを解析していますが、私が知る限り、それらはより高度なパターンでのみ異なります。

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

I did上記をテストし、!/foo with !/foo/*、実際には異なる結果が得られます。

注意

foo

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

foo/

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

8
djechlin

すでに入手した完全に良い答えとは別に、サブフォルダーを含むプロジェクトのどこにでも.gitignoreを置くことができることに注意する必要があります。

したがって、空の.gitkeep.dummyまたは任意の名前を使用する代わりに、www内のすべてのファイルを無視し、wwwフォルダーをバージョン管理する場合は、 .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

このように、すべてがより組織的に見えます(少なくとも私には)。

3

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

www/[^.]*

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

1
Koen.