web-dev-qa-db-ja.com

.gitignoreファイルのパスの違いは?

私はgitを使用していますが、まだ。gitignoreファイルパスについて混乱しています。

では、。gitignoreファイルの次の2つのパスの違いは何ですか?

 tmp /*
 public/documents /**/*

tmp/*は、その中のすべてのファイルとフォルダーを無視します。私は正しいですか?しかし、その2行目のパスはどういう意味ですか?

55
Autodidact

これは、シェルの動作に依存します。 Gitはこれらの拡張方法を決定する作業を行いません。一般に、 *は、単一のファイルまたはフォルダーに一致します。

/a/*/z
 matches        /a/b/z
 matches        /a/c/z
 doesn't match  /a/b/c/z

**は、フォルダーの任意の文字列に一致します。

/a/**/z
 matches        /a/b/z
 matches        /a/b/c/z
 matches        /a/b/c/d/e/f/g/h/i/z
 doesn't match  /a/b/c/z/d.pr0n

結合** with *フォルダーツリー全体のファイルを照合するには:

/a/**/z/*.pr0n
 matches        /a/b/c/z/d.pr0n
 matches        /a/b/z/foo.pr0n
 doesn't match  /a/b/z/bar.txt
55
John Feminella

更新(2016年3月8日)

今日、私は_**_が主張どおりに動作しないマシンを見つけることができません。これには、OSX-10.11.3(El Capitan)およびUbuntu-14.04.1(Trusty)が含まれます。おそらく更新されたgit-ignore、またはおそらく最近のfnmatchは、人々が期待するように_**_を処理します。したがって、受け入れられた答えは実際には正しいようです。


元の投稿

_**_はgitでは特別な意味を持ちません。これは、bash> = 4.0の機能です。

_shopt -s globstar_

しかし、gitbashを使用しません。 gitが実際に行うことを確認するには、_git add -nv_とサブディレクトリのいくつかのレベルのファイルを試してください。

OPについては、_.gitignore_ファイルについて考えられるすべての組み合わせを試しましたが、これ以上の効果はありません。

_public/documents/_

以下は、誰もが考えていることをしていません:

_public/documents/**/*.obj_

私は何を試してもそれを機能させることはできませんが、少なくとも gitdocs と一致しています。 _.gitignore_に人々がそれを追加すると、_.obj_ファイルが正確に1つのサブディレクトリの深さであるという理由だけで、それが偶然に動作すると思います。おそらく、bashスクリプトから二重アスタリスクをコピーしたでしょう。しかし、おそらくfnmatch(3)がbashのように二重アスタリスクを処理できるシステムがあります。

16
cdunn2001

Bash 4などのシェルを使用している場合、**は基本的に*の再帰バージョンであり、任意の数のサブディレクトリに一致します。

サンプルにファイル拡張子を追加する場合、これはより理にかなっています。 tmp内のログファイルをすぐに一致させるには、次のように入力します。

/tmp/*.log

Tmpのサブディレクトリ内の任意の場所にあるログファイルを照合するには、次のように入力します。

/tmp/**/*.log

しかし、gitバージョン1.6.0.4およびbashバージョン3.2.17(1)-releaseでテストすると、gitは** globをまったくサポートしていないようです。 gitignoreの最新のmanページ も**について言及していないため、これは(1)非常に新しい、(2)サポートされない、または(3)システムのグロビングの実装に何らかの形で依存する。

また、あなたの例では微妙なことが起こっています。この式:

tmp/*

...実際には、「ソースツリー内の任意のファイルinsidetmpディレクトリを無視しますが、tmpディレクトリ自体は無視しない」という意味です。通常の状況では、おそらく次のように書くだけです。

/tmp

... 1つの最上位tmpディレクトリを無視します。 tmpディレクトリをその中身を無視して保持する必要がある場合、各tmpディレクトリに空の.gitignoreファイルを配置して、gitが実際にディレクトリを作成することを確認する必要があります。

15
emk

'**'をサブディレクトリと組み合わせた場合**/bar)は、デフォルトの動作から変更されている必要があります。 git1.8.2のリリースノート が言及されました:

.gitignoreおよび.gitattributesファイルのパターンには、サブディレクトリの0以上のレベルに一致するパターンとして**/を含めることができます。

例えば。 「foo/**/bar」は、「bar」自体または「foo」のサブディレクトリ内の「foo」と一致します。


commit 4c251e5cb5c245ee3bb98c7cedbe944df93e45f4 を参照してください:

foo/**/bar」は「foo/x/bar」、「foo/x/y/bar」と一致しますが、「foo/bar」とは一致しません。
foo/**/が検出された場合(および "foo/"部分がすでに一致している場合)、特別なケースを作成し、 "bar"を残りの文字列と一致させます。

「1つまたは複数のディレクトリに一致する」セマンティクスは、「foo/*/**/bar」を使用して簡単に実現できます。

これにより、「**/foo」、「x/foo」に加えて、「x/y/foo」が「foo」に一致します。

サインオフ:NguyễnTháiNgọcDuy <[email protected]>


Simon Buchan また コメント付き

現在のドキュメント( .gitignore manページ )は、サブディレクトリが不要であることを明確に示しています。x/**は(おそらく空の)xの下にあるすべてのファイル

.gitignoreのmanページには次の記述があります:

末尾の「/**」は内部のすべてに一致します。たとえば、「abc/**」は、ディレクトリ「abc」内のすべてのファイルと、.gitignoreファイルの場所に関連して、深さが無限に一致します。

スラッシュの後に2つの連続したアスタリスクが続き、スラッシュはゼロ個以上のディレクトリに一致します。たとえば、「a/**/b」は「a/b」、「a/x/b」、「a/x/y/b」などに一致します。

14
VonC

**がサポートされていない場合、「/」は本質的にワイルドカードの終了文字であるため、次のような場合があります。

public/documents/**/*

基本的に、スラッシュの間にある2つのワイルドカードアイテムを探しており、スラッシュ自体は取得しません。したがって、これは次と同じです。

public/documents/*/*
5
Hazok

私にはうまくいきませんが、そのサブディレクトリに新しい.gitignoreを作成できます:

tmp/**/*.log

tmp.gitignoreに置き換えることができます:

*.log
2
sebastien