簡體   English   中英

如何在 Xcode 中使用 svn 合並沖突(文件 project.pbxproj)?

[英]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.swiftNewFileB.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,因為它很棒):

  1. 嘗試在 mercurial 中合並:

     hg update FEATURE_BRANCH hg merge default *mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
  2. 打開 Xcode

  3. 從頂部工具欄中,選擇 Xcode->Open Developer Tool->FileMerge
  4. 在左側,打開沖突的“project.pbxproj”文件(其中包含合並沖突標記的文件)
  5. 在右側,打開您的“project.pbxproj.orig”
  6. 選擇 File->Save Merge 並保存“project.pbxproj”文件
  7. 然后回到命令行:

     hg resolve -m ProjectName.xcodeproj/project.pbxproj *merge any other broken files* hg commit -m "manually merged with trunk"
  8. 吃蛋糕,因為你已經完成了

有時可能會在不同的分支中重新創建一個或幾個文件(例如 ManagedObjects),因此當您合並時,一個塊中的一個文件可能會有兩個聲明。 在這種情況下,您應該刪除其中一個聲明。

如上所述,處理沖突的最常見方法

  1. 接受“一切”
  2. 將文件重新導入到項目中

我寫了一個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

我碰巧遇到了這個棘手的問題。

你可以試試這個,而不是手動處理這些沖突。
假設您在功能分支上。

  1. Git結帳大師。
  2. 復制project.pbxproj內容
  3. Git checkout 到您的功能分支,並粘貼它。(覆蓋project.pbxproj的當前內容)
  4. 運行

    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.

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