簡體   English   中英

Git + Windows + Visual Studio合並由分支之間的行結束問題引起的沖突

[英]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問題。 我不確定如何批量修復此問題? 我雖然我的初始存儲庫刷新我上面列出會做到這一點,顯然不是。

這是master(合並到master中注意:這個文件在合並之前是CRLF,在合並CRLF時必須轉換為LF): 在此輸入圖像描述

以下是我要合並的內容: 在此輸入圖像描述

為了更加一致並且能夠通過擴展名指定不同文件的行結尾,您可以使用.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM