[英]How to merge conflicts (file project.pbxproj) in Xcode use svn?
我們團隊有兩個成員。 我們使用 Xcode 的 SCM(使用 SVN)來管理我們的源代碼文件。
我們都將文件添加到我們的 Xcode 項目中。 他已經致力於SVN服務器。 當我更新時,Xcode 發現project.pbxproj
文件中存在沖突。 然后我選擇退出Xcode
並手動合並沖突。 然后我開始編輯我的project.pbxproj
,合並我們的更改。 其實我不知道 Xcode 如何管理文件,我只是添加了一些我的project.pbxproj
文件沒有的文本。 完成后,我的項目無法打開。 我猜是因為project.pbxproj
文件無法手動編輯。
所以,我想知道,當你發現這個問題時,project.pbxproj文件有沖突,如何解決?
謝謝!
我使用 git 但我們看到了同樣的問題 - 如果兩個人添加文件,則會出現合並沖突。
不過,通常編輯很容易。 只需使用文本編輯器進入 project.pbxproj 文件,然后查找合並沖突部分 - 通常用以下內容標記:
>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<
在 99% 的 Xcode 項目合並沖突情況下,您只是想接受合並的雙方(因為兩個人添加了不同的文件)-因此您只需刪除合並標記,在上述情況下,最終會像:
Stuff 1
Stuff 2
就像我說的,這在大多數情況下都很有效。 如果完成后 Xcode 不會讀取項目文件,只需使用最新的未合並版本並再次手動添加文件。
不幸的是,除了在一次簽出中手動進行更改然后簽入新“合並”的項目之外,您無能為力。
此解決方案僅適用於 git,但您可以將.gitattributes
文件添加到您的項目中,然后在該文件中添加以下行:
*.pbxproj merge=union
這將告訴 git 保留合並的雙方,這在大多數情況下都是您想要的。
要手動解決合並沖突,請檢查每個沖突項的UUID
。
示例:
<<<<<<< HEAD
6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
3F01C4B72008E70000889299 /* NewFileA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.swift */; };
=======
6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
4DF01C4B72008E70000882ED /* NewFileB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.swift */; };
>>>>>>> branch_to_merge
檢查每個 UUID:
ExistingFile.swift
NewFileA.swift
和NewFileB.swift
project.pbxproj
文件中找到一次,我會認為它是人工制品並且可以安全地刪除它。結果將是:
6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
3F01C4B72008E70000889299 /* NewFileA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.swift */; };
4DF01C4B72008E70000882ED /* NewFileB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.swift */; };
注意:我不建議將*.pbxproj merge=union
添加到.gitattribues
文件以基本上忽略合並沖突,因為除非有復雜的腳本為您執行此操作,否則應始終手動檢查沖突合並。
當我遇到另一個問題/答案時,我正在尋找解決這個問題的直接方法:
https://stackoverflow.com/a/14180388/307217
我完全被這個解決方案的簡單震驚了,我試圖合並一個不同的功能分支,這個分支在主干后面幾乎有 200 個修訂版,XCode 和 Mercurial 對此並不滿意。 在嘗試此解決方案之前,我嘗試手動合並 pbxproj 文件(有超過 100 個沖突)8 次。
基本上解決方案是這樣的(假設您使用 Mercurial,因為它很棒):
嘗試在 mercurial 中合並:
hg update FEATURE_BRANCH hg merge default *mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
打開 Xcode
然后回到命令行:
hg resolve -m ProjectName.xcodeproj/project.pbxproj *merge any other broken files* hg commit -m "manually merged with trunk"
有時可能會在不同的分支中重新創建一個或幾個文件(例如 ManagedObjects),因此當您合並時,一個塊中的一個文件可能會有兩個聲明。 在這種情況下,您應該刪除其中一個聲明。
如上所述,處理沖突的最常見方法是
我寫了一個bash 腳本來處理上面的 (1)。
請注意,這只會解決最常見的合並沖突情況!
#!/bin/bash
#
#
#
if [ $# -eq 0 ]
then
echo "File must be provided as argument, darnit!"
exit 1
fi
if [ $# -eq 2 ]
then
echo "only ONE File must be provided as argument, darnit!"
exit 1
fi
echo "Will remove lines from file:" $1
grep -v "<<<<<" $1 | grep -v ">>>>>>" | grep -v "====" > out.tmp;mv out.tmp $1
echo "Done removing lines from file:" $1
我碰巧遇到了這個棘手的問題。
你可以試試這個,而不是手動處理這些沖突。
假設您在功能分支上。
project.pbxproj
內容project.pbxproj
的當前內容)運行
react-native link
到目前為止,我用於 pbx 文件的最好的可視化合並工具是 Visual Studio Code 的合並工具。 我在 Code 應用程序中打開 pbx 文件並修復沖突,然后再次打開 XCode。
您可以在 VSCODE 上打開它並在那里修復沖突的合並。 在 IDE 上查找一些彩色注釋或在文本搜索中查找 <<< >>>。
我創建了一個工具“xUnique” https://github.com/truebit/xUnique ,它有效!
我知道 90% 的沖突是明確的,您可以接受沖突中的兩種更改,因此您不必擔心,如果您像我發現的那樣耐心,就會解決它
做最好的事情可能是簡單地接受或者您的版本或他的全部版本,沒有試圖將兩者結合起來。 另外,請考慮有問題的文件是否應該在存儲庫中; 讓每個人都有自己的版本可能更合適。
查看有關如何解決沖突的文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.