2017-09-01 18 views
1

フォルダ構造:.gitignoreディレクトリ/ワイルドカード予期しない動作

.git/ 
    <some git stuff> 
.gitignore 
level1/ 
    level2/ 
     file1 
     file2 

ファイル.gitignorefile1、およびfile2はすべて空です。 git add .gitignoregit commit -m "create empty .gitignore"を実行します。 .gitignoreがemtpyある場合

は、git status出力(予想通り)に続いてgit add -A

だから、
new file: level1/level2/file1 
new file: level1/level2/file2 

、I git reset.gitignoreへの変更の結果をテストを開始するには(私はそれぞれの間でこれを行うと仮定します.gitignore

.gitignoreが含まれている場合のいずれかlevel1level1/level1/*level2、またはへの変更を、以下の.gitignore次いでgit add -Alevel2/*含まれている場合git status出力続いて、

modified: .gitignore 

しかし:

modified: .gitignore 
new file: level1/level2/file1 
new file: level1/level2/file2 

なぜlevel2/*が同じを持っていないは、次いで、git add -A(予想通り)git status出力続いこの場合はlevel2/と表示されますか?また、level2/*は、がありませんが、私が欲しいのは、**/level2/*です。です。 gitignore documentation 1として

答えて

1

1)のパターンがスラッシュで終わっている場合、それが唯一のディレクトリと一致するものを見つけるだろう。

2)パターンにスラッシュ/が含まれていない場合、Gitはこれをシェルグロブパターンとして扱い、.gitignoreファイルの場所を基準にしたパス名との一致をチェックします(作業ツリーのトップレベル.gitignoreファイルからではない場合)。

3)そうでない場合、GitはパターンをFNM_PATHNAMEフラグを持つfnmatch(3)が消費するのに適したシェルグロブとして扱います。パターンのワイルドカードはパス名の/と一致しません。たとえば、 "Documentation/*。html"は "Documentation/git.html"と一致しますが、 "Documentation/ppc/ppc.html"や "tools/perf/Documentation/perf.html"とは一致しません。

パターンlevel2/*は、3番目のケースに該当します。ディレクトリlevel2がプロジェクトのルートにないので、gitはlevel1/level2/のファイルを無視しません。

だからこそ**/level2/*が機能し、なぜlevel2/level2が機能するのですか。