2015-10-15 185 views
29

我正在經歷一個代碼庫並修復空白的怪異問題,並且通常會校正縮進和這樣的事情,並且我想確保我沒有無意中做出任何其他更改,所以我在做git diff -w以顯示所有更改的文件的差異,同時忽略空白的差異。問題是這實際上並沒有忽略所有的空格的差異 - 至少什麼認爲只是空白的差異。例如,在從git diff -w輸出以下,忽略*所有*空格在提交之間隨着git-diff的變化

-"Links": 
-{ 
- 
- "Thermal": 
- 
-{ 
- 
+ "Links": { 
+ "Thermal": { 

你可以看到,我只有

  1. 去除多餘的空行,上的行結束
  2. 把大括號其關鍵他們打開值,
  3. 縮進適合上下文

This question看起來像它可能會提供一個答案,但它處理兩個具體的文件之間的差異,而不是兩個具體的承諾之間的差異。搜索出現的其他一切也都是死路一條。例如,this question是關於合併,不顯示差異,並且this question涉及顯示字級差異,等等。

回答

24

也許有更好的答案,但我迄今發現的最佳解決方案是這樣的。

首先,您必須控制Git當前使用的「空白」的定義。創建或編輯您的項目中.gitconfig,包括

[core] 
    whitespace = -trailing-space,-indent-with-non-tab,-tab-in-indent 

接下來,你必須控制使用的詞的定義。而不是僅僅使用git diff -w,加--word-diff-regex=[^[:space:]]

git diff -w --word-diff-regex=[^[:space:]] 

您仍然會看到的背景下,這(在我的情況,因爲我想確保沒有差別除了空白差異)不很有幫助。您可以使用-U0通知Git給你0行內容,就像這樣,

git diff -w -U0 --word-diff-regex=[^[:space:]] 

,但你仍然會得到輸出看起來很像背景,但它仍然遠遠好於通過所有的變化看仔細和手動,以確保他們只是空白的變化。

+1

@Torek - 又一塊Git的善良。爲什麼在地獄裏很難區分所有空白?我正在試圖在Visual Studio項目文件上評估PR的Windows計算機上。我不在乎CR,LF或CRLF的差異,但這就是Git填補我的終端的地方。 – jww

9

忽略用git-DIFF所有空白改變之間提交

這個問題看起來像它可能在第一次提供了一個答案,但它有兩個特定的文件,而不是兩個具體提交之間差異的交易。通過搜索找到的其他內容也是死路一條......

我覺得你遇到了麻煩,因爲Git是工作的錯誤工具。它不會使任務變得簡單,並且屈服於適應工具是錯誤的方法。工具應該爲你工作而不是反之亦然

執行第二個克隆,然後簽出有問題的起始修訂。然後使用您當前的修訂版在它們上運行常規差異:diff -bur --ignore-all-space <dir1> <dir2>

這裏有some of the options for diff

-i, --ignore-case 
     ignore case differences in file contents 

-E, --ignore-tab-expansion 
     ignore changes due to tab expansion 

-Z, --ignore-trailing-space 
     ignore white space at line end 

-b, --ignore-space-change 
     ignore changes in the amount of white space 

-w, --ignore-all-space 
     ignore all white space 

-B, --ignore-blank-lines 
     ignore changes where lines are all blank 
0

對於用戶到位桶,有此一建議修復,但尚未進行編碼,並且可能不會,直到有足夠的興趣。您可以訪問Bitbucket站點並顯示您的支持。我最初在Bitbucket中搜索解決方案時找到當前頁面,所以如果在這種情況下有其他人,請去here並投票!