Xcode和Git多开发者项目的最佳实践

20

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

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

  1. .DS_Store文件可能很麻烦。您可以使用.gitignore来防止它们,但如果它们已经被包含,或者另一个开发人员通过笨拙的git命令将它们重新添加回去,会怎样呢?

  2. .xcodeproj将更改目录名称和其他人的开发者配置文件。最好的合并方式是什么,或者如何避免冲突?

  3. 如果我已经从github项目中派生或拉取了代码,如何清理这些问题并尽量减少维护者的合并冲突?

如果有人有为Xcode创建的示例.gitignore,或者他们用于初始化其仓库的脚本,那就太好了!

6个回答

16
  1. .DS_Store 放入 .gitignore 中。然后,如果您还没有这样做,请将 .gitignore 添加到代码库中。(您不应该忽略 .gitignore)。现在所有开发人员都会忽略 .DS_Store 文件。如果之前错误地将任何文件添加到代码库中,您现在可以通过提交移除它们并使其保持远离。

  2. xcodeproj 是一个目录。该目录中唯一需要在代码库中的文件是 project.pbxproj 文件。我通常通过在我的 .gitignore 文件中放置以下行来忽略所有其他文件:

  3. *.xcuserstate
    project.xcworkspace/
    xcuserdata/
    

    在构建设置中,应避免使用绝对路径,而要使用相对路径。

    您的调试和发布版本应该使用 iPhone Developer 作为代码签名身份,这样Xcode将自动选择本地开发人员的配置文件。当您想要创建IPA(用于分发)时,Xcode会提供重新签名它的选项,并在此时您可以选择需要的分发配置文件。

    如果您正在尝试使用Github上的项目,而该项目存在这些错误,您可以尝试让维护者进行修复,或者确保您不要在希望发送到上游的提交中同时更改.DS_Store文件 和代码签名身份。


2
如果这个答案是正确的,你应该授予你的悬赏。 - wberry

5
针对第二个问题,涉及到.xcodeproj和合并冲突。
使用.gitattributes文件指定所有.pbxproj文件的合并冲突应该使用merge=union策略处理,这应该意味着Git知道从冲突的两侧合并更改,首先采用上游更改。
这篇文章在这里更深入地解释了它。

4

git filter-branch 可以帮助您从代码库中删除不需要的文件(例如 .DS_Store 文件)-- 请参见这里

如果一个笨拙的 git 提交已经添加了文件,您应该能够将更正后的变更集重放到一个干净的代码库上。


4
我会逐一尝试:
I. 仅当您需要完全删除历史记录中的文件时,才需要使用git filter-branch。如果这些文件不包含任何信用卡信息,那么我认为以下步骤就足够了:
git rm --cached .DS_Store
git commit -m "{Your message}" 

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

这将提交从仓库中删除该文件,但会保留该文件在工作目录中。如果您将其推送,然后其他人将拉取此提交,则可能会删除其文件,因此您必须进行通信。 通过提交.gitignore,您将防止其他开发人员再次添加此文件。 如果您不是维护者,则我认为您不需要做任何事情,而是向维护者提出此问题。

II. 我坚信任何性质的隐藏文件大多数时候都不应该被放入仓库,正是因为这个原因。因此,我认为您应该像处理.DS_Store一样处理.xcodeproj,将其添加到.gitignore并提交。 .gitignore是上述规则的例外。

III. 如果这些文件已经被正确地忽略,则将来不会出现任何问题。如果它们已经在仓库中,并且有人想要进行清理,则应由维护者完成,并在团队内进行通信。

希望这能帮助到您!


2
你说得没错,如果已经添加了.DS_Store文件,.gitignore文件就没什么用了,但我认为这对你和其他人仍然是一个好的资源。

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

希望这些资源对你有所帮助。


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

现在,当您发现像.DS_Store这样的文件已经进入您的repo时,只需将其删除并继续进行。确保将其添加到检入项目的.gitignore文件中。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接