2012-05-02 61 views
100

我想從Git diff中排除文件(db/irrelevant.php)。我試圖把文件放在db的子目錄.gitattributes與行irrelevant.php -diff 我也試過創建一個名爲.git/info/attributes包含db/irrelevant.php的文件。想要從「git diff」中排除文件

在所有情況下,db/irrelevant.php文件都作爲Git二進制補丁包含在diff中。我想要的是該文件的更改被diff命令忽略。我究竟做錯了什麼?

回答

93

OMG,司機並awk排除糟糕的文件?由於git 1.9 something您可以:

git diff -- . ':(exclude)db/irrelevant.php' 

啊,優雅!請參閱引用的答案和詳細信息this answer by @torek

+5

如果我需要排除多個文件,該怎麼辦? – itsashis4u

+4

@ itsashis4u'git diff - 。 ':(exclude)db/irrelevant.php'':(排除)db/another_irrelevant.php'' – tokland

+0

注意:如果你想排除一個特定的文件名,你必須以星號作爲前綴,與'.gitignore'文件不同句法。例如。 ':!* shrinkwrap.yaml'而不是':!shrinkwrap.yaml'。 – vaughan

30

您還可以使用patchutils程序集合的filterdiff程序來排除某些差異的某些部分。例如:

git diff | filterdiff -p 1 -x db/irrelevant.php 
+3

請注意,來自手冊頁(1)的'-p'是「-p n,--strip-match = n匹配時,忽略路徑名的前n個組件。」我花了一段時間才發現'-p 1'正在從OP的路徑中刪除'db'部分。如果你只是想指定一個文件名並忽略所有路徑/目錄的可能性,你可以使用'-p 99'。 –

51

您可以使用no op命令設置自定義diff驅動程序,並將其分配給那些應該忽略的文件。

使用此命令

git config diff.nodiff.command /bin/true 

或所有回購與--global創建一個存儲庫的具體差異驅動

(如果/bin/true在MacOS中不存在,替代品將使用/usr/bin/trueecho)。

然後,將新的差異驅動程序分配給您要在.git/info/attributes文件中忽略的文件。

irrelevant.php diff=nodiff 

如果這種狀態應該與您可以使用.gitattributes代替.git/info/attributes並分享與您同行的git config命令(通過一個文檔文件或東西),其他開發人員共享。

+2

這正是我一直在尋找 - 在http://kerneltrap.org/mailarchive/git/2008/10/17/3711254描述我編輯 〜/的.gitconfig 補充說: '[DIFF 「nodiff」]' '命令=​​/bin中/ TRUE' 然後我創建了一個名爲git的/ info文件/屬性到了我說: 'irrelevant.php差異= nodiff' – Michael

+8

這個答案的工作更好對我來說:http://stackoverflow.com/questions/1016798/excluding-files-from-git-diff –

+3

有趣的是,這種方法不適用'git diff --stat'。在這種情況下,可以使用'git diff ... |作爲一種解決方法,diffstat'。 – ddkilzer

17

這一個在線解決方案不需要其他utils的/下載:

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-` 

哪裏file/to/exclude.txt是你想排除當然,文件的名稱。

編輯:信用ksenzee修復刪除的文件打破差異。

+0

我正在嘗試將你的一個班輪調整爲'git diff --stat master'而沒有太大的成功 - 你能幫忙嗎? –

0

類似Ben Roux's的解決方案,但無論如何分享:

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff 

,或者如果變化已經在當地承諾:

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master 

例子:

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master 

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master 
2

此方法比可接受的anwer更短。

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs' 

有關不同的包含/排除的可能性更多信息,請閱讀this other post

0

如果你想這樣做,只是目測檢查差異,視覺差異的工具(如Meld)將讓你做到這一點一個簡單的命令,很容易記住。

首先,建立一個diff工具,如果你還沒有。

$ git config --global diff.tool = meld 

然後,你可以運行一個目錄diff。

$ git difftool --dir-diff 

您將能夠瀏覽Meld(或您選擇的工具)中的差異(通過文件)。只是不要打開你想忽略的文件。