自从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