2009-06-19 18 views
57

私はgitでプロジェクトを追跡しています。作業コピーには、作業コピーにXcodeプロジェクトファイルがいくつかありますが、追跡する必要はありますが、diffファイルには表示したくありません。なぜなら、私が関心を持たない変更された行が常に数十個あるからです。git-diffはスキップします。これらのファイル?git-diffからファイルを除外する

 
$ cat .gitattributes 
Project.xcodeproj/* diff=nodiff 

$ cat ~/.gitconfig 
[diff "nodiff"] 
    command = /bin/true 

:しかし

 
$ git diff 
external diff died, stopping at Project.xcodeproj/zoul.mode1v3. 

は私が間違って何をやっている私は、カスタムの「サイレント」のdiffツールを設定しようとしましたか?

答えて

80

問題は/bin/trueは、その入力を読まずにすぐに戻るということです。したがって、かなり合理的に、早期に死亡したと考えています。

あなたが本当にやりたいことは、diff属性を設定解除して、偽のコマンドに設定しないことです。あなたの.gitattributesでこれを試してみてください:

Project.xcodeproj/* -diff 
+0

はい、これはうまくいきます、どうもありがとうございます。 – zoul

+5

多くのファイルが深いサブディレクトリにあるため、ディレクトリ全体を除外しても機能しませんでした。代わりに* .xcuserstate -diffは頻繁に変化するファイルを無視するのに役立ちました。 – Bemmu

+0

@Bemmu:公正であるために、私は質問と同じパターンを使用していました。元の尋問者の状況でパターンが機能していないという提案はありませんでした。 –

6

あなたが.git/configに

[alias] 
     mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*" 

でエイリアスを使用することができますあなたはこのトリックのために(patchutilsから)filterdiffを必要としています。

sudo apt-get install patchutils 

はまだdiffが完璧ではない、それはいくつかのゴミを残し:

[email protected]:~/git-filter-test$ git mydiff 
diff --git a/Project.xcodeproj/dummy.txt b/Project.xcodeproj/dummy.txt 
index 3e1f9e6..89dfed9 100644 
diff --git a/dummy2.txt b/dummy2.txt 
index 91966ce..d9588a9 100644 
--- a/titi.txt 
+++ b/titi.txt 
@@ -1,3 +1,3 @@ 
aaaaaaaaaa 
-bbbbbbbbb 
cccccc 
+ddd 
+0

これは非常にいいです、ありがとうございます。ゴミはちょうど良いです、少なくとも私はそれらのファイルが変更されたことを知っています。しかし、私は着色を失う、それを戻す方法はありますか?強制的にgit diff --colorを実行しようとしましたが、filterdiffはカラーエスケープで混乱してフィルタリングを停止します。 – zoul

+0

ああ、|コルディフ| less -r。 – zoul

+0

この質問への回答ありがとう - filterdiffは私のニーズをほぼ満たしていますが、残った "ゴミ"は私に問題を引き起こしています - filterdiffを使って "ファイルへのすべての参照を完全に削除する"と言う方法はありますか? – Michael

0

他の誰かが、私たちが持っていた同じ痛みを持っているだけで包み。 すでにコミットされているファイルを除外したかったのです。

この投稿は、道より有用であった: working with .git/info/exclude too late

具体的には、ファイルを無視するために必要なもののgitのrmhttp://www.kernel.org/pub/software/scm/git/docs/git-rm.html)を参照してください を削除するコマンドはgitを使用し、実際にある

あなたは行くことによってそれをテスト

git rm --dry-run *.log
(あなたはすべてを除外したいと言うならばログファイル)

は、実行した場合にはになります。

その後、

あなたは

git rm *.log
(または任意のファイル名パス/発現あなたがしたい)を行くことによってそれを実行

7

任意の外部ツールなしでクリーンな出力を生成別の解決策(追加〜.git/config):

[alias] 
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/") 
変更されたファイルのみが含まれますので、それは、 git diffへのファイルの短いリストを渡しますので git diff --name-onlygit ls-filesよりも優れていることを

git mydiff 

注:

はその後でそれを実行します。 git ls-filesを使用すると、大きなプロジェクトで最大の引数数を超える問題に遭遇しました。

+0

これで複雑なパスで問題が発生しました。私はあなたが-zスイッチを使った方が良いだろうと思う:「パス名をmungeしてNULを出力フィールドターミネータとして使用しないでください」 –

関連する問題