2010-01-05 149 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