Gitのディレクトリの内容を無視する正しい方法は何かについて混乱しています。
次のディレクトリ構造があると仮定します。
my_project
|--www
|--1.txt
|--2.txt
|--.gitignore
これを置くことの違いは何ですか:
www
この?
www/*
私がこの質問をしている理由は:gitでは、ディレクトリが空の場合、gitはそのような空のディレクトリをリポジトリに含めません。そのため、ディレクトリの下に余分な.gitkeepファイルを追加して、空にならないようにするソリューションを試していました。私がその解決策を試していたときに、.gitignoreファイルにある場合、次のように書きます:
www
!*.gitkeep
それは機能しません(私の意図は、wwwの下のすべてのコンテンツを無視するが、ディレクトリを保持することです)。しかし、私が次を試してみると:
www/*
!*.gitkeep
その後、動作します!したがって、2つのアプローチにはいくつかの違いがあると思います。
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
_を再び含めます。
この例では、ドキュメントの次の行が役立ちます。
オプションのプレフィックス「!」パターンを無効にします。以前のパターンで除外された一致するファイルは再び含まれます。そのファイルの親ディレクトリが除外されている場合、ファイルを再インクルードすることはできません。
私は単にドキュメントを解析していますが、私が知る限り、それらはより高度なパターンでのみ異なります。
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
I did上記をテストし、!/foo
with !/foo/*
、実際には異なる結果が得られます。
注意
foo
ファイルfoo
を除外しますが、
foo/
fooという名前のディレクトリのみを除外します。
すでに入手した完全に良い答えとは別に、サブフォルダーを含むプロジェクトのどこにでも.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
このように、すべてがより組織的に見えます(少なくとも私には)。
ドットファイルを除くディレクトリ内のすべてを無視するには、.gitignore
で次のglob-patternを使用できます。
www/[^.]*
したがって、余分な.gitignore
は必要ありません。単に.keep
ファイルをwww
ディレクトリに追加するだけです。