Xcode项目文件git合并冲突

时间:2012-10-16 04:38:56

标签: xcode git

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

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

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

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

8 个答案:

答案 0 :(得分:26)

将新文件添加到项目时,

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

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

    另外,请参阅此Stack Overflow问题,并提供出色的回复:How to use Git properly with XCode?

答案 1 :(得分:13)

许多网站只建议使用.gitattribute文件:

*.pbxproj merge=union

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

答案 2 :(得分:4)

您应该检查我的脚本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
  6. 检查README文件以获取更多详细信息。

答案 3 :(得分:2)

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

  1. 通过"使用我们的"解决冲突或者"使用他们的" (无论哪个添加了最多的文件)。
  2. 提交(这会产生一个包含所有已添加文件的存储库,但有些文件不在项目中)。
  3. 在Xcode中使用"将文件添加到..."从其他协作者/分支添加丢失的文件(它们很容易找到,因为它们在项目目录中,Xcode有用地为您突出显示它们)。
  4. 提交。
  5. (我不相信第2步确实是必要的 - 但我感觉更整洁。)

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

  1. 使用brew安装Mergepbx

      

    brew install mergepbx

  2. 每次项目文件中存在冲突时运行命令以自动解决它们。

      

    git mergetool --tool = mergepbx PROJECT.pbxproj

答案 6 :(得分:1)

我需要在我的分支中获取主代码因此,我是从master那里拉过来的,我在.pbxproj文件中进行了更改,而master具有不同的配置。因此,这在.pbxproj文件中显示了冲突。请按照以下步骤解决它

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

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

您已从“更改”标题中选择了正确的一个,然后您的更改又删除了其余的。 现在提交您的代码

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

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

git push

答案 7 :(得分:-1)

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