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

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

所以,我想知道,当你发现这个问题,project.pbxproj 文件有冲突,如何解决它?

谢谢!

102111 次浏览

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

最好的做法可能是简单地接受 都不是你的版本 或者他的版本的全部,而不是试图结合两者。此外,还要考虑所涉及的文件是否应该存在于存储库中; 让每个人都拥有自己的版本可能更合适。

查看关于如何解决冲突的 文件

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

通常编辑是非常容易的,虽然。只需使用文本编辑器进入 project.pbxproj 文件,查找 merge 冲突部分——通常这个部分的标记如下:

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

在99% 的 Xcode 项目合并冲突情况下,你只是想接受合并双方(因为两个人添加了不同的文件)-所以你只需删除合并标记,在上面的情况下,结果会是这样:

Stuff 1
Stuff 2

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

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

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

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

我完全被这个解决方案的简单所震惊,我试图合并到一个不同的功能分支中,这个分支在主干后面有将近200个版本,XCode 和 Mercurial 对此并不满意。在尝试这个解决方案之前,我尝试了8次手动合并 pbxproj 文件(有超过100个冲突)。

基本上解决方案是这样的(假设您使用 Mercurial,因为它非常棒) :

  1. 尝试在水银中合并:

    hg update FEATURE_BRANCH
    hg merge default
    *mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
    
  2. Open Xcode

  3. From the top toolbar, select Xcode->Open Developer Tool->FileMerge
  4. On the left, open your conflicted 'project.pbxproj' file (the one with merge conflict markup in it)
  5. On the right side, open your 'project.pbxproj.orig'
  6. Select File->Save Merge and save over the 'project.pbxproj' file
  7. Then back at the command line:

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  8. Eat Cake Because You Are Done

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

这个解决方案只适用于 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

要手动解决合并冲突,请检查每个冲突项的 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 */; };

注意: 我不建议在 .gitattribues文件中添加 *.pbxproj merge=union来忽略合并冲突,因为一个冲突的合并应该总是手动检查,除非有一个复杂的脚本为您这样做。

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

您可以尝试这样做,而不是手动处理这些冲突。
假设您在特性分支上。

  1. Git 收银员。
  2. 复制 project.pbxproj中的内容
  3. Git 签出到您的特性分支,并粘贴它。(重写 project.pbxproj中的当前内容)
  4. react-native link
    

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

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

我知道90% 的冲突是明确的,你可以接受这两个冲突的变化,所以你不必担心,你会解决它,如果你有耐心 我发现使用像 xUnique 这样的工具会对你有很大的帮助