76

我们团队有两名成员。我们使用 Xcode 的 SCM(使用 SVN)来管理我们的源代码文件。
我们都将文件添加到我们的 Xcode 项目中。他已经致力于SVN服务器。当我更新时,Xcode 发现文件中有冲突project.pbxproj。然后我选择退出Xcode并手动合并冲突。然后我开始编辑我的project.pbxproj,合并我们的更改。实际上我不知道 Xcode 是如何管理文件的,我只是添加了一些我的project.pbxproj文件没有的文本。完成后,我的项目无法打开。我猜是因为该project.pbxproj文件无法手动编辑。

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

谢谢!

4

13 回答 13

151

I use git but we see the same issue - if two people add files there's a merge conflict.

Usually the editing is very easy though. Simply go into the project.pbxproj file with a text editor, and look for the merge conflict section - usually this is marked by something like :

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

In 99% of Xcode project merge conflict cases, you simply want to accept both sides of the merge (because two people added different files) - so you would simply delete the merge markers, in the above case that would end up like:

Stuff 1
Stuff 2

Like I said, this works great in MOST cases. If Xcode will not read the project file when you are done, just take the most recent un-merged version and manually add your files again.

于 2010-01-05T16:19:50.947 回答
28

不幸的是,除了在一次签出中手动进行更改然后签入新的“合并”项目之外,您无能为力。

于 2010-01-05T05:53:21.163 回答
19

此解决方案仅适用于 git,但您可以将.gitattributes文件添加到项目中,然后在该文件中添加以下行:

*.pbxproj merge=union

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

于 2016-03-15T18:32:41.703 回答
10

要手动解决合并冲突,请检查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文件中以基本上忽略合并冲突,因为除非有复杂的脚本为您执行此操作,否则应始终手动检查冲突的合并。

于 2018-09-05T12:34:08.477 回答
3

当我遇到另一个问题/答案时,我正在寻找一个直接解决这个问题的方法:

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. 选择文件->保存合并并保存在“project.pbxproj”文件上
  7. 然后回到命令行:

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  8. 吃蛋糕因为你完成了
于 2013-03-27T20:22:13.580 回答
2

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

于 2012-06-08T15:57:48.263 回答
2

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

  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
于 2016-04-19T11:11:39.777 回答
2

到目前为止,我用于 pbx 文件的最佳可视化合并工具是 Visual Studio Code 的合并工具。我在 Code 应用程序中打开 pbx 文件并修复冲突,然后再次打开 XCode。

于 2019-03-13T17:27:59.957 回答
1

您可以在 VSCODE 上打开它并修复那里的冲突合并。在 IDE 上查找一些彩色注释或在文本搜索中查找 <<< >>>。

于 2019-09-16T19:59:12.830 回答
1

我碰巧遇到了这个棘手的问题。

您可以试试这个,而不是手动处理这些冲突。
假设您在功能分支上。

  1. Git 结帐大师。
  2. 将内容复制到project.pbxproj
  3. Git checkout 到您的功能分支,然后将其粘贴。(覆盖当前内容project.pbxproj
  4. react-native link
    
于 2018-12-20T11:47:36.467 回答
0

我知道 90% 的冲突是明确的,您可以接受冲突中的两种更改,因此您不必担心,如果您耐心等待,您会解决它,我发现使用 xUnique 等工具对您有很大帮助

于 2020-11-21T08:29:19.943 回答
0

我创建了一个工具“xUnique” https://github.com/truebit/xUnique,它可以工作!

于 2016-01-26T08:36:43.410 回答
-25

最好的办法可能是简单地完全接受你的版本或他的版本而不是试图将两者结合起来。另外,请考虑有问题的文件是否应该在存储库中;让每个人都有自己的版本可能更合适。

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

于 2010-01-05T14:15:22.680 回答