Xcode项目文件git合并冲突

Xcode项目文件git合并冲突,xcode,git,Xcode,Git,在Xcode中,避免项目文件中Git冲突的最佳方法是什么?(我使用的是手动git,而不是git的Xcode接口) 我已经从Github克隆了mapbox ios sdk,并对其进行了黑客攻击,现在远程主机已经更改。当我试图将远程更改拉入本地时,合并后项目文件中会出现合并冲突。(具体来说,我指的是.xcodeproj中的project.pbxproj) 我真的不认为项目文件应该放在忽略中,因为如果项目文件中有任何新文件,那么.pbxproj文件似乎会被更改。(或者我完全错了,这个文件应该被忽略?但

在Xcode中,避免项目文件中Git冲突的最佳方法是什么?(我使用的是手动git,而不是git的Xcode接口)

我已经从Github克隆了mapbox ios sdk,并对其进行了黑客攻击,现在远程主机已经更改。当我试图将远程更改拉入本地时,合并后项目文件中会出现合并冲突。(具体来说,我指的是.xcodeproj中的project.pbxproj)

我真的不认为项目文件应该放在忽略中,因为如果项目文件中有任何新文件,那么.pbxproj文件似乎会被更改。(或者我完全错了,这个文件应该被忽略?但很明显,它在mapbox ios sdk中并没有被忽略。人们毕竟需要这个项目文件。)但我以前在与另一个合作者的合作项目中也遇到过这种冲突,这使我无法完全使用Git


我应该找出如何手动解决冲突,还是有更好的方法来处理此问题?

.pbxproj将在向项目添加新文件时更改。如果两个或多个协作者同时添加文件(没有先获得彼此的更改),则会发生冲突。在我的项目中,我们通过在添加新文件之前和之后执行以下步骤来避免这种情况:

  • 在添加文件之前,提交您的更改,然后从主控文件中提取最新的文件。如果有人添加了文件,则您现在拥有最新的.pbxproj
  • 添加您的文件
  • 立即提交并将更改推送到主服务器(希望在其他合作者添加另一个文件之前)
  • 它很弱,但我们不喜欢手动解决.pbxproj冲突


    另外,看到这个堆栈溢出问题,回答非常好:

    你应该检查我的脚本,现在最好的解决方案是在苹果采取行动之前合并Xcode项目文件

    它的功能和工作原理
  • project.pbxproj
    转换为JSON格式
  • 在JSON中迭代所有
    对象
    ,给每个UUID一个绝对路径,并使用路径的MD5十六进制摘要创建一个新的UUID
    • 这个json对象中的所有元素实际上都是作为一棵树连接的
    • 我们使用树的唯一属性为树的每个节点赋予路径属性;此路径是根节点的绝对路径
    • 将MD5十六进制摘要应用于节点的路径
  • 用MD5十六进制摘要替换所有旧UUID,并删除当前节点树中未使用的UUID和格式错误的UUID
  • 对项目文件进行排序,包括
    子项
    文件
    PBXFileReference
    PBXBuildFile
    列表,并删除这些列表中的所有重复项
    • 如果您想了解实现,请参阅xUnique.py中的
      sort\u pbxproj
      方法
    • 它是从我的修改版移植的,在排序上有一些不同
      PBXFileReference
      PBXBuildFile
  • 通过不同的选项,您可以更灵活地使用xUnique

  • 查看文件了解更多详细信息。

    在大多数情况下,您可以通过以下代码修复合并,删除git添加的行:

    #!/bin/bash
    FILE={PRODUCT_NAME}.xcodeproj/project.pbxproj
    sed '/======/d' $FILE | sed '/<<<<</d' | sed '/>>>>>/d' > temp
    cat temp > $FILE
    rm temp
    
    #/bin/bash
    文件={PRODUCT_NAME}.xcodeproj/project.pbxproj
    sed'/====/d'$FILE | sed'//d'>临时
    cat temp>$文件
    室温
    

    但是,如果重命名项目组并导致冲突,您将手动删除原始组的额外行。

    许多网站建议将.gittributes文件与以下内容一起使用:

    *.pbxproj merge=union


    在尝试使用脚本之前,我们将尝试这种方法。如果我们发现任何问题,我一定会更新这篇文章。另外,如果其他任何人对此方法有意见,请包括。

    如果这是由于添加了来自两个或多个合作者/分支机构的文件造成的(根据我的经验,到目前为止一直如此,可以通过查看差异来检查),我会这样做:

  • 通过“使用我们的”或“使用他们的”(添加了最多文件的)解决冲突
  • 提交(这将生成一个repo,其中包含所有添加的文件,但有些文件不在项目中)
  • 在Xcode中,使用“将文件添加到…”来添加来自其他协作者/分支的丢失文件(它们很容易找到,因为它们位于项目目录中,Xcode会为您有效地突出显示它们)
  • 承诺

  • (我不认为第2步真的有必要,但我觉得更整洁)。

    您也可以使用Mergepbx手动执行以下操作

  • 使用brew安装

    brew安装mergepbx

  • 每次在项目文件中出现冲突时运行命令以自动解决冲突

    git mergetool--tool=mergepbx PROJECT.pbxproj


  • 我制作了一个应用程序,用于在Xcode项目文件出现问题时修复这些问题。不幸的是,您仍然需要先手动进行一些合并。

    我需要在我的分支中获取主代码,因此,我从主代码中提取代码,并且我在.pbxproj文件中进行了更改,主代码具有不同的配置。因此,.pbxproj文件中显示了冲突。请按照以下步骤解决此问题

    在Finder中打开.pbxproj 右键单击文件,选择“显示软件包内容”-> 选择.pbxproj文件,然后用文本编辑打开它-> 它将显示冲突线,如下所示

    <<<<<<< HEAD"
    // head changes
    ===========
    // Your changes
    >>>>>>>>
    
    如果一切正常,推送您的代码

    git push
    

    看起来这对一些合作者来说是完美的,尽管很麻烦。不过,您提供的链接似乎对大型项目非常有用。在任何情况下,似乎Xcode项目对源代码管理来说都不是很好/事实上,我们只有三个合作者。这不是一个伟大的战略,因为在这里我们希望有有意义的、始终有效的承诺。这是一种可悲的工作方式,你推荐什么工具
    git push