否定パターンは.gitignoreでどのように機能しますか?


93

否定パターン(!で始まる行)で.gitignoreファイルを使用しようとしていますが、期待どおりに機能していません。

最小限の例として、私は次のディレクトリ構造を持っています:

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

そして私のgitignoreファイルには、これがあります:

aaa/
!aaa/ccc/

私の理解(このdocページに基づく)は、ファイルaaa / ccc / otherfile.txtは無視すべきではないということですが、実際にはgitはaaaの下のすべてを無視しています。

この文を誤解していますか:「オプションの接頭辞!はパターンを無効にします。以前のパターンによって除外された一致するファイルは再び含まれます。」

ところで、これはmsysgit 1.7.0.2がインストールされたWindows上にあります。

回答:


159

あなたが実際にやりたいことは、

aaa/*
!aaa/ccc

「見ないで」と言っているaaaので、パスを調べることすらありませんaaa/ccc。ワイルドカードを使用した場合でも、の内容が読み取られ、aaa各エントリはワイルドカードに一致して無視さaaa/cccれます。


2
@iconoclast:では、おそらく別のことをしているでしょう。ヘルプが必要な場合は、別の質問を(完全な情報とともに)投稿してください。
Cascabel 2012

これも私にはうまくいきませんでした:/ apps / *!/ apps / myApps / FluidTest / bin /
Jarrod Smith

5
@Jarrod動作します。何か違うことをしているだけです。答えに示されている理由から、このメソッドを再帰的に使用する必要があります。!apps / myApps、apps / myApps / *など。
Cascabel 2013年

ああごめんなさい、今分かりました。しかし、私は再び賛成することはできません。
ジャロッドスミス

!それは、AAA / ** / * AAA / CCC / EEE(特定のパスでファイルを除くすべてのものを、無視する)のための作業をしない理由ワンダー
フオングエン

21

内のすべてを除外しaaaaaa/cccその下にすべてを含めたい場合は、以下を使用する必要があります。

aaa/*
!aaa/ccc
!aaa/ccc/*

1行目はgitに下のすべてを無視するようにaaa指示し、2行目はaaa/ccc実際に3行目を「有効にする」フォルダーを無視しないように指示し、3行目は下にあるすべてを無視しないように指示しますaaa/ccc


1
3行目は私には違いがありませんでした。
ジェームズホプキン2014

3
aaa/cccすべてのレベルのサブディレクトリにすべてを含めることができるようにするために、私のために機能したのは!aaa/ccc/**代わりに!aaa/ccc/*
boclodoa '16

3

git status実行中のgit update-index事前確認でまだ無視されていないアイテムがまだ表示されない場合は、gitが変更を確認するのに役立ちます(少なくともgitbashのバージョン1.9.xの場合)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.