複数の `.gitignore`が眉をひそめていますか?


239

リポジトリが複数の独立したプロジェクトで構成されていない限り、.gitignoreさまざまなファイルよりも、リポジトリのルートにファイルを1つだけ置くのが最も簡単なようです。これに関するオンラインの標準的なベストプラクティスはありますか。一方のアプローチが他方よりも優れている場合のオンライン分析はありますか?

回答:


254

.gitignore異なる(サブ)ディレクトリーに複数のファイルが必要な状況が少なくとも2つ考えられます。

  • 異なるディレクトリには、無視するファイルの種類があります。たとえば.gitignore、プロジェクトの最上位ディレクトリにあるは生成されたプログラムをDocumentation/.gitignore無視し、生成されたドキュメントは無視します。

  • (あなたが使用できる唯一の特定の(サブ)ディレクトリ内の指定したファイルを無視/sub/foo.gitignoreかかわらず、)。

.gitignoreファイル内のパターンは、パターンに「/」が含まれていない限り、ファイルが存在する(サブ)ディレクトリとそのすべてのサブディレクトリに再帰的に適用されることに注意してください(たとえば、パターンnameは、ファイルに適用されname、指定されたディレクトリとそのすべてのサブディレクトリで指定/nameされたファイルに適用されます)指定されたディレクトリでのみこの名前で)。


1
ああ、何らかの理由で/Documentation/*.htmlがこれをカバーすると思っていましたが、*ワイルドカードは1つのレベルのディレクトリにのみ一致すると思います。
Conley Owens、

9
@ConleyOwens:最新のGitで使用できますDocumentation/**/*.html(スラッシュはパターンを固定します。これ/fooは、ファイルをディレクトリに直接固定するために使用されます)
JakubNarębski14年

97

接線の注記として、複数の.gitignoreファイルを持つ機能が非常に役立つ1つのケースは、作業コピーにコミットするつもりのない余分なディレクトリが必要な場合です。.gitignoreそのディレクトリに1バイト(アスタリスクを1つだけ含む)を置くだけで、そのディレクトリに表示されることはありませんgit status


4
「.git / info / exclude」ファイルを使用することもできます
Ayell

10
もちろん、リポジトリのルートから離れた場所にあるファイルを開く手間が気にならない場合は、パス全体をそのファイルに書き込み、ディレクトリを削除する場合は、エントリをクリーンアップすることを忘れないでください。それと比較してくださいprintf \* > .gitignore(ディレクトリを削除すると、クリーンアップは自動的に行われます)。私は.git/info/excludeより適切な選択である状況があると確信していますが、多くはありません。
アリストテレスパガルツィス2016年

はい、たとえばフォルダではなくファイルを除外したい場合:p
Ayell

4
私は「作業コピーに、コミットするつもりのない追加のディレクトリが必要な場合」と答えました。
アリストテレスPagaltzis 2016年

1
ルートの.gitignoreがすっきりするので、このアプローチはとても気に入っています。
デビッドA.グレイ

59

.gitignoreもちろん、それぞれを独自のディレクトリに置くことができます。
ファイルを無視する責任があるgitignoreルールを確認するには、次を使用しgit check-ignoreますgit check-ignore -v -- afile

また、.gitignoreブランチごとに異なるバージョンのファイルを使用することもできます。一方のブランチがファイルを無視し、もう一方のブランチがファイルを無視しないようにするためのこのような構成はすでに見ました。たとえば、この質問を参照してください。

リポジトリに複数の独立したプロジェクトが含まれている場合は、サブモジュールとして参照することをお勧めします。
これは実際のベストプラクティスであり.gitignore、グローバルな親プロジェクトの特定のリビジョンによって参照されているときに、それらのプロジェクトのそれぞれを(それぞれのファイルを使用して)独立して複製できます。
詳細については、サブモジュールの本質をご覧ください。


git 1.8.2(2013年3月)以降は、git check-ignore -v -- yourfileどのgitignore実行(どの.gitignoreファイルから)が ' yourfile'に適用されているかを確認し、そのファイルが無視される理由をよりよく理解できることに注意してください。
どのgitignoreルールがファイルを無視しているか?」を参照してください


17

プロシングル

  • 見つけやすい。

  • リポジトリ内のいくつかのレベルで複数のgitignoreを使用している場合、除外ルールを見つけるのは非常に困難です。

  • 複数のファイルを使用すると、通常、かなりの重複が発生します。

プロマルチ

  • スコープは、必要なファイルツリーの部分に「認識」します。

  • Gitはファイルのみを追跡するため、空の.gitignoreが「空の」ディレクトリをコミットする唯一の方法です。

    (Git 1.8より前は、のようなパターンを除外する唯一の方法は、パターンmy/**.exampleを使用my/.gitignoreしてを作成することでした**.foo。この理由は、今のようには適用できません/my/**/*.example。)


私はすべての除外を見つけることができる単一のファイルをはるかに好みます。ディレクトリごとの.svnを見逃したことはありません。また、ディレクトリごとの.gitignoreを見逃すこともありません。

とはいえ、複数のgitignoreが非常に一般的です。それらを使用する場合は、少なくともそれらの使用に一貫性を持たせて、作業に適したものにする必要があります。たとえば、ルートから1レベルだけのディレクトリに配置できます。


「空の.gitignoreは、「空の」ディレクトリをコミットする唯一の方法です。」実際には、1つのREADMEファイル(またはその件名の付いたファイルempty)をアップロードする方が一般的であることがわかりました。
Marc.2377

6
.gitkeepもこれを行うには良い方法です...もう1つの規則です。readmeファイルを使用するという考え方が気に入っています。そのread meファイルで、ディレクトリの用途を説明できるからです。
Gavin Pickin 2017年

8

あなたのGitのリポジトリになく、その中のファイルなしでディレクトリをコミットしたい多くのシナリオは、例えば、がありlogscacheuploadsディレクトリなど

だから私がいつもやっていることは.gitignore、次の内容でそれらのディレクトリにファイルを追加することです:

*
!.gitignore

この.gitignoreファイルを使用すると、Gitはこれらのディレクトリ内のファイルを追跡しませんが、.gitignoreファイルとディレクトリ自体をリポジトリに追加できます。

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