2010-01-05 145 views
47

我們團隊中有2名成員。我們使用Xcode的SCM(使用SVN)來管理我們的源代碼文件。我們都將文件添加到我們的Xcode項目中。他已經承諾svn服務器。當我更新時,Xcode發現在project.pbxproj文件中存在衝突。然後選擇退出Xcode並手動合併衝突。然後我開始編輯我的project.pbxproj,合併我們的更改。其實我不知道Xcode如何管理文件,我只是添加了一些我的project.pbxproj文件沒有的文本。完成後,我的項目無法打開。我想這是因爲project.pbxproj文件不能通過手動編輯。如何合併Xcode中的衝突(file project.pbxproj)使用svn?

所以,我想知道,當你發現這個問題時,project.pbxproj文件有衝突,怎麼解決呢?

謝謝!

回答

17

不幸的是,除了在一次簽出中手動進行更改,然後簽入新「合併」項目外,沒有什麼可做的了。

+1

經過一個小時的時間找到一個神奇的解決方案。這似乎是我唯一可以接受的答案。 – 2014-09-11 07:04:55

-20

做的可能是簡單地接受要麼版本或他的全部版本,沒有試圖將兩者結合起來的最好的事情。另外,請考慮所討論的文件是否應該在存儲庫中;讓每個人擁有自己的版本可能更合適。

查看documentation關於如何解決衝突。

+0

這個。 .pbxproj文件非常簡單(如果是詳細的話)文件,而且通常的合併技術通常工作得很好,只要你耐心。 – 2010-01-05 14:20:31

+13

'project.pbxproj'是一個放在你的倉庫中的重要文件,因爲它告訴Xcode如何構建項目。不檢查它就等於不檢查'Makefile'。 – 2010-08-02 21:10:34

+4

此答案危險錯誤。不要只接受一個或另一個,否則你的項目會丟失文件。是的,它應該在存儲庫中,否則每個人都會以不同的結果以不同的方式構建項目。 – DougW 2011-08-18 21:51:36

114

我使用git,但我們看到相同的問題 - 如果兩個人添加文件,就會出現合併衝突。

雖然編輯通常很容易。 - 只需進入一個文本編輯器project.pbxproj文件,並查找合併衝突部分,通常這是由類似標記:

>>>>>>> 
Stuff 1 
====== 
Stuff 2 
<<<<<<<< 

在99%的Xcode項目的合併衝突的情況下,你只是想接受合併的雙方(因爲兩個人加入不同的文件) - 這樣你就只需刪除合併標記,在上述情況下,將落得像:

Stuff 1 
Stuff 2 

就像我說的,這在大多數的偉大工程案例。如果Xcode在完成時不會讀取項目文件,只需取最近的未合併版本並再次手動添加文件即可。

+1

對於一個非常類似的問題的另一個答案,爭論將pbxproj文件視爲二進制文件:http://stackoverflow.com/questions/1549578/git-and-pbxproj/1549590#1549590 – 2011-11-02 19:27:57

+3

他們是錯誤的。爲什麼ANY文本格式對於自動化系統來說比代碼本身更難合併?這個不成立。我每天都與其他人一起在XCode項目上工作多年,每次都應用上述合併策略(儘管現在我只是告訴合併工具接受任何衝突的雙方)。這種方法工作得很好。現在故事板,我需要做更多的嘗試,然後才能宣稱這些作品。 – 2011-11-02 19:39:41

+2

這對於xcode 5來說至少不起作用。似乎它使用了一些神奇的數字,並在項目中添加了某些東西時爲所有資源重新生成它們。當發生衝突時,您應該刪除兩個衝突的資源,手動添加它們,以便xcode可以再次生成這些幻數。 – 2014-01-15 18:16:04

1

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

3

我一直在尋找一個簡單的解決這個問題,當我遇到這等提問/回答傳來:

https://stackoverflow.com/a/14180388/307217

我完全被這個解決方案是多麼簡單吹走,我試圖合併在一個完全不同的功能分支中,XCode和Mercurial並沒有成爲快樂的營員。在嘗試此解決方案之前,我嘗試過手動合併pbxproj文件(其中有超過100次衝突)8次。

基本上解決辦法是這樣的(假設你使用水銀,因爲它的真棒):

  1. 嘗試中善變的你的合併:

    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->打開開發工具 - > FileMerge
  4. 在左邊,打開你衝突的'p roject.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. 吃蛋糕因爲你做
+0

這在我的情況下崩潰Xcode 5 FileMerge。 – 2013-10-18 15:59:27

+0

booo,以及它的工作原理4.6.3 .... :) – 2013-10-18 18:56:29

+1

結果Xcode 5 FileMerge幾乎崩潰了所有事情。偉大的工作出貨蘋果... – 2013-10-22 14:43:58

0

我創辦了一個工具 「xUnique」 https://github.com/truebit/xUnique,它的作品!

+2

請注意,[只有鏈接的答案](http ://meta.stackoverflow.com/tags/link-only-answers/info)是不鼓勵的,所以SO答案應該是尋求解決方案的終點(而另一個引用的中途停留時間往往會過時隨着時間的推移)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra 2016-01-26 08:42:39

2

此解決方案僅適用於混帳,但你可以在.gitattributes文件添加到您的項目,然後該文件中添加以下行:

*.pbxproj merge=union

這將告訴混帳保持合併的兩面這將是絕大多數時間你想要的。

1

如上的處理衝突的最常見的方式說是

  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