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

我们团队中有2名成员。 我们使用Xcode的SCM(使用SVN)来pipe理我们的源代码文件。 我们都将文件添加到我们的Xcode项目。 他已经承诺svn服务器。 当我更新时,Xcode发现在project.pbxproj文件中有冲突。然后我select退出Xcode并手动合并冲突。 然后我开始编辑我的project.pbxproj,合并我们的更改。 其实我不知道Xcode如何pipe理文件,我只是添加一些我的project.pbxproj文件没有的文本。 当我完成它时,我的项目无法打开。 我想这是因为project.pbxproj文件不能通过手动编辑。

所以,我想知道,当你发现这个问题的时候,project.pbxproj文件有冲突,怎么解决呢?

谢谢!

不幸的是,除了在一次签出中手动进行更改,然后签入新“合并”的项目外,没有什么可以做的了。

我使用git,但是我们看到了同样的问题 – 如果两个人添加文件,就会出现合并冲突。

通常编辑是非常容易的。 只需使用文本编辑器进入project.pbxproj文件,并查找合并冲突部分 – 通常这是通过类似于以下标记:

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

在99%的Xcode项目合并冲突的情况下,你只是想接受合并的双方(因为两个人添加不同的文件) – 所以你会简单地删除合并标记,在上面的情况下,最终会像:

 Stuff 1 Stuff 2 

就像我说的,这在大多数情况下效果很好。 如果Xcode在完成后不会读取项目文件,只需取最近的未合并版本,然后再手动添加文件即可。

当我遇到这个问题/答案时,我正在寻找一个简单的解决scheme来解决这个问题:

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

我完全被这个解决scheme简单地吹走了,我试图合并到一个不同的function分支,这个分支差不多有200个版本,XCode和Mercurial并没有成为快乐的营员。 我尝试手动合并pbxproj文件(有超过100个冲突)8次,然后再尝试这个解决scheme。

基本上解决scheme是这样的(假设你使用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. 从顶部工具栏中selectXcode-> Open Developer Tool-> FileMerge
  4. 在左侧,打开冲突的“project.pbxproj”文件(其中包含合并冲突标记的文件)
  5. 在右侧,打开你的'project.pbxproj.orig'
  6. selectFile-> 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. 吃蛋糕,因为你做了

这个解决scheme只适用于git,但是你可以添加一个.gitattributes文件到你的项目中,然后在这个文件中添加下面一行:

*.pbxproj merge=union

这将告诉git保持合并的双方,这将是绝大多数时间你想要的。

如上所述,处理冲突的最常见的方式

  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 

有时可能会在不同分支中重新创build一个或几个文件(例如ManagedObjects),因此合并时可能会在一个块中为一个文件创build两个声明。 在这种情况下,您应该删除其中一个声明。

我创build了一个工具“xUnique” https://github.com/truebit/xUnique ,它的工作原理!

要做的最好的事情可能就是简单地接受你的版本或者他的版本,而不是把它们结合起来。 另外,请考虑所讨论的文件是否应该在存储库中; 让每个人都有自己的版本可能更合适。

查看有关如何解决冲突的文档 。