2017-06-01 18 views
5

我正在使用IDE,它在某些生成但強烈需要的庫文件中生成版本。所以,如果我想要使用多個版本的庫,或者看到一些實際上沒有意義的更改,則會出現問題。git filter not'unmodifying'文件

摘要:我想忽略行的,我認爲Git的過濾器是正確的方法一個或多個文件。我可以爲grep找到相關產品線,而不會出現任何問題,因爲人們可能會看到進一步的閱讀。

長話短說,我設置了一個git過濾器來恢復對頭文件中版本的任何修改。 (請注意,可能會有不同的修改將在本文件的相關)。

[filter "ignore-version"] 
    smudge = cat %f || cat 
    clean = git ls-files %f --error-unmatch >&- 2>&- \ 
       && sed \"/version/c $(git show HEAD:%f | grep version)\" || cat 

(我加逃過線打破了更好的閱讀和改變,以配合簡單的字。在原來的版本有沒有衝突可能的。)

  1. git ls-files檢查該文件是否已經在存儲庫(目前HEAD

1.1如果存在的話,sed將做骯髒的工作,以取代已經整條生產線追蹤一個

1.2如果沒有,cat會做什麼,但前進(這應確保沒有被跟蹤的文件不會丟失)

所以很遠,它的工作。 (我可以用這一事實,過濾器默默地將所有CRLFLF住...)

問題:通過git的改性固定文件被​​標記,儘管最新的版本庫文件並且過濾的版本是二進制相等的。我使用kdiff作爲單獨的工具進行了檢查。


編輯1:下面是一些輸出其示出了兩個文件版本的等式:

$ git show HEAD:file.txt | md5sum 
9f95c28cebe4f45b8efb7b0ae64dfa56 
$ cat file.txt | md5sum 
894e7d1b28180b7a193bf3cdd6ceaacb 
$ cat file.txt | git ls-files file.txt --error-unmatch >&- 2>&- \ 
       && sed \"/version/c $(git show HEAD:file.txt | grep version)\" 
       || cat | md5sum 
9f95c28cebe4f45b8efb7b0ae64dfa56 

編輯2:此外,差的輸出.. 。

$ git diff file.txt 
warning: LF will be replaced by CRLF in file.txt. 
The file will have its original line endings in your working directory. 

請注意該文件的簽入版本只包含LF,與之前的提交一樣。另請注意,core.autocrlf的設置爲true.gitattributes文件中的篩選器規範外沒有任何內容。

+0

我在一臺Linux機器上使用一個存儲庫從頭開始重現了這一點......並且它工作正常。同樣的命令呢!因此,在Windows機器上使用git和斷行顯然存在問題。我嘗試了所有的git配置,但都沒有工作。 – maxik

+0

https://stackoverflow.com/questions/17628305/windows-git-warning-lf-will-be-replaced-by-crlf-is-that-warning-tail-backwar – Gimby

+0

@Gimby我應該一直遵循這個警告,你是對的,雖然鏈接背後的解釋不是解決方案。不管怎麼說,還是要謝謝你。 – maxik

回答

4

最後,我解決了它。問題文件處於一種奇怪的狀態,看起來好像簽出的版本具有unix風格的行結尾,這對於git配置是不正確的(檢查windows風格,提交unix風格)。分段這個特殊的文件在沒有任何提及的情況下立即從暫存區域中刪除,現在被認爲是不變的。所以我認爲git在臨時(行結束)清理工作目錄文件,現在它工作。

對不起。


步驟來完全地檢查問題:

git init 
echo "version=0.1" > file.txt 
echo "*.txt filter=ignore-version" > .gitattributes 
git config --local filter.ignore-version.clean 'git ls-files %f --error-unmatch >&- 2>&- \ 
    && sed -b "/version/c $(git show HEAD:%f | grep version)" || cat' 
git config --local filter.ignore-version.smudge 'cat %f || cat' 
git add file.txt .gitattributes 
git commit -m "initial commit" 
# ----- 
echo "version=0.2" > file.txt 
git status 

狀態不應該報告任何變化。它在Linux和Windows上都使用裸存儲庫。

相關問題