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

时间:2010-01-05 04:19:50

标签: iphone svn xcode conflict

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

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

谢谢!

13 个答案:

答案 0 :(得分:130)

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

通常编辑很简单。只需使用文本编辑器进入project.pbxproj文件,然后查找合并冲突部分 - 通常用以下内容标记:

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

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

Stuff 1
Stuff 2

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

答案 1 :(得分:24)

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

答案 2 :(得分:5)

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

*.pbxproj merge=union

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

答案 3 :(得分: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-&gt;打开开发人员工具 - &gt; FileMerge
  4. 在左侧,打开冲突的'project.pbxproj'文件(包含合并冲突标记的文件)
  5. 在右侧,打开“project.pbxproj.orig”
  6. 选择文件 - &gt;保存合并并保存'project.pbxproj'文件
  7. 然后返回命令行:

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  8. 因为你做完就吃蛋糕

答案 4 :(得分:2)

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

  1. 接受&#34;一切&#34;
  2. 将文件重新导入项目
  3. 我写了一个负责上述(1)的 bash-script

    请注意,这只会解决最常见的合并冲突问题!

    #!/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
    

答案 5 :(得分:2)

要手动解决合并冲突,请检查每个冲突项目的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文件中来基本上忽略合并冲突,因为除非有复杂的方法,否则始终应手动检查冲突的合并脚本为您完成任务。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

您可以尝试此操作,而不是手动处理这些冲突。
假设您在要素分支上。

  1. Git结帐主数据。
  2. 复制project.pbxproj中的内容
  3. 将checkout转到功能分支,并将其粘贴。(覆盖project.pbxproj中的当前内容)
  4. 运行

    react-native link
    

答案 8 :(得分:0)

我创建了一个工具&#34; xUnique&#34; https://github.com/truebit/xUnique,它有效!

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

我知道90%的冲突都是明确的,您可以接受冲突中的两种更改,因此您不必担心如果有耐心就能解决问题 我发现使用xUnique之类的工具可以为您带来很多帮助的方式

答案 12 :(得分:-25)

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

查看有关如何解决冲突的documentation