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

时间:2012-10-10 10:17:25

标签: xcode git version-control github bitbucket

我可以创建一个仓库,并为我自己的项目使用GitHub / BitBucket。我在与其他开发人员合作或尝试在GitHub上分叉项目时遇到了问题。

我知道其他答案,例如Best practices for git repositories on open source projects,但我想知道如何解决OSX / Xcode特定问题。

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

  2. .xcodeproj 会更改其他人的目录名称和开发人员个人资料。合并或避免冲突的最佳方式是什么?

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

  4. 如果人们为Xcode创建了一个示例 .gitignore ,或者他们用来初始化他们的回购的脚本,那就太棒了!

6 个答案:

答案 0 :(得分:15)

  1. .DS_Store放入.gitignore。然后,如果您还没有,请将.gitignore添加到回购。 (您不应忽略.gitignore。)现在所有开发人员都会忽略.DS_Store个文件。如果在将.DS_Store放入.gitignore之前错误地将任何内容添加到回购邮件中,您现在可以删除它们(在提交中)并且它们应该保持不变。

  2. xcodeproj是一个目录。此目录中唯一必须位于存储库中的文件是project.pbxproj文件。我通常会将这些行放在.gitignore

    中,从而忽略所有其他行
    *.xcuserstate
    project.xcworkspace/
    xcuserdata/
    

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

    您的调试和发布版本应使用iPhone Developer作为代码签名标识,以便Xcode自动选择本地开发人员的配置文件。当您想要创建IPA(用于分发)时,Xcode将提供使用不同身份重新签名的权限,此时您可以根据需要选择分发配置文件。

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

答案 1 :(得分:4)

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

如果笨拙的git提交已添加文件,您应该能够将更正的更改集重播到干净的存储库。

答案 2 :(得分:4)

我将逐一尝试:

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

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

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

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

II。我坚信,任何性质的隐藏文件大部分时间都不应该完全放入存储库中。因此,我认为您应该使用 .xcodeproj 执行与 .DS_Store 相同的操作,并将其放入.gitignore并提交。 .gitignore是上述规则的例外情况。

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

希望有所帮助!

答案 3 :(得分:4)

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

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

This article explains it in a bit more depth

答案 4 :(得分:1)

你是正确的,如果已经添加.DS_Store,.gitignore将没有多大帮助,但我认为这对你和其他人来说仍然是一个很好的资源。

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

希望这些资源有用。

答案 5 :(得分:1)

作为Mac用户,您应该下载支持SourceTreeGit Flow工具。 Git Flow将帮助您建立一些关于协作者如何将代码提交到repo的最佳实践,并且至少使合并冲突不那么频繁且易于管理。对于各种项目类型的一组gitignore文件,您可以转到GitHub并下载一个已准备就绪的文件。对于Xcode,他们将其列为Objective-C.gitignore。这是一个很好的起点,甚至涵盖Cocoapods。如果您正在使用外部库,您的项目应该使用CocoaPods,以便您可以隔离该代码并将其保留在repo之外并避免使用git子模块。

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

至于xcodeproj ...由于上面提到的gitignore过滤掉了,因此在用户特定的文件中不应该有那么多的自定义。如果要共享方案,请确保检查“管理方案”下的共享,然后检入该子目录中的文件。您应该使用自动选择证书,因此唯一真正的选择是开发人员或分发。您还应该利用variables provided within Xcode来避免硬编码完整路径。当想到Plists的一个例子时,在这种情况下,你可能写了/Users/me/MyProject/Resources/MyProject.plist,但应该使用$(SRCROOT)/resources/MyProject.plist