39

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

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

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

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

4

9 回答 9

31

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

*.pbxproj merge=union

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

于 2016-05-20T08:21:47.180 回答
30

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

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

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

另外,请参阅这个 Stack Overflow 问题并获得很好的回答:如何正确使用 Git 和 XCode?

于 2012-10-16T05:07:40.623 回答
5

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

它的作用和工作原理

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

检查README文件以获取更多详细信息。

于 2014-08-04T03:33:11.920 回答
2

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

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

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

于 2015-08-13T02:44:49.970 回答
2

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

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

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

于 2017-04-12T08:22:32.157 回答
1

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

  1. 使用 brew安装Mergepbx 。

    冲泡安装mergepbx

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

    git mergetool --tool=mergepbx PROJECT.pbxproj

于 2018-05-01T05:31:54.197 回答
1

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

在 Finder 中打开.pbxproj -> 右键单击​​文件选择Show Package Contents -> 选择 . pbxproj 文件使用 TextEdit- > 打开它,它将显示如下冲突行。

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

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

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

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

git push
于 2020-01-30T06:29:06.553 回答
0

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

于 2019-04-03T23:11:32.263 回答
0

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

于 2021-08-23T04:12:23.923 回答