我可以创建一个仓库,并为我自己的项目使用GitHub / BitBucket。我在与其他开发人员合作或尝试在GitHub上分叉项目时遇到了问题。
我知道其他答案,例如Best practices for git repositories on open source projects,但我想知道如何解决OSX / Xcode特定问题。
.DS_Store 文件可能很痛苦。您可以使用 .gitignore 来阻止,但如果已经包含它们会发生什么,或者其他开发人员通过笨拙的git命令将它们重新添加?
.xcodeproj 会更改其他人的目录名称和开发人员个人资料。合并或避免冲突的最佳方式是什么?
如果我从github项目中分叉或拉出,我如何清理这些问题并最大限度地减少维护者的合并冲突?
如果人们为Xcode创建了一个示例 .gitignore ,或者他们用来初始化他们的回购的脚本,那就太棒了!
答案 0 :(得分:15)
将.DS_Store
放入.gitignore
。然后,如果您还没有,请将.gitignore
添加到回购。 (您不应忽略.gitignore
。)现在所有开发人员都会忽略.DS_Store
个文件。如果在将.DS_Store
放入.gitignore
之前错误地将任何内容添加到回购邮件中,您现在可以删除它们(在提交中)并且它们应该保持不变。
xcodeproj
是一个目录。此目录中唯一必须位于存储库中的文件是project.pbxproj
文件。我通常会将这些行放在.gitignore
:
*.xcuserstate
project.xcworkspace/
xcuserdata/
您应该避免在构建设置中放置绝对路径。使用相对路径。
您的调试和发布版本应使用iPhone Developer
作为代码签名标识,以便Xcode自动选择本地开发人员的配置文件。当您想要创建IPA(用于分发)时,Xcode将提供使用不同身份重新签名的权限,此时您可以根据需要选择分发配置文件。
如果您正在尝试使用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知道合并来自双方的更改冲突,首先考虑上游变化。
答案 4 :(得分:1)
你是正确的,如果已经添加.DS_Store,.gitignore将没有多大帮助,但我认为这对你和其他人来说仍然是一个很好的资源。
当我开始一个项目时,我通常会查看这个list以查看是否存在一个好的.gitignore。更具体地说,this一个是Objective-C .gitignore。
希望这些资源有用。
答案 5 :(得分:1)
作为Mac用户,您应该下载支持SourceTree的Git 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
。