2010-08-13 295 views
2

是否有可能在git diff期間忽略某些文件?我特別感興趣的是過濾掉Makefile.in,Makefile,configure(以及所有自動生成的廢話)。Git diff忽略

+0

你可以將其全部添加到您的'.gitignore'文件;如果它們是自動生成的,將它們存儲在源代碼管理系統中有意義嗎? – sarnold 2010-08-13 05:57:15

+0

我沒有把它們存儲在那裏,這就是整個問題。如果我願意,我會把他們拿出來,輕鬆一點。 這是上游問題。但是我需要區分兩個不同的上游分支,我得到的只是這個自動生成的垃圾。幾乎不可能做任何真正的比較工作。 – 2010-08-13 05:59:56

回答

5

您可以嘗試將文件列表傳遞到git diff,並且它只會在這些文件上執行diff。

根據你的代碼是如何設置,它可以是那麼容易,因爲:

git diff otherbranchname -- src/  # only give me diffs from src/ 

或難看/複雜的:

git diff otherbranchname -- $(git ls-files | 
    perl -lne'next if /(?:[mM]akefile(?:\.in)?|configure|whateverelse)/;print') 
# diff all files which don't match the pattern 

根據要忽略文件是否由Git在當前分支管理或不管理,您需要將git ls-files替換爲find *;使用find .,並將|.git添加到Perl表達式中。

裁縫這個你認爲合適的,可能使用的目錄/文件名,你知道你想diff的,而不是使用git ls-filesfind

+0

哦,這只是純粹的真棒:-D謝謝 – 2010-08-13 07:13:56

+0

未經追蹤的文件將不會顯示在差異,雖然 - 我會認爲'ls文件'將永遠是很多,除非由於某些原因,你*想*差異對於一些未跟蹤的文件。 – Cascabel 2010-08-13 11:39:15

2

另一個類似的解決方案(添加到.git/config):

git mydiff 

[alias] 
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "([mM]akefile|configure)") 

然後運行它

請注意git diff --name-onlygit ls-files好,因爲它會傳遞一個較短的文件列表t git diff,因爲只有被修改的文件纔會被包含。使用git ls-files時,我遇到了超出大型項目中參數最大數量的麻煩。

0

至於詳細here你可以使用一個exclude pathspec魔法

git diff -- . ':(exclude)Makefile*' ':(exclude)configure'