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

vcL*_*wei 62 svn iphone xcode conflict

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

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

谢谢!

Ken*_*ner 132

我使用git但是我们看到同样的问题 - 如果两个人添加文件就会发生合并冲突.

通常编辑很容易.只需使用文本编辑器进入project.pbxproj文件,然后查找合并冲突部分 - 通常会标记为:

>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<
Run Code Online (Sandbox Code Playgroud)

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

Stuff 1
Stuff 2
Run Code Online (Sandbox Code Playgroud)

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

  • 他们错了.为什么自动系统合并的任何文本格式比代码本身更难?这没有道理.我每天都在与XCode项目上的其他人一起工作多年,每次应用上面的合并策略(尽管这些天我只是告诉合并工具接受任何冲突的双方).这种方法很好用.现在的故事板,我需要在我声称有效之前进行更多实验. (4认同)
  • 这至少对于xcode 5来说是行不通的.似乎它使用了一些魔术数字,并在项目中添加某些内容时为所有资源重新生成它们.发生冲突时,您应该删除两个冲突的资源,手动添加它们,以便xcode可以再次生成这些神奇的数字. (2认同)

Bar*_*ark 24

不幸的是,除了在一次结账时手动进行更改然后签入新的"合并"项目之外,您无能为力.


mmi*_*uva 9

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

*.pbxproj merge=union

这将告诉git保持合并的两面,这将是你想要的绝大部分时间.


Man*_*uel 8

要手动解决合并冲突,请检查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
Run Code Online (Sandbox Code Playgroud)

检查每个 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 */; };
Run Code Online (Sandbox Code Playgroud)

注意:我不建议添加*.pbxproj merge=union.gitattribues文件以基本上忽略合并冲突,因为除非有复杂的脚本为您执行此操作,否则应始终手动检查冲突合并。