63

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

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

tmp/*
公開/ドキュメント/**/*

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

4

6 に答える 6

63

これは、シェルの動作によって異なります。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

と組み合わせ***、フォルダツリー全体のファイルを照合します。

/a/**/z/*.pr0n
 matches        /a/b/c/z/d.pr0n
 matches        /a/b/z/foo.pr0n
 doesn't match  /a/b/z/bar.txt
于 2009-03-25T12:10:59.103 に答える
19

更新(2016年3月8日)

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


元の投稿

git**では特別な意味はありません。これはbash>=4.0の機能です。

shopt -s globstar

しかし、gitはbashを使用しません。gitが実際に何をするかを確認するには、git add -nvいくつかのレベルのサブディレクトリでファイルを試してみてください。

OPについては、ファイルについて考えられるすべての組み合わせを試しましたが、.gitignoreこれよりもうまく機能するものはありません。

public/documents/

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

public/documents/**/*.obj

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

于 2010-12-31T02:22:00.730 に答える
17

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

これは、例にファイル拡張子を追加する場合により意味があります。tmp内のログファイルを一致させるには、次のように入力します。

/tmp/*.log

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

/tmp/**/*.log

しかし、gitバージョン1.6.0.4とbashバージョン3.2.17(1)-リリースでテストすると、gitは**グロブをまったくサポートしていないようです。gitignoreの最新のマニュアルページにも**が記載されていないため、これは(1)非常に新しいか、(2)サポートされていないか、(3)システムのグロブの実装に何らかの形で依存しています。

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

tmp/*

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

/tmp

...これは単一のトップレベルのtmpディレクトリを無視します。tmpディレクトリを保持する必要がある場合は、その内容を無視して、各tmpディレクトリに空の.gitignoreファイルを配置し、gitが実際にディレクトリを作成するようにする必要があります。

于 2009-03-25T12:07:45.710 に答える
17

git1.8.2 のリリース ノートに次の**ように記載されているため、サブディレクトリ(**/bar

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

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


コミット 4c251e5cb5c245ee3bb98c7cedbe944df93e45f4を参照してください。

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

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

これは、" "、" "..に加えて " "も " **/foo" に一致させます。foox/foox/y/foo

署名者: Nguyễn Thái Ngọc Duy<pclouds@gmail.com>


サイモン・バカンも次のようにコメントしています。

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

.gitignoreマニュアルページには次のことが記載されています。

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

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

于 2013-02-18T07:33:41.417 に答える
5

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

public/documents/**/*

基本的に、スラッシュの間にある 2 つのワイルドカード項目を探しており、スラッシュ自体は取得しません。したがって、これは次のようになります。

public/documents/*/*
于 2011-06-02T18:42:35.210 に答える
2

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

tmp/**/*.log

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

*.log
于 2009-05-27T14:00:10.263 に答える