代码之家  ›  专栏  ›  技术社区  ›  rickharrison

如何在Xcode中正确使用Git?

  •  88
  • rickharrison  · 技术社区  · 15 年前

    我做过一段时间的iPhone开发人员,最近在我的工作流程中加入了Git。我使用了上的Git设置 http://shanesbrain.net/2008/7/9/using-xcode-with-git 到目前为止我的工作流程。

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

    5 回复  |  直到 6 年前
        1
  •  129
  •   Adam S    10 年前

    自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
    
        2
  •  8
  •   oneyenjug    12 年前

    这在xcode 4.6和git 1.7.5中适用。

    添加并提交.gitattributes文件:

    *.pbxproj binary merge=union
    

    我已经和另一个团队成员测试过了,效果很好。

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

        3
  •  6
  •   Brian    11 年前

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

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

    然而,在现实世界中,有时我们确实需要删除或重命名文件。合并差异而不做任何修改 很多问题 在这种情况下,这些问题通常会导致“工作区完整性-无法加载项目”问题,这使得您甚至无法运行项目。

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

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

    2)使你的特征变小。不要在一个分支中做太多的事情。

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

        4
  •  3
  •   Community CDub    8 年前

    简短的回答是,即使你不把那一行包括进来 .gitattributes ,您可能无法轻松合并.pbxproj的两个修改版本。Git最好把它当作二进制。

    详情请参见此处: Git and pbxproj

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

        5
  •  2
  •   Simon    11 年前

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

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

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

    它应该比使用好得多 merge=union 作为 mergepbx 理解项目文件的语义,从而正确解决冲突。

    然而,这个项目仍然是阿尔法的,不要期望它理解所有的项目文件。