2016-11-14 43 views
1

我在我的倉庫中有幾個.resx files包含我的應用程序的字符串翻譯。這個效果很好,除了當新字符串添加到文件末尾的單獨git分支時,合併衝突除外。 KDiff3在合併XML列表對時效果不佳。爲什麼我不能放棄由`git clean`過濾器造成的本地更改?

resx文件基本上是一個沒有特定順序的鍵/值對列表。爲了避免合併衝突,因此,我想在對按字母順序之前提交排序,我已經使用了優秀的SortRESX program此使用git的過濾器做:

git config --global filter.resx.clean SortRESX 
git config --global filter.resx.smudge cat 

該做的工作。但是,如果我簽出一個未分類的文件,它將被過濾器立即排序,並且git不允許我放棄這些更改 - 我必須在切換分支之前提交文件的排序版本。如何放棄過濾器所做的更改而不提交?

+1

所以你改變一個文件(自動)並且'git reset'不起作用?或者它可以工作,但在重置後將其更改回來,看起來好像什麼也沒有發生 – miva2

+0

這正是發生了什麼 - 在運行'git reset'後文件被重新排序。我只希望它在升級resx文件時進行排序,但重置時也會這樣。 –

+0

我剛剛閱讀了有關git過濾器[這裏](https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes),從未使用它們。在清理前運行'clean'並在結帳後運行'smudge'。所以你希望他們在提交前排序並在退出後排序?我認爲它會顯示文件在您的暫存區域中被修改並在您提交時對其進行排序,因此如果您沒有修改它,則在提交後不會在diff中顯示任何內容。或者你可以讓它一直排序,並使用SortRESX來清潔和塗抹。我只是在這裏猜測。 – miva2

回答

1

不過,如果我檢查出未排序的文件時,它會立即被過濾

這不應該發生進行排序(我想!)。我相信其他事情實際上正在發生。

一個clean濾波器的意圖/想法是,它被施加當文件被添加到索引,和污跡濾波器應用於當文件是提取從索引到工作樹(這就是爲什麼當您使用git checkout <commit> -- <path>時,git checkout必須首先將提交中的文件寫入索引,然後將其複製到工作樹。請注意,行結束/ CRLF轉換被視爲過濾器的形式(如果可能,在內部完成,但如果需要,則在來自或實際用戶提供的過濾器的管道上完成)。

(這可能是因爲有一些代碼,我錯過了什麼地方,它運行在一些額外的情況下,clean過濾器,但我不這麼認爲:。Git的這部分客源相當明顯)

我相信發生的事情更加微妙。當Git應用塗抹過濾器時,會自動在索引中標記高速緩存條目「髒」。 (這段代碼不太明顯,所以我可能在這裏是錯誤的。)由於這個標記,當Git去檢查該文件的狀態,它說:嗯,這個緩存項被標記爲髒,我會最好運行clean過濾器,並確定。因此,它會運行您的clean篩選器,對鍵/值對進行排序,然後將結果與基礎BLOB進行比較。這些不同,所以即使原始未排序的工作樹條目實際上與當前提交匹配,Git現在也會聲明工作樹條目「真正髒」,

換句話說,GIT中假定的git cat-file <hash-id> | smudge | clean相當於產生相同位爲git cat-file <hash-id>,如果沒有,你應該提交的文件實際上是大致如此,當你試圖正常化行結尾存儲在存儲庫中。這並不意味着檢出的副本是排序的;您的cat過濾器(順便說一下,您可以放棄:不存在的過濾器意味着「保持獨立」)不對文件排序,並且工作樹副本仍然未排序。這只是Git堅持認爲它應該成爲排序。

這意味着到底是什麼的答案:

我怎麼能拋棄不提交由過濾器所做的更改?

是簡單地忽略Git的抱怨,並檢查其他提交無論如何。您可能不得不使用--force標誌來做到這一點,但這樣做最令人不安(最壞的情況是,可能會導致您失去想要保留的更改!)。所以有一個更好的(ish)方法:暫時禁用「乾淨」過濾器(通過編輯.gitattributes)。如果在禁用過濾器的情況下(或者用cat代替,它只會更慢地執行相同的操作),Git將在檢查狀態時查看設置了「dirty」標誌,然後重複其嗯,我會最好跑clean過濾器的事。這次該過濾器是無操作的,生成的二進制位與blob匹配,Git清除髒標誌。您現在可以在任何時候恢復過濾器,因爲現在緩存項不再被標記爲髒,Git將跳過所有這些測試。

(這可能是好的,有一種方式來獲得的Git來聲明一個文件「真正做到髒」之前嘗試比較:用實際的,配置clean過濾器之一,然後如果說「髒」,一個更多時間使用過濾器這將自動決定基於「未清理」in-repo blob,但最終與該blob匹配的工作樹文件實際上「不髒」,當然這會意味着不會鼓勵您修復行結束符,但如果這是用戶定義的開關,則可以將其設置爲包含不潔對象的舊存儲庫,與您可以爲此類存儲庫設置merge.renormalize的方式相同。)

+0

這是一個很好的答案。謝謝! –

相關問題