Xcode项目文件git合并冲突



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

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

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

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

许多网站只是建议使用带有的.gitattributes文件

*.pbxproj merge=union

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

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

  1. 在添加文件之前,提交您的更改,然后从主文件中提取,以便获得最新的更改。如果有人添加了文件,则您现在拥有最新的.pbxproj
  2. 添加您的文件
  3. 立即提交并将您的更改推送给master(希望在另一个合作者添加另一个文件之前)

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

另外,请参阅这个Stack Overflow问题,并给出极好的回答:如何将Git与XCode一起正确使用?

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

它的作用;它的工作原理

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

查看自述文件以了解更多详细信息。

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

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

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

我需要在我的分支中获取主代码,所以,我从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

当这是由添加来自两个或多个合作者/分支的文件引起的(根据我的经验,到目前为止一直是这样,可以通过查看差异来检查)时,我会这样做:

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

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

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

  1. 使用brew安装Mergepbx。

    brew安装mergepbx

  2. 每次在项目文件中出现冲突时都运行一个命令以自动解决这些冲突。

    git mergetool--tool=mergepbx PROJECT.pbxproj

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

如果其他一切都失败了,尽管很乏味。您可以在git客户端中打开pbxproj,然后手动逐个文件,确保每个文件都被删除或有4行(6次)。

我也遇到了同样的问题,所以我在Swift中编写了一个工具,可以解决由于添加、删除、移动和重命名文件和组而产生的冲突。您可以将其设置为git合并驱动程序,以便在合并分支时脚本自动运行。

你可以在这里查看:XcodeMergeDriver

最新更新