2016-01-20 7 views
13

私の現在のディレクトリの内容です。.gitignoreはどのパターンに従っていますか?

$ ls 
foo.foo 
$ ls -a 
. .. .bar.foo .foo foo.foo .gitignore 

次に、このディレクトリをgitリポジトリに変更します。

$ git init 
Initialized empty Git repository in /home/lone/foo/.git/ 
$ ls -a 
. .. .bar.foo .foo foo.foo .git .gitignore 

ここには.gitignoreの内容があります。

$ cat .gitignore 
*.foo 

.gitignoreのパターンは、シェルの同じパターンとは異なる動作をしています。シェル内では、*.fooは非隠しファイル、つまりピリオドで始まらないファイル名にのみ一致します。 .gitignore

$ echo *.foo 
foo.foo 

しかし*.foo.fooで終わるすべてのファイル、非表示または非表示でないと、一致しているようです。どこで、なぜその行動は、シェルのglobパターンとは異なる私が理解できるように、私は、次の.gitignoreパターンの正確な定義について詳しく学ぶことができ

$ git status 
On branch master 

Initial commit 

Untracked files: 
    (use "git add <file>..." to include in what will be committed) 

     .gitignore 

nothing added to commit but untracked files present (use "git add" to track) 

+3

ここにリソースがあります:https://git-scm.com/docs/gitignore。特定の条件下では、シェルグロブとまったく同じように扱われます。 "そうでなければ、GitはFNM_PATHNAMEフラグでfnmatch(3)が消費するのに適したシェルグロブとしてパターンを扱います"(しかし、そうでないときは上のものを読む) – hiandbaii

+0

@hiandbaiiこの質問をする前に、 。しかし、いくつかのことは私には分かりません。シェルはglobパターンを処理するために 'fnmatch(3)'も使用しますか?その場合、なぜ '* 'は' .'(つまり隠されたファイル)の前にゼロ文字とマッチしませんが、gitignoreはしますか?私はこれを説明している 'gitignore'ドキュメントの正確なセクションを見つけることができません。 –

答えて

9

gitignore使用は、glob convention次のパターンにワイルドカード:

GitはFNM_PATHNAME flagfnmatch(3)による消費に適したシェルグロブとしてパターンを扱いパス名に/と一致しません。

たとえば、「Documentation/*.html」は「Documentation/git.html」に一致しますが、「Documentation/ppc/ppc.html」または「tools/perf/Documentation/perf.html」には一致しません。

OP Lone Learnerin the commentsを尋ねる:

シェルはまた、globパターンを処理するためにfnmatch(3)を使用していますか?
その場合、なぜ*はゼロ文字に一致しないのですか? (つまり隠されたファイル)gitignoreはしますか?

これはshell configuration choiceです。 (specific to bashあるshoptを使用して、)

型:

shopt -s dotglob 
echo *.foo 
.foo foo.foo 

設定し、bashがfilename expansionの結果で '.' で始まるファイル名が含まれている場合dotglob

を使用しています。 (pattern matchingの場合)

3

.gitignoreには、希望するパターンのエントリが含まれています。tell git not track(ワイルドカードサポート)。

この設定は、フォルダレベルで保存されます。
無視するファイルを指定できます。
このファイルは、再帰的に内部のすべてのサブフォルダに適用されます。あなたがUNIXユーザであり、あなたは、あなたがするすべてのプロジェクトのためのすべての*.soファイルを無視したい場合には、たとえば(グローバル) -

  • System level

    .gitignoreは可換な方法で情報を収集していますグローバルファイルに配置してください

  • ローカル - 通常、指定されたプロジェクトのすべてのコンテンツを適用するプロジェクトレベルになります。

  • 毎のフォルダ - 指定したフォルダのための具体的な定義(例えば - 、パスワードファイルを無視し、ファイルなどや、あなたが無視したい他のリソースをログ)

構成プロパティもありますcore.excludesfile無視されたファイルも同様に使用するように設定できます。

git config --global core.excludesfile ~/.gitignore

また、使用することができる(whicワイルドカードの詳細下記読む)それは無視できないますので、ファイルの前!を追加することにより、を無視しないをファイルを指定することができます。

構文については、hereを参照してください。
3番目のツールを使用して、このファイルを生成することができます。gitignore.io


私がページで何を見つけることができませんでしたが*がゼロ以上の文字と一致し、ファイルの各行は、次のワイルドカードを持つ任意のパターンを含めることができますあまりにも

隠しファイルと一致していることを説明して:

?は=指定されたパターンのゼロまたは1つの発生に一致します。
* =指定したパターンが0回以上出現したときに一致します。
+ =与えられたパターンの1回以上の出現と一致します。
@ =指定されたパターンの1つに一致します。
! =指定されたパターン以外のものに一致します。


あなたのコメントでは、*パターンについての情報を求めました。

ここでは、*がすべてのファイルを無視していることがわかります。 Gitは隠しファイルかどうかは気にしません。一致したパターンを探しているだけです。

enter image description here

として、あなたは内側のフォルダを指定する必要があります内側のフォルダ内のファイルを無視したいので、もしあなたが.gitignoreファイルで供給パターンに一致するようにしようとgitの上に説明しました。ここでは、フォルダの内容のデモと内部ファイルを無視する方法を示します。内側のフォルダaaにはファイルが含まれていますが、ignoreファイルには**/というパターンが含まれているため、すべての内部フォルダとファイルは無視されます。 '*' の

enter image description here

+0

この質問をする前に、私はその文書を読みました。ページ中の '*'が0個以上の文字にマッチし、隠しファイルにもマッチすることを説明するものが見つかりませんでした。 –

+0

ワイルドカードアスタリスクの詳細を追加しました。何かがまだ不明であるかどうかお気軽にご相談ください – CodeWizard

+1

gitは、指定されたフォルダ構造(LinuxまたはWindows)のすべてのファイルを盗聴し、.gitignoreで明示的に無視されない限り、デフォルトでソース管理下に含めます。この場合、ルールは隠しフォルダと表示フォルダの両方に適用されます。 *はゼロ以上の文字にマッチするので個人的にはgitの仕様やドキュメントを読んでいないが、根本的なファイルシステムの動作、特にLinux上での動作から推測できるものがあると思う。 – Eniola