合并Xcode项目文件

37
在合并分支(我使用git)时,Xcode项目文件(Project.xcodeproj/project.pbxproj)经常会出现冲突。有时候处理起来很容易,但有时我最终得到一个损坏的项目文件,并不得不回滚。在最坏的情况下,我必须手动修复项目文件,例如拖入文件等,这可以作为第二个提交(可以与上一次提交压缩)。
有没有人有关于如何处理像Xcode项目文件这样大而复杂的文件的合并冲突的技巧?
编辑-- 一些相关的问题: Git和pbxproj 我应该使用merge=union选项将.pbxproj文件与git合并吗? 资源: http://www.alphaworks.ibm.com/tech/xmldiffmerge http://www2.informatik.hu-berlin.de/~obecker/XSLT/#merge http://tdm.berlios.de/3dm/doc/thesis.pdf http://www.cs.hut.fi/~ctl/3dm/ http://el4j.svn.sourceforge.net/viewvc/el4j/trunk/el4j/framework/modules/xml_merge/

有趣的问题。不幸的是,我认为没有解决方案 - 我很好奇是否有人会想出一个好的答案。如果没有,可以看看https://dev59.com/a1HTa4cB1Zd3GeqPOyCQ#3932613 :) - w-m
5个回答

9
  1. 将大型项目拆分成更小、更逻辑清晰的库/包。庞大的项目通常是设计不良的信号,例如一个承载了过多功能或过于庞大的对象。

  2. 设计易于重建。这也有助于编写需要通过多种工具或IDE进行构建的程序。我的许多“项目”可以通过添加一个目录来重新构建。

  3. 删除冗余的构建阶段。例如:我已经从所有项目中删除了“复制头文件”构建阶段。通过include指令显式地包含特定文件。

  4. 尽可能使用xcconfig文件。这也减少了更新构建时必须进行的更改数量。xcconfig文件定义了一组构建设置,并支持 #include。当你定义要使用的xcconfig时,你会从每个项目和目标中删除(大部分)用户定义的设置。

  5. 对于目标依赖关系:创建执行逻辑操作而不是物理操作的目标。这通常是一个Shell脚本目标或聚合目标。例如:“构建依赖项”、“运行所有单元测试”、“全部构建”、“全部清除”。这样,您就不必在每个步骤中维护每个依赖项的更改 - 就像使用引用一样。

  6. 为您的代码定义一个共同的“源树”,以及一个用于第三方源的第二个源树。

  7. 有外部构建工具可用。这可能是您的选择之一(至少对于某些目标而言)。

到这一步,xcodeproj将更加简单。它将需要较少的更改,并且非常容易重新构建。您可以深入探索这些概念,以进一步减少项目和构建的复杂性。


很好的建议,虽然它们是绕过而不是解决问题。1+6我已经在做了。4+5我会考虑的。2+7——你能提供更多信息吗? - Felixyz
是的,它们只是简单的项目文件/结构(并且更多地绕过问题而不是解决问题)。2)组织您的源文件、资源、测试用例等,以便通过将目录中的所有内容添加到项目中轻松重新创建任何目标(特别是,测试用例将驻留在另一个项目中,或者您将有一个专用于测试的第二个目标,您也将通过将unit_test dir中的所有内容添加到unit_test target来构建它)。通过这种方式,您可以编写和布局源文件(等),以便根据其(cont)重建任何目标的能力。 - justin
依赖关系、一个目录的全部内容以及xcconfig的添加。如果项目损坏或必须在另一个IDE(或Xcode版本)中使用,则导入需要不到1分钟。这还可以帮助保持未使用的位于主项目树之外。这还使得组合构建变得更加容易。如果你对导出和可见性相关的声明正确性有着强烈的追求(如果你正在开发非平凡程序,这一点绝对应该是一个关注点),那么你可以在很短的时间内进行组合构建。 - justin
  1. 有一些常见的选项,例如automake/make和cmake。组合构建也可以在非常大的构建中帮助(还可以减少编译时间)。使用外部构建系统或组合构建,项目不太可能经常更改。内部工具也很棒。使用内部工具,对xcproject的依赖取决于您编写工具的操作方式。使用概述的目录结构,您可以编写一个工具来编译指定目录的源代码,链接并输出对象到某个地方。在这种情况下,您只需要编写一行代码即可构建库。
- justin
完美的建议。谢谢@justin - Manish

4
你可以尝试使用这个脚本:https://github.com/simonwagner/mergepbx/ 它可以帮助你正确地合并Xcode项目文件。请注意,它目前仍处于测试阶段。
免责声明:我是mergepbx的作者。

西蒙,这个项目现在成熟了吗? - Alex Zavatone
2
好的,它对我有效 - 那么是的吗?不幸的是,由于没有关于项目文件格式的文档,无法确保它能够真正适用于所有情况。因此,它永远不会比“对我有效,目前没有人抱怨”更好。 - Simon
Simon - 在经历了多年的开发和质量保证之后,听到“嗯,这对我来说可以工作”这样的话让我感到害怕。也许这就是我们所拥有的一切,但仍然如此。 - Alex Zavatone
1
没有文档,我什么也做不了 :/。 另一方面,手动合并具有相同的风险(因为您也不会知道项目文件的工作方式)。 所以是的,不幸的是这是我们能得到的最好的结果。如果您想帮忙,可以查看 https://github.com/simonwagner/mergepbx/tree/master/test。它包含基本合并功能的测试用例和一些固定装置,用于测试解析和合并代码。 - Simon
使用这个工具已经超过2年了,没有遇到任何问题。感谢您的贡献...不幸的是,似乎在XCode 9.2中开始导致文件损坏。我会向您的代码库报告! - Christoph

2
我发现最好的方法是指示Git将.pbxproj文件视为二进制文件。这可以避免混乱的合并。
请在您的.gitattributes文件中添加以下内容:
*.pbxproj -crlf -diff -merge

1
这对物理合并有什么影响? - esbenr
6
如果这使文件有效成为二进制文件,那么这如何使合并变得更容易? - damian
1
请查看以下内容:http://robots.thoughtbot.com/xcode-and-git-bridging-the-gap引用:“由于此类文件使用的自定义格式,这正是我们想要的。当此文件出现合并冲突时,git将自动合并来自冲突双方的更改,首先应用上游更改。” - chakming

2

要比较两个Xcode项目,请打开FileMerge(打开Xcode并选择Xcode(从菜单窗格) -> 打开开发人员工具 -> FileMerge)。 现在点击“左侧”按钮并打开Xcode项目的主目录。 点击“右侧”按钮并打开要比较的Xcode项目的主目录。

现在点击“合并”按钮!

就是这样了!


1
如果您正在使用git,最简单的方法是:git config --global merge.tool opendiff(只需要执行一次),然后git mergetool将为您启动它。 - damian
1
我不清楚FileMerge是否特别支持Xcode项目文件? - Benjohn

0

另一个需要考虑的选项是可以帮助减少您遇到问题次数的方法。为了解释,我将称团队成员分支来自“develop”分支的分支。 在您的团队中有一个约定,即当项目文件被修改时,更改(以及任何其他必要的更改以确保构建完整性)都会在单独的提交中进行。然后将该提交挑选到develop分支上。计划在其分支中修改项目文件的其他团队成员可以将其挑选到其分支中,或者将其分支重新基于最新的develop。这种方法需要团队之间的沟通和一些纪律性。正如我所说,这并不总是可能的;在某些项目上,它可能会有很大帮助,在某些项目上则可能没有。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接