Xcode Merge Driver 是一个脚本,用于自动解决 Xcode 项目文件(.pbxproj)中的 git 冲突。当项目定期合并包含项目文件修改的分支时,通常会发生这些冲突。每当我们添加、删除、移动或重命名文件和组时,项目文件都会被修改。由于 Xcode 处理这些更改的方式,即使我们更改文件夹结构中不同位置的文件和组,也会发生冲突。解决这些冲突是一项重复性的任务,我们可以将其自动化。
Xcode Merge Driver 是一个 git-merge-driver,当 .pbxproj 文件中发生冲突时,git 会自动调用它。为此,我们必须将其与 git 集成。我们可以通过三个步骤完成此操作
1:从 Release 页面 下载最新版本,并将 XcodeMergeDriver 可执行文件放入您的项目文件夹中。
Alternatively, check out the project and build it on your local machine.
2:将 XcodeMergeDriver 定义为自定义合并驱动程序。我们可以在 .git/config 文件中执行此操作
[merge "XcodeMergeDriver"]
name = Xcode .pbxproj project file merge driver
driver = ./XcodeMergeDriver %A %O %B
merge
块包含合并驱动程序的标识符,用于稍后引用合并驱动程序。
name
变量为驱动程序提供了一个人类可读的名称。
driver
变量用于构造运行合并驱动程序的命令。我们的合并驱动程序期望它可以传递给它的三个参数
%A
:包含当前版本的文件名%O
:包含共同祖先(基础)版本的文件名%B
:包含其他版本的文件名参数的顺序至关重要。您可以在官方文档中阅读有关如何定义自定义合并驱动程序的更多信息
3:更新 .gitattributes 文件
在项目 .gitattributes 文件中,我们必须定义为 .pbxproj 文件运行此合并驱动程序
*.pbxproj merge=XcodeMergeDriver
设置完成后,当 .pbxproj 文件中发生冲突时,git 将自动运行合并驱动程序
当合并发生冲突时,Xcode Merge Driver 将启动并分析更改。首先,它获取当前分支中相对于基础版本的更改集。然后,它获取基础分支和其他分支之间的更改集,并将这两个更改集合并为一个,同时尊重项目文件的逻辑结构。这种合并策略确保它可以正确解决所有冲突并生成有效的项目文件。
如果脚本成功解决冲突,则退出代码为 0;如果合并出错,则退出代码为 1。如果发生故障,XcodeMergeDriver 会将剩余的冲突留在当前版本文件中,您可以在其中手动解决它们。如果成功,合并结果将位于作为当前版本传递的文件中。
目前,驱动程序只能解决项目文件中以下部分中的冲突
处理这些部分涵盖了导致冲突的最常见文件操作
该脚本无法解决由 Xcode 项目中其他位置的更改引起的冲突,例如构建配置、scheme 等。您可以在脚本完成后手动修复这些冲突。
该项目使用 Swift 作为 Swift 包实现。它使用 Swift 的 argument parser 库创建一个命令行工具,该工具接受来自 git 的参数。
要在 Xcode 中运行项目,请执行以下步骤
您也可以使用 Cmd+R 运行项目,但您必须传递三个必需的参数。您可以在 XcodeMergeDriver scheme -> Edit scheme -> Run -> Arguments -> Arguments Passed On Launch 下执行此操作。
感谢您的贡献。要对项目进行更改,您可以克隆 repo 并在 Xcode 中打开 XcodeMergeDriver 文件夹。此文件夹包含以下内容
所有包含更改业务逻辑的新功能或错误修复的拉取请求都应包含验证更改的测试用例。