![](/img/trans.png)
[英]Visual Studio Enterprise Git Merge completed with conflicts
[英]Git + Windows + Visual Studio Merge Conflicts Caused by Line Ending Issues between branches
我正在努力正確地合並到分支機構。 分支似乎有行結束問題,因為當我打開Visual Studio中的沖突窗口時,它顯示0個沖突和0個不同文件之間的差異。
我在兩個分支上添加了一個gitattributes文件,它在兩個存儲庫中查找並執行了存儲庫刷新 。
當我刷新兩個存儲庫時,沒有提交更改,即使指令指出將提交更改(實際上更改來自EOL轉換)。
這是我的gitattributes
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
我也檢查過,我的全局core.autocrlf等於true (因為我們所有的開發人員都在Windows上使用Visual Studio)
問題是,當我繼續做以上操作以期在兩個分支中修復和規范化這些分支時,我最終會遇到比以前更多的沖突 - 所有這些都是由於行結束:
.git / config文件(不包括分支引用)
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
autocrlf = true
[merge]
renormalize = true
我在我的智慧結束,經歷無數的SO問題/答案 - 谷歌搜索,無濟於事 - 我的沖突計數繼續上升。
另請注意:我在TFS上使用GIT - 不確定這是否會改變。
更新1:我已經從Visual Studio中復制了所說的“沖突”兩個文件,每個文件都進入了自己的Notepad ++窗口,其中“show symbols - > show end of line”打開 - 然后我比較了兩個“沖突”文件和你一樣可以看到行結尾沒有區別(兩個文件都包含完全相同的CR / LF,如下圖所示) - 所以我猜測VS正在進行EOL轉換或其他什么? 或者,當我將它復制到Notepad ++中時,它會進行某種EOL轉換? 不確定這是否有幫助。
我正在運行Visual Studio 2015 Update 3
更新2:我添加了這個方便的End of Line Visual Studio擴展 ,顯示了EOL字符文件,因此我可以在合並/差異屏幕中看到所有EOL字符,看起來它們在文件之間完全匹配。
更新3:好的 - 所以我想我可能會在這里做點什么...我做了一個合並,然后打開一個沖突的文件,這就是我發現...我正在合並的分支是使用CRLF,分支我正在合並INTO正在使用LF - 所以它似乎確實和EOL問題。 我不確定如何批量修復此問題? 我雖然我的初始存儲庫刷新我上面列出會做到這一點,顯然不是。
為了更加一致並且能夠通過擴展名指定不同文件的行結尾,您可以使用.gitattributes文件。 該文件將提交到存儲庫,並將覆蓋開發人員設置。 .gitattributes文件應該在存儲庫的根目錄中創建,並像任何其他文件一樣提交到repo中。
# Set behaviour for all files, in case developers don't have core.autocrlf set.
* text=auto
# Explicitly declare text files we want to always be normalized and converted to native line endings on checkout.
*.txt text
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.zip binary
如果您使用的是core.autocrlf = true,則在repo(TFS)中所有文件都使用LF存儲,而在結帳時,GIT會將它們轉換為CRLF。 我注意到auto的問題是根據文檔
“當使用CRLF提交文件時,不會進行任何轉換。”
所以基本上如果你有一些存儲庫中的文件與CRLF一起提交,因為沒有執行轉換,在其他分支中你有規范化的行結尾(LF),那么你會收到沖突uppon merge。 很難看到它,因為當你結賬時,LF被替換為CRLF並且似乎沒有變化。
我的方法是使用CRLF作為eol而不是auto,希望它總是在提交時替換CRLF - > LF,在結賬時替換LF - > CRLF。
*.cs text eol=crlf
*.xaml text eol=crlf
*.csproj text eol=crlf
*.sln text eol=crlf
因此,要解決您的問題,您必須將服務器行結尾從CRLF更改為LF。 對我來說,這個命令工作.gitattributes被修改並提交(即使我無法解釋它,但我將所有CRLF文件更改為存儲庫中的LF)
git rm --cached -rf .
git diff --cached --name-only -z | xargs -n 50 -0 git add -f
另外,在更改.gitattributes之后你必須再次檢出你的文件,我正在使用這個命令:
git rm -rf --cached .
git reset --hard HEAD
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.