【问题标题】:Xcode Project file git merge conflictXcode项目文件git合并冲突
【发布时间】:2012-10-06 03:13:13
【问题描述】:

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

我从 Github 克隆了 mapbox-ios-sdk,破解了它,现在远程 master 已经改变了。当我尝试将远程更改拉入本地时,合并后项目文件中会出现合并冲突。 (具体来说,我指的是.xcodeproj中的project.pbxproj)

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

我应该弄清楚如何手动解决冲突还是​​有更好的方法来处理这个问题?

【问题讨论】:

  • 我在使用 kdiff3 和 Sourcetree 时取得了不错的效果。大多数冲突都会自动解决;那些没有在视觉上呈现的。我最糟糕的情况是通过 Xcode 项目导航器将一两个文件重新添加到项目中。

标签: xcode git


【解决方案1】:

很多网站只是建议使用 .gitattributes 文件:

*.pbxproj merge=union

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

【讨论】:

【解决方案2】:

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

  1. 在添加文件之前,提交您的更改,然后从 master 拉取最新版本。如果有人添加了文件,您现在拥有最新的 .pbxproj
  2. 添加您的文件。
  3. 立即提交并将您的更改推送到主服务器(希望在其他合作者添加另一个文件之前)。

它很弱,但我们不喜欢手动解决 .pbxproj 冲突。

另外,请参阅这个 Stack Overflow 问题并获得很好的回答:How to use Git properly with XCode?

【讨论】:

  • 看起来这对一些合作者来说是完美的,虽然很麻烦。不过,您提供的链接似乎对大型项目很有帮助。在任何情况下,Xcode 项目似乎都不太适合源代码管理。 ://
  • 确实,我们只有三个合作者。
  • 这不是一个好策略,因为我们喜欢在这里进行有意义的、始终有效的提交。这会破坏这一点。
  • 这是一种可悲的工作方式,您推荐什么工具来处理合并?
  • 当您使用功能分支和/或超过一两个协作者时,这不可行。
【解决方案3】:

你应该检查我的脚本xUnique,它现在是在 Apple 采取行动之前合并 Xcode 项目文件的最佳解决方案。

它的作用和工作原理

  1. project.pbxproj 转换为 JSON 格式
  2. 在 JSON 中迭代所有 objects 并给每个 UUID 一个绝对路径,并使用路径的 MD5 十六进制摘要创建一个新 UUID
    • 这个 json 对象中的所有元素实际上都连接成一棵树
    • 我们使用其唯一属性为树的每个节点赋予路径属性;这个路径是根节点的绝对路径,
    • 将 MD5 十六进制摘要应用于节点的路径
  3. 将所有旧 UUID 替换为 MD5 十六进制摘要,并删除当前节点树中未使用的 UUID 和格式错误的 UUID
  4. 对包含childrenfilesPBXFileReferencePBXBuildFile列表的项目文件进行排序,并删除这些列表中的所有重复条目
    • 如果您想了解实现,请参阅 xUnique.py 中的 sort_pbxproj 方法;
    • 它是从我修改后的sort-Xcode-project-file 移植过来的,在排序PBXFileReferencePBXBuildFile 上有一些不同
  5. 通过不同的选项,您可以更灵活地使用 xUnique

查看README文件了解更多详情。

【讨论】:

  • 不,我们在我们的项目中使用了 25 个以上的子项目,它的作用就像一个魅力。
  • 尝试你的项目,希望它能帮助我们。谢谢!
  • 我们应该费心在 gitattributes 中使用它吗? *.pbxproj 二进制合并=联合
  • 它支持 cocoapods 吗?
  • @igrek 我没有将 cocoapods 与 xUnique 一起使用。如果 cocoapods 强制按照 24-char UUID 读写项目文件,是不行的。如果没有,它应该可以工作。
【解决方案4】:

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

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

但是如果你重命名你的项目的组并导致冲突,你将手动删除你原来组的多余行。

【讨论】:

  • 这是非常危险的。合并冲突意味着潜在的冲突意图,需要实际选择哪个是正确的。这忽略了这个问题,只是盲目地添加了这两个更改。
【解决方案5】:

当这是由于添加来自两个或多个协作者/分支的文件引起的(根据我的经验,迄今为止一直都是这种情况,可以通过查看差异来检查)我这样做:

  1. 通过“使用我们的”或“使用他们的”解决冲突(以添加最多的文件为准)。
  2. 提交(这会生成一个包含所有已添加文件但有些不在项目中的存储库)。
  3. 在 Xcode 中,使用“将文件添加到...”从其他协作者/分支添加缺失的文件(它们在项目目录中很容易找到,Xcode 会为您突出显示它们)。
  4. 提交。

(我不相信第 2 步真的有必要 - 但对我来说感觉更整洁)。

【讨论】:

    【解决方案6】:

    您也可以使用 Mergepbx 手动操作,如下所示

    1. 使用 brew 安装 Mergepbx

      brew install mergepbx

    2. 每次您的项目文件中出现冲突时运行一个命令来自动解决它们。

      git mergetool --tool=mergepbx PROJECT.pbxproj

    【讨论】:

      【解决方案7】:

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

      在 Finder 中打开 .pbxproj-> 右键单击文件选择显示包内容-> 选择 .pbxproj 文件用 TextEdit 打开它-> 它将显示如下冲突线。

      <<<<<<< HEAD"
      // head changes
      ===========
      // Your changes
      >>>>>>>>
      

      您已从 head Changes 和您的更改中选择正确的一项,然后删除其余的。 现在提交你的代码

      git add .
      git commit -m"conflict resolved"
      git status // Check you files status
      

      如果一切正常,请推送您的代码。

      git push
      

      【讨论】:

        【解决方案8】:

        我制作了一个应用程序,用于在出现此类问题时修复 Xcode 项目文件中的内容。不幸的是,您仍然必须先进行一些手动合并。 https://itunes.apple.com/us/app/xsaviour/id1449886415?mt=12

        【讨论】:

          【解决方案9】:

          如果一切都失败了,虽然很乏味。您可以在您的 git 客户端中打开您的 pbxproj,然后手动逐个文件地检查并确保每个文件都被删除或有 4 行(6 次出现)。

          【讨论】:

            猜你喜欢
            • 2018-07-10
            • 2011-07-15
            • 2017-07-24
            • 1970-01-01
            • 2015-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多