如何正确使用Git与XCode?

我一直是一个iphone开发者,最近我在工作stream中join了git。 到目前为止,我已经在http://shanesbrain.net/2008/7/9/using-xcode-with-git上使用了git设置。

这些设置告诉git从合并中排除* .pbxproj? 有这样的真实原因吗? 例如,当我将一个文件添加到项目中并推送到原来的位置时,我的同伴开发人员将不会将这个文件添加到他们的xcode项目中。 然后,如果其中一个build立一个版本,这个文件可能不包括在内。 我不应该让git处理项目文件的合并吗? 有人可以解释为什么或为什么不把这个文件合并,以及如何正确处理文件被添加到项目的情况。 谢谢。

自从SDK发布以来,我一直在iPhone应用程序上工作,大部分时间花在与多个开发人员合作的团队上。

事实是,禁止合并.pbxproj文件的方式会更有害。 正如你所说,当你添加一个文件,除非其他人获得该文件,他们还必须将其添加到他们的项目 – 在任何大小的应用程序,这很糟糕,它也带走了源代码控制的巨大好处,因为你不能通过git真正恢复到完整的早期项目状态。

.pbxproj文件只是一个属性列表(类似于XML)。 从经验来看,如果两个人同时添加了文件,那么你得到的唯一合并冲突就是如此。 99%的合并冲突情况下的解决scheme是保持合并的双方,这对git至less简单地涉及删除任何>>>>,<<<<和====行。 事实上,这是很常见的,我已经创build了一个简单的shell脚本来修复从git的合并状态的.pbxproj文件,我从项目目录(在类级别)运行它:

#!/bin/sh projectfile=`find -d . -name 'project.pbxproj'` projectdir=`echo *.xcodeproj` projectfile="${projectdir}/project.pbxproj" tempfile="${projectdir}/project.pbxproj.out" savefile="${projectdir}/project.pbxproj.mergesave" cat $projectfile | grep -v "<<<<<<< HEAD" | grep -v "=======" | grep -v "^>>>>>>> " > $tempfile cp $projectfile $savefile mv $tempfile $projectfile 

最坏的情况下,如果它失败(你问XCode加载项目,并加载失败),你只需删除.pbxproj文件,从git检查出主,并重新添加你的文件。 但是,我从来没有在使用这个脚本的许多个月里发生过这种情况,而且还和其他一些开发人员一起在iPhone应用程序上全职工作。

另一个选项(在下面的注释中指出),您可以尝试使用代替脚本,是将此行添加到.gitattributes文件中:

 *.pbxproj text -crlf -diff -merge=union 

然后,git将总是将.pbxproject文件的合并的两侧,与我提供的脚本具有相同的效果,没有任何额外的工作。

最后,这里是我完整的.gitignore文件,显示我所做的设置忽略,因为有一些你不想要的东西 – 在我的情况下,真的只是emacs残余和整个构build目录:

 # xcode noise build/* *.pbxuser *.mode1v3 *~ # old skool .svn # osx noise .DS_Store profile 

这适用于Xcode 4.6和Git 1.7.5。

用这个添加和提交.gitattributes文件:

 *.pbxproj binary merge=union 

我已经与其他团队成员testing过,效果很好。

取自: http : //robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap

坦率地说,现有的答案是误导性的。

如果您从不删除或重命名文件,那么使用merge=union策略( merge=union strategy)可以直接结合不同提交的差异,这是一个好主意。

但是,在现实世界中,我们有时需要删除或重命名文件。 在不加修改的情况下合并差异会造成很多问题 ,这些问题通常会导致“工作空间完整性 – 无法加载项目”问题,这使得您甚至无法运行项目。

我到目前为止的最佳解决scheme是:

1)devise好项目并在开始时添加所有需要的文件,所以你很less需要改变project.pbxproj

2)使你的function很小。 不要在分支上做太多的事情。

3)出于任何原因,如果您需要修改project.pbxproj的文件结构并产生冲突,请使用您最喜欢的文本编辑器手动解决它们。 当你的任务很小时,冲突可能很容易解决。

简单的答案是,即使你没有在.gitattributes包含这一行,也可能无法轻松合并.pbxproj的两个修改版本。 把git当作二进制文件处理会更好。

看到这里的细节: Git和pbxproj

更新:即使这本书仍然赞同这个答案,我不再这样做。 我版本控制我的.pbxproj就像任何其他非二进制源文件。

我确实创build了一个Python脚本,可以处理XCode项目文件中的合并冲突。

如果你想尝试一下,你可以在这里查看: https : //github.com/simonwagner/mergepbx

你将不得不安装它作为一个合并驱动程序,所以当你的项目文件中有合并冲突时会自动调用它(README.md会告诉你如何去做)。

它应该比使用merge=union更好,因为mergepbx理解项目文件的语义,因此将正确地解决冲突。

然而,该项目仍然是阿尔法,不要指望它了解每个项目文件。