针对多开发人员项目的Xcode+Git最佳实践



我可以创建一个repo,并将GitHub/BitBucket fine用于我自己的项目。我在与其他开发人员合作或试图在GitHub上派生项目时遇到了问题。

我知道其他的答案,比如开源项目中git存储库的最佳实践,但我想知道如何解决OSX/Xcode特定的问题。

  1. .DS_Store文件可能很麻烦。您可以使用.gitignore来防止,但如果它们已经包含在内,或者其他开发人员通过笨拙的git命令将它们重新添加进来,会发生什么?

  2. .xcodeproj将更改其他人的目录名和开发人员配置文件。进行合并或避免冲突的最佳方法是什么?

  3. 如果我已经从github项目中分叉或退出,我如何清理这些问题,并最大限度地减少维护人员的合并冲突?

如果人们有一个为Xcode创建的示例.gitigner,或者他们用来初始化他们的repo的脚本,那就太好了!

  1. .DS_Store放入.gitignore。然后,如果您还没有,请将.gitignore添加到回购中。(您不应该忽略.gitignore。)现在所有开发人员都将忽略.DS_Store文件。如果在将.DS_Store放入.gitignore之前错误地将其添加到了repo中,那么现在可以删除它们(在提交中),并且它们应该不会出现。

  2. xcodeproj是一个目录。此目录中唯一必须在存储库中的文件是project.pbxproj文件。我通常会通过将这些行放在我的.gitignore:中来忽略所有其他行

    *.xcuserstate
    project.xcworkspace/
    xcuserdata/
    

    您应该避免在构建设置中设置绝对路径。使用相对路径。

    调试和发布版本应该使用iPhone Developer作为代码签名标识,这样Xcode就会自动选择本地开发人员的配置文件。当你想创建一个IPA(用于分发)时,Xcode会提供用不同的身份重新签名,在这一点上,如果需要,你可以选择你的分发配置文件。

  3. 如果您试图使用github中出现这些错误的项目,您可以尝试让维护人员修复这些错误,也可以确保您不会在要向上游发送的相同提交中接触.DS_Store文件和代码签名标识。

关于.xcodeproj和合并冲突的第二个问题。

使用.gitattributes文件指定所有.pbxproj文件的合并冲突应使用merge=union策略处理,这意味着Git知道要合并冲突双方的更改,首先接受上游更改。

本文对进行了更深入的解释

我将逐一尝试:

I。只有当您需要从历史记录中完全删除文件时,才需要使用git filter-branch。如果这些文件不包含任何信用卡信息,那么我认为以下就足够了:

git rm --cached .DS_Store
git commit -m "{Your message}" 

然后将此文件添加到.gitignore并提交。

这将提交从存储库中删除文件,但会将文件保留在工作目录中。如果你推送它,然后其他人会撤回这个提交,他们可能会删除他们的文件,所以你必须传达这一点。通过提交.gitignore,您将阻止其他开发人员再次添加此文件。如果你不是维护人员,那么我认为你不应该做任何事情,而是向维护人员解决这个问题。

II。我坚信,任何性质的隐藏文件在大多数情况下都不应该因为这个原因而被放入存储库。因此,我认为您应该对.xcodeproj.DS_Store做同样的事情,并将其放入.gitignore并提交。.gitignore是上述规则的例外。

III。如果这些文件被正确地忽略,那么它们将来就不会有任何问题。如果他们已经在回购中,并且有人想要进行这样的清理,那么应该由维护人员完成,并在团队内部进行沟通。

希望能有所帮助!

git filter分支可能会帮助您从存储库中删除不需要的文件(.DS_Store文件)——请参见例如。https://help.github.com/articles/remove-sensitive-data

如果笨拙的git提交添加了文件,那么您应该能够将更正后的变更集重放到干净的存储库中。

如果已经添加了.DS_Store,那么.gitignore不会有太大帮助,但我认为这对您和其他人来说仍然是一个很好的资源。

当我开始一个项目时,我通常会查看这个列表,看看是否已经存在一个好的.gitignore。更具体地说,这是Objective-C.gitigner.

希望这些资源有一定的用处。

作为Mac用户,您应该下载一个支持Git Flow的工具,比如SourceTree。Git Flow将帮助您围绕合作者如何将代码提交到repo建立一些最佳实践,并至少降低合并冲突的频率和可管理性。对于一组适用于各种项目类型的gitignore文件,您可以访问GitHub并下载一个现成的文件。对于Xcode,他们将其列为Objective-C.gitignore。这是一个很好的起点,它甚至涵盖了Cocoapods。如果你使用的是外部库,你的项目应该使用CocoaPods,这样你就可以隔离代码,并将其放在你的repo之外,避免使用git子模块。

现在,当你发现一个文件已经像.DS_Store一样进入你的repo时,只需将其删除,然后继续。确保将其添加到签入项目的.gitignore文件中。

至于xcodeproj。。。文件中不应该有太多特定于用户的自定义,因为上面提到的gitignore会过滤掉这些内容。如果要共享某个方案,请确保选中"管理方案"下的"共享",然后签入该子目录中的文件。您应该使用证书的自动选择,所以唯一真正的选择是Developer或Distribution。您还应该利用Xcode中提供的变量,避免对完整路径进行硬编码。当尝试思考Plists想到的示例时,在这种情况下,您可能已经编写了/Users/me/MyProject/Resources/MyProject.plist,但应该使用$(SRCROOT)/resources/MyProject.plist

最新更新