92

Git リポジトリ内の .gitignore ファイル/dirとの間に違いはありますか?/dir/

以下の違いは何ですか?

/dir
/dir/
/dir/*
4

3 に答える 3

94

これは古い質問ですが、Google で上位にランクされており、投票数の多い回答は間違っています。ここに正解が入ります。

はい、これらのルールは異なります。

  • /dirファイル、ディレクトリ、リンク、名前が付けられたものすべてに一致しますdir
  • /dir/という名前のディレクトリのみに一致しますdir
  • /dir/*指定されたディレクトリ内のすべてのファイル、ディレクトリ、およびその他のものに一致しますdir(ただし、dirディレクトリ自体には一致しません)。

/dir/dir/および/dir/*は同等ではありません。!.gitkeep 空のディレクトリを追跡するという制限を回避するために有名なように、上書きルールを使用すると、違いは非常に明確です。ファイルの存在を仮定するdir/.gitkeep

  • と を使用する/dir/dir/、Git はディレクトリ内を調べないため、は表示され.gitkeepません。
  • では/dir/*、ファイルは Git によって検出され、これ.gitkeepがコミットされている場合はディレクトリが保持されます。ルールはディレクトリ自体には適用されず、その内容にのみ適用されるためです。

観測:上記のすべてのルールは、プレフィックス.gitignoreのために、現在のディレクトリ (がある場所) に固定されています。/プレフィックスがないと、ルールはその特定のディレクトリだけでなく、サブディレクトリまたはリポジトリ内のすべての場所 (.gitignoreルート レベルにある場合) にも適用されます。

于 2016-07-25T04:12:22.173 に答える
32

パターンにはさまざまな意味があります

gitignore(5)のパターン形式セクションによると:

  • パターンがスラッシュで終わる場合、次の説明のために削除されますが、ディレクトリとの一致のみが検出されます。つまり、foo/ はディレクトリ foo とその下のパスに一致しますが、通常のファイルやシンボリック リンク foo には一致しません (これは、git での pathspec の一般的な動作と一致しています)。

  • パターンにスラッシュ / が含まれていない場合、git はそれをシェル glob パターンとして扱い、.gitignore ファイルの場所に相対的なパス名 (.gitignore からでない場合は作業ツリーのトップレベルに相対的) との一致をチェックします。ファイル)。

これが意味することは、「dir」はファイル、ディレクトリ、またはシンボリック リンクのいずれかですが、末尾にスラッシュがある「dir/」はディレクトリにのみ一致するということです。ほとんどの場合、違いは問題になりませんが、違いがある場合は、違いを理解することで .gitignore ファイルからあいまいさを取り除くことができます。

于 2013-07-26T18:49:53.997 に答える
4

Git 2.23 (2019 年第 3 四半期) は、gitignore パターンのスラッシュに関する説明を改良しようとしています (「このレベルのみにアンカーされている」や「ディレクトリのみに一致する」などを示すために使用されます)。

ドキュメントには次のものが含まれるようになりました。

  • スラッシュ ' /' は、ディレクトリ セパレータとして使用されます。区切り文字は、検索パターン
    の最初、中間、または最後に発生する可能性があります。.gitignore

  • パターンの先頭または中間 (またはその両方) に区切り文字がある場合、パターンは特定の.gitignoreファイル自体のディレクトリ レベルに関連しています。
    そうしないと、パターンはレベルより下の任意のレベルでも一致する可能性があり.gitignoreます。

  • パターンの最後に区切り文字がある場合、パターンはディレクトリのみに一致します。それ以外の場合、パターンはファイルとディレクトリの両方に一致します。

  • たとえば、パターンはディレクトリにdoc/frotz/一致しますdoc/frotzが、ディレクトリには一致しませんa/doc/frotz
    ただし、frotz/一致frotzし、a/frotzそれはディレクトリです(すべてのパスは.gitignoreファイルからの相対パスです)。

  • アスタリスク " *" は、スラッシュ以外のすべてに一致します。
    文字「?」は、「 」以外の任意の 1 文字に一致します/
    範囲表記、たとえば[a-zA-Z]を使用して、範囲内の文字の 1 つに一致させることができます。
    詳細な説明については、fnmatch(3) およびFNM_PATHNAMEフラグを参照してください。

于 2019-06-21T23:40:57.220 に答える