如何正确使用Git与XCode?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

我做iPhone开发人员已经有一段时间了,最近我在工作流程中加入了git。

这些设置告诉git排除*.pbxproj来自合并?这样做有什么真正的理由吗?例如,当我向项目添加一个文件并将其推入原点时,我的同事开发人员将不会将该文件添加到他们的Xcode项目中。然后,如果其中一个构建了一个版本,则可能不包括该文件。难道我不应该让git来处理项目文件的合并吗?请有人解释为什么或为什么这个文件应该在合并中,以及当文件被添加到项目时如何正确地处理这种情况。谢谢。

提问于
用户回答回答于

自从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中签出主文件,然后重新添加文件。但在这个脚本使用的许多月中,我从未见过这种情况,也从未与其他几个开发人员一起全职处理iPhone应用程序。

可以尝试使用的另一个选项(在下面的注释中指出)是将这一行添加到.gitproperties文件中:

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

然后,git将始终对.pbxproject文件进行合并,其效果与我仅提供的脚本相同,无需任何额外工作。

最后,这里是我完整的.gitignore文件,它显示了设置好要忽略的内容,因为有一些事情您不想要--在我的例子中,实际上只是emacs残留物和整个构建目录:

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

# old skool
.svn

# osx noise
.DS_Store
profile
用户回答回答于

这在Xcode 4.6和Git 1.7.5中适用于我。

添加并提交.gitproperties文件如下:

*.pbxproj binary merge=union

我和另一个团队成员一起测试过这个,效果很好。

扫码关注云+社区