繁体   English   中英

Xcode 项目文件 git 合并冲突

[英]Xcode Project file git merge conflict

在Xcode中,工程文件中避免Git冲突的最佳方法是什么? (我在manual git,不是用git的Xcode接口)

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

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

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

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

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

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

另外,请参阅此堆栈溢出问题,并给出了很好的回答: How to use Git correct with XCode?

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

*.pbxproj merge=union

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

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

它的作用和工作原理

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

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

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

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

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

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

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

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

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

  1. 使用 brew 安装Mergepbx

    brew安装mergepbx

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

    git mergetool --tool=mergepbx PROJECT.pbxproj

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

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

我也遇到了同样的问题,于是在Swift写了一个工具,可以解决文件和组的增删改名冲突。 您可以将其设置为 git 合并驱动程序,以便脚本在您合并分支时自动运行。

你可以在这里查看: XcodeMergeDriver

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM