Git リポジトリ内の .gitignore ファイル/dir
との間に違いはありますか?/dir/
以下の違いは何ですか?
/dir
/dir/
/dir/*
これは古い質問ですが、Google で上位にランクされており、投票数の多い回答は間違っています。ここに正解が入ります。
はい、これらのルールは異なります。
/dir
ファイル、ディレクトリ、リンク、名前が付けられたものすべてに一致しますdir
/dir/
という名前のディレクトリのみに一致しますdir
/dir/*
指定されたディレクトリ内のすべてのファイル、ディレクトリ、およびその他のものに一致しますdir
(ただし、dir
ディレクトリ自体には一致しません)。/dir
、/dir/
および/dir/*
は同等ではありません。!.gitkeep
空のディレクトリを追跡するという制限を回避するために有名なように、上書きルールを使用すると、違いは非常に明確です。ファイルの存在を仮定するdir/.gitkeep
/dir
と/dir/
、Git はディレクトリ内を調べないため、は表示され.gitkeep
ません。/dir/*
、ファイルは Git によって検出され、これ.gitkeep
がコミットされている場合はディレクトリが保持されます。ルールはディレクトリ自体には適用されず、その内容にのみ適用されるためです。観測:上記のすべてのルールは、プレフィックス.gitignore
のために、現在のディレクトリ (がある場所) に固定されています。/
プレフィックスがないと、ルールはその特定のディレクトリだけでなく、サブディレクトリまたはリポジトリ内のすべての場所 (.gitignore
ルート レベルにある場合) にも適用されます。
gitignore(5)のパターン形式セクションによると:
パターンがスラッシュで終わる場合、次の説明のために削除されますが、ディレクトリとの一致のみが検出されます。つまり、foo/ はディレクトリ foo とその下のパスに一致しますが、通常のファイルやシンボリック リンク foo には一致しません (これは、git での pathspec の一般的な動作と一致しています)。
パターンにスラッシュ / が含まれていない場合、git はそれをシェル glob パターンとして扱い、.gitignore ファイルの場所に相対的なパス名 (.gitignore からでない場合は作業ツリーのトップレベルに相対的) との一致をチェックします。ファイル)。
これが意味することは、「dir」はファイル、ディレクトリ、またはシンボリック リンクのいずれかですが、末尾にスラッシュがある「dir/」はディレクトリにのみ一致するということです。ほとんどの場合、違いは問題になりませんが、違いがある場合は、違いを理解することで .gitignore ファイルからあいまいさを取り除くことができます。
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
フラグを参照してください。