簡體   English   中英

Xcode 項目文件 git 合並沖突

[英]Xcode Project file git merge conflict

在Xcode中,工程文件中避免Git沖突的最佳方法是什么? (我在manual git,不是用git的Xcode接口)

我從 Github 克隆了 mapbox-ios-sdk,破解了它,現在遠程主機已經改變了。 當我試圖將遠程更改拉到我的本地時,合並后項目文件中會出現合並沖突。 (具體來說,我指的是.xcodeproj中的project.pbxproj)

我真的不認為應該忽略項目文件,因為如果項目文件有任何新文件,.pbxproj 文件似乎已更改。 (或者我完全錯了,這個文件應該被忽略?但顯然它並沒有在 mapbox-ios-sdk 中被忽略。畢竟人們需要項目文件。)但我也跑了在我與另一個合作者的合作項目之前就陷入了這場沖突,這讓我無法完全使用 Git。

我應該弄清楚如何手動解決沖突還是有更好的方法來處理這個問題?

.pbxproj 將在您向項目添加新文件時更改。 如果兩個或多個協作者同時添加文件(而不先獲取彼此的更改),則會發生沖突。 我們在我的項目中通過在添加新文件之前和之后執行以下步驟來避免這種情況:

  1. 在添加文件之前,提交您的更改,然后從 master 中提取,以便您擁有最新的。如果有人添加了文件,您現在擁有最新的 .pbxproj
  2. 添加您的文件。
  3. 立即提交並將您的更改推送到主服務器(希望在另一個協作者添加另一個文件之前)。

它很弱,但我們不喜歡手動解決 .pbxproj 沖突。

另外,請參閱此堆棧溢出問題,並給出了很好的回答: How to use Git correct with XCode?

許多網站只是建議使用 .gitattributes 文件:

*.pbxproj merge=union

在嘗試使用腳本之前,我們將嘗試這種方法。 如果我們發現任何問題,我一定會更新這篇文章。 此外,如果其他人對此方法有意見,請包括在內。

您應該檢查我的腳本xUnique ,它現在是在 Apple 對其采取行動之前合並 Xcode 項目文件的最佳解決方案。

它的作用和工作原理

  1. project.pbxproj轉換為 JSON 格式
  2. 迭代 JSON 中的所有objects並給每個 UUID 一個絕對路徑,並使用路徑的 MD5 十六進制摘要創建一個新的 UUID
    • 這個json對象中的所有元素實際上都是連接成一棵樹
    • 我們使用其唯一屬性為樹的每個節點賦予路徑屬性; 這個路徑是根節點的絕對路徑,
    • 將 MD5 十六進制摘要應用於節點的路徑
  3. 用 MD5 十六進制摘要替換所有舊的 UUID,並刪除不在當前節點樹中的未使用的 UUID 和格式錯誤的 UUID
  4. 對包含childrenfilesPBXFileReferencePBXBuildFile列表的項目文件進行排序,並刪除這些列表中的所有重復條目
    • 如果您想了解實現,請參閱sort_pbxproj方法;
    • 它是從我修改后的sort-Xcode-project-file移植而來的,在PBXFileReferencePBXBuildFile排序上有一些差異
  5. 通過不同的選項,您可以更靈活地使用xUnique

檢查README文件以獲取更多詳細信息。

在大多數情況下,您可以通過以下代碼修復合並,刪除 git 添加的行:

#!/bin/bash
FILE={PRODUCT_NAME}.xcodeproj/project.pbxproj
sed '/======/d' $FILE | sed '/<<<<</d' | sed '/>>>>>/d' > temp
cat temp > $FILE
rm temp

但是如果你重命名你的項目的組,導致沖突,你將手動刪除原來組的多余行。

當這是由於添加來自兩個或多個合作者/分支的文件(根據我的經驗,迄今為止一直如此,可以通過查看差異來檢查)引起的,我這樣做:

  1. 通過“使用我們的”或“使用他們的”(以添加最多的文件為准)解決沖突。
  2. 提交(這會生成一個包含所有添加文件的 repo,但有些不在項目中)。
  3. 在 Xcode 中,使用“Add Files To...”從其他協作者/分支添加丟失的文件(它們很容易找到,因為它們位於項目目錄中,Xcode 會為您有效地突出顯示它們)。
  4. 犯罪。

(我不相信第 2 步真的有必要——但對我來說感覺更整潔)。

您也可以使用 Mergepbx 手動執行如下操作

  1. 使用 brew 安裝Mergepbx

    brew安裝mergepbx

  2. 每次在項目文件中出現沖突時運行命令以自動解決它們。

    git mergetool --tool=mergepbx PROJECT.pbxproj

我需要在我的分支中獲取 master 代碼所以,我從 master 那里拉取,並且我在我的 .pbxproj 文件中進行了更改,並且 master 具有不同的配置。所以,它在 .pbxproj 文件中顯示沖突。 請按照以下步驟解決它

在 Finder 中打開.pbxproj ->右鍵單擊文件選擇Show Package Contents -> 選擇 。 pbxproj 文件使用 TextEdit- >打開它,它將顯示如下沖突行。

<<<<<<< HEAD"
// head changes
===========
// Your changes
>>>>>>>>

您已經從 head Changes 和您的更改中選擇了正確的一個,然后刪除其余的。 現在提交你的代碼

git add .
git commit -m"conflict resolved"
git status // Check you files status

如果一切正常,則推送您的代碼。

git push

如果一切都失敗了,雖然乏味。 您可以在 git 客戶端中打開 pbxproj,然后逐個文件手動打開 go 並確保每個文件都被刪除或有 4 行(出現 6 次)。

我也遇到了同樣的問題,於是在Swift寫了一個工具,可以解決文件和組的增刪改名沖突。 您可以將其設置為 git 合並驅動程序,以便腳本在您合並分支時自動運行。

你可以在這里查看: XcodeMergeDriver

我制作了一個應用程序,用於在出現此類問題時修復 Xcode 項目文件中的內容。 不幸的是,您仍然必須先進行一些手動合並。 https://itunes.apple.com/us/app/xsaviour/id1449886415?mt=12

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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