如何在Xcode中正确使用Git?

时间:2010-04-10 23:11:33

标签: ios objective-c xcode git

我有一段时间以来一直是iphone的开发者,最近我在我的工作流程中加入了git。到目前为止,我已使用http://shanesbrain.net/2008/7/9/using-xcode-with-git上的git设置作为我的工作流程。

这些设置告诉git从合并中排除* .pbxproj?这样做真的有原因吗?例如,当我将一个文件添加到项目并推送到源文件时,我的其他开发人员在拉出时不会将该文件添加到他们的xcode项目中。然后,如果其中一个构建版本,则可能不包含此文件。我不应该让git处理项目文件的合并吗?为什么或为什么不将此文件合并以及如何正确处理文件添加到项目中的情况?

5 个答案:

答案 0 :(得分:130)

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

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

.pbxproj文件只是一个属性列表(类似于XML)。根据经验,您可能获得的唯一合并冲突就是两个人同时添加了文件。 99%的合并冲突案例中的解决方案是保留合并的两面,对于git而言至少只需删除任何>>>>,<<<<<&= =线。事实上,这是非常常见的,我创建了一个简单的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中检出master,然后重新添加你的文件。但是我在这个脚本的使用数月内从未发生过这种情况,再次与其他几个开发人员一起在iPhone应用程序上全职工作。

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

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

然后git将始终对.pbxproject文件进行合并的两面,与我提供的脚本具有相同的效果而不需要任何额外的工作。

最后,这是我完整的.gitignore文件,显示我确实将它设置为忽略,因为有一些你不想要的东西 - 在我的情况下,实际上只是emacs残余和整个构建目录:

# xcode noise
build/*
*.pbxuser
*.mode1v3
*~

# old skool
.svn

# osx noise
.DS_Store
profile

答案 1 :(得分:9)

这适用于Xcode 4.6和Git 1.7.5。

使用以下命令添加并提交.gitattributes文件:

*.pbxproj binary merge=union

我已经与另一位团队成员进行了测试,效果很好。

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

答案 2 :(得分:5)

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

如果你从不删除或重命名文件,那么使用merge=union策略,它只是直接结合不同提交中的差异,是一个好主意。

但是,在现实世界中,我们确实需要删除或重命名文件。在没有任何修改的情况下合并差异会在这些情况下使 出现很多问题 ,这些问题通常会导致工作空间完整性 - 无法加载项目&#34;问题,这使你甚至无法运行项目。

到目前为止我得到的最佳解决方案:

1)设计项目并在开头添加所有需要的文件,这样您很少需要更改project.pbxproj

2)使你的功能变得微不足道。不要在分支机构做太多事情。

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

答案 3 :(得分:3)

简短的回答是,即使您不在.gitattributes中包含该行,您也可能无法轻松合并.pbxproj的两个修改版本。 git最好将其视为二进制文件。

详情请见此处:Git and pbxproj

更新:即使git book still agrees有了这个答案,我也不再这样做了。我版本控制我的.pbxproj就像任何其他非二进制源文件一样。

答案 4 :(得分:2)

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

如果您想尝试一下,可以在此处查看:https://github.com/simonwagner/mergepbx

您必须将其安装为合并驱动程序,因此当项目文件中存在合并冲突时会自动调用它(README.md将告诉您如何执行此操作)。

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

然而,该项目仍然是alpha,不要指望它能够理解那里的每个项目文件。