gitignoreで先行スラッシュを使用する場合


108

私は.gitignore構文をより明確に理解しようとしています。特にhttps://github.com/github/gitignore gitignoresに関する限りです。

先頭のスラッシュを使用して、.gitignoreファイルの場所(http://git-scm.com/docs/gitignoreからの相対パス)のみに一致することがわかります。

先頭のスラッシュはパス名の先頭と一致します。たとえば、「/ *。c」は「cat-file.c」と一致しますが、「mozilla-sha1 / sha1.c」とは一致しません。

しかし、先頭のスラッシュを削除するとどうなりますか?私が理解した限りでは、2つのケースがあります。

  1. パターンにスラッシュが含まれていない場合(または末尾のスラッシュのみが含まれている場合、つまりディレクトリと一致する必要がある場合)、検索はディレクトリツリー全体で実行されます。例えば、パターンがdir/一致する<root>/dir<root>/a/dir<root>/a/b/c/.../dir、など、どこ<root>の場所である.gitignoreファイル。
  2. パターンにスラッシュが含まれていて、それが末尾位置にない(最後の文字ではない)場合は、.gitignoreファイルの場所に関連するパス名とのみ一致します。

これらは私がこの行動をチェックするために作った例です:

# Directory structure:
<root>
├─ dir/
│   └─ test
├─ src/
│   ├─ dir/
│   │   └─ test
test file is there only because Git does not track empty directories.

最初のテスト:

# .gitignore
dir/

# git status
nothing to commit

したがって、Gitは両方のdirディレクトリを無視しています。これはケース番号1と一致します。パターンにはスラッシュがありません(末尾のスラッシュを除く)。そのため、Gitはパターンに一致するすべてを無視して、ディレクトリツリー全体を監視しています。

2番目のテスト:

# .gitignore
/dir/

# git status
Untracked files:
    src/

ここでdirは、パターンの先頭のスラッシュのおかげで、Gitはルートディレクトリの直下のディレクトリのみを無視しています。

3番目のテスト:

# .gitignore
dir/*

# git status
Untracked files:
    src/

これは、ケース番号2と一致します。パターンには、スラッシュが含まれているため、ルートディレクトリから始まるパス名と見なされます。

本当の質問の時間です。このgitignoreファイルについて考えてみましょう。downloader/たとえば、ディレクトリを無視した場合、実際downloaderには、ディレクトリツリー全体で見つかったすべてのディレクトリを無視していませんか?これは、以前にGitの動作について見たものから、私が考えさせられていることです。

それで、downloader中にディレクトリが含まれるカスタムモジュールがある場合、Magentoのルートにある通常のモジュールと同様に、予期せず無視されますか?これは実際にはすでに起こっており、バグを見つけるのが非常に難しいため、これはちょっと考え直しの質問です。

だから、Magentoの中.gitignore、彼らは正しくルートから始まるパス名と照合されているので、多くのパターンは、スラッシュが含まれていますが、いくつかのケースは、などがある(私はところで、一例としてのみに言及しています)ファイルdownloader/またはerrors/こと、私が誤っていない場合、潜在的に危険であり、おそらくとに変更する必要が/downloader/あり/errors/ます。

より一般的な質問として、ルートから明示的に開始するパス名を選択し、スラッシュを含むパターンに使用しない場合は、スラッシュを含まないパターン(後続のものを除く)に常に先頭のスラッシュを使用するか、または明確にするために常に先頭のスラッシュを使用しますか?あなたはそれについてどう思いますか?

長い記事をお読みいただき、誠にありがとうございます。


8
素晴らしい質問と本当に素晴らしい説明、私もこれに悩まされました、そしてあなたの研究は私に物事を明確にしました。これを読んだ後、ルートから開始する必要がある場合は常にスラッシュでパスを開始することをお勧めします。これにより、意図がより明確になります。
Martinsos 2014年

4
おかげで:)意図をより明確にするためにスラッシュを使用することについてのあなたのメモに同意します。
スワニー2014年

8
これは.gitignoreドキュメントの一部である必要があります。はるかに理解しやすい!
rmorrin

私は...質問と回答のセクションに分かれて、この偉大なポストを見てみたい
Barett

回答:


25

簡単な将来の参照のために要約したかっただけです-先頭のスラッシュは一致をルートに固定します。したがって、以下の例では、スラッシュがない場合、ワイルドカードはfoo内のすべてを除外します。これは、ワイルドカードを使用*してツリーを再帰的に移動するためです。ただし、では/*、フォルダーfooとその内容を除くすべてが除外されます。

$ cat .gitignore
/*
!/foo

24

あなた自身の質問に完全に答えました。github / gitignoreリポジトリをさらに詳しく見ると、ほとんどのファイルでパターンの記述方法に一貫性のないルールが使用されていることがわかります。ほとんどの場合、あなたが行ったようにドキュメントを読んだり、物事をテストしたりしなかった人々によって寄贈された可能性が非常に高いです。

だからそれが役立つ場合:あなたが正しい、自信を持っている。

このような共同プロジェクトで間違いを見つけた場合は、遠慮なく知識を提供してください。さらに自信を深める必要がある場合にも、前例があります。

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