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

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

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

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


谢谢大家!

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

最好的办法可能是只接受您的版本或他的整个版本,而不尝试将两者结合起来。此外,考虑所讨论的文件是否应该是存储库中的所有内容;让每个人都有自己的版本可能更合适


查看有关如何解决冲突的信息。

我使用git,但我们看到了相同的问题-如果两个人添加文件,则存在合并冲突

但通常情况下,编辑是非常容易的。只需使用文本编辑器进入project.pbxproj文件,并查找合并冲突部分-通常这是由以下内容标记的:

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

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

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

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

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

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

  • 尝试在mercurial中进行合并:

    hg update FEATURE_BRANCH
    hg merge default
    *mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
    
  • 开放Xcode

  • 从顶部工具栏中,选择Xcode->Open Developer Tool->FileMerge
  • 在左侧,打开冲突的“project.pbxproj”文件(其中包含合并冲突标记的文件)
  • 在右侧,打开“project.pbxproj.orig”
  • 选择文件->保存合并并保存在“project.pbxproj”文件上
  • 然后回到命令行:

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  • 吃蛋糕,因为你已经做好了

  • 我创建了一个工具“xUnique”,它很管用

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

    *.pbxproj merge=union

    这将告诉git保留合并的双方,这在大多数情况下都是您想要的。

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

  • 接受“一切”
  • 将文件重新导入到项目中
  • 我写了一个bash脚本来处理上面的(1)

    请注意,这只会解决最常见的合并冲突情况

    #/bin/bash
    #
    #
    #
    如果[$#-eq 0]
    然后
    echo“文件必须作为参数提供,darnit!”
    出口1
    fi
    如果[$#-eq 2]
    然后
    echo“darnit,只能提供一个文件作为参数!”
    出口1
    fi
    echo“将从文件中删除行:$1
    grep-v“>”|grep-v“==”>out.tmp;mv out.tmp$1
    echo“已完成从文件中删除行:$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
    


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

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

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

  • Git签出主机
  • 复制
    project.pbxproj中的内容
  • Git签出到您的功能分支,并将其粘贴。(覆盖
    project.pbxproj
    中的当前内容)
  • react-native link
    

  • 到目前为止,我用于pbx文件的最好的可视化合并工具是VisualStudioCode的合并工具。我在Code app中打开pbx文件并修复冲突,然后再次打开XCode。

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

    我知道90%的冲突是明确的,您可以接受冲突中的两个更改,因此您不必担心,如果您耐心等待,您将解决冲突
    我发现使用像xUnique这样的工具会对你有很大帮助。.pbxproj文件是相当简单(如果详细的话)的文件,只要您有耐心,
    project.pbxproj
    是放在存储库中的一个重要文件,因为它告诉Xcode如何构建项目。不签入它相当于不签入
    Makefile
    。这个答案错误得很危险。不要只接受其中一个,否则您的项目将丢失文件。是的,它应该在存储库中,或者
    <<<<<<< 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
    
        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 */; };
    
    react-native link