在版本控制系统中,Xcode 5的*.xccheckout文件应该被忽略吗?

158

苹果公司在Xcode 5中引入了一种新的与项目相关的文件类型:"xccheckout"。

该文件位于".xcodeproj/project.xcworkspace/xcshareddata/"目录下,似乎与项目的版本控制系统有关。

这里提供一个样例文件: http://pastebin.com/5EP63iRa

我认为应该在版本控制系统下忽略此类文件,但我不能确定。

所以,以下是问题:

  1. 应该忽略“xccheckout”吗?
  2. 它的目的是什么?

这个问题非常相关,因此我希望它在语法和句法上更加正确。 如果你是以英语为母语的人或者你非常擅长英语,我想请你帮忙检查我的语言。 谢谢! - Artem Abramov
1
苹果公司推出了一个新的。这里有一个示例文件: - Sofi Software LLC
3
我总是参考github/gitignore存储库来了解哪些文件应该被忽略 -> https://github.com/github/gitignore/blob/master/Objective-C.gitignore - eliocs
5个回答

109

应该检查Xcode 5 .xccheckout文件;一般来说,xcshareddata中的文件应该被提交。

.xccheckout文件包含有关工作区使用哪些存储库的元数据。对于单个存储库中的单个项目,这没有太大的区别。但是,如果你正在使用具有来自不同存储库的多个项目的工作区,则在工作区中存在.xccheckout文件可以使Xcode知道组成工作区的所有组件以及从何处获取它们。


8
如果不打算分享,苹果公司会将其存储在.xcuserdata中,因此应该包括在内。 - Joshcodes
4
就像我在回答中所说的一样,xccheckout文件包含工作区中使用的所有存储库的信息。不管他们使用什么SCM系统 - 这样的工作区可以在svn或git中,它的项目可以在混合的svn和git存储库中。 - Chris Hanson
72
看起来xccheckout包含每个开发者机器特定的键和名称...一旦我运行Xcode,它就会更改文件中的一些键,并将IDESourceControlWCCName更改为<string>our_company_api/string> -后者是我在克隆存储库时使用的名称。如果这个文件应该被共享,那么苹果公司做得相当糟糕。 - Herr Grumps
7
当我们在此文件中签入时,我的所有同事都会得到不同的 IDESourceControlProjectIdentifier ... 因此,每次提交时我们的 .xccheckout 都会被修改。-_- - Cœur
9
无论苹果最初的意图是什么,.xccheckout 文件在 Xcode 6 beta 上引起了一些疯狂的问题,我决定将它们从版本控制中删除。这似乎与某些缓存错误有关,我相信 Xcode 可以自动从版本控制中重新生成它们。 - eonil
显示剩余8条评论

63

*.xccheckout文件包含VCS元数据,因此不应将其检入VCS。

另一方面,检入此文件可能不会创建合并困难或其他问题。

如果您想忽略此文件(我建议这样做),则应将以下行添加到您的项目的.gitignore中:

*.xccheckout

Abizern解决方案无法用于工作区内的项目。当您使用工作区时,*.xccheckout文件的路径将为:<workspace-name>.xcworkspace/xcshareddata/<workspace-name>.xcchekout。实际上它会忽略你想要的更多内容。

编辑: 此文件用于管理Xcode对项目中可能存在的多个VCS系统的了解,请参见Chris Hanson的回答。对于99%的项目来说,.xccheckout文件是过度配置。


1
如果您能扩展一下这个声明“它实际上忽略了比您想要的更多”,那将是非常好的。具体来说,应该检查哪些其他文件放入该文件夹中的一些示例。 - Mark Edington
跟进:我正在使用来自Adam的.gitignore,来源于这个问题。它作为gist可用,并且有一些关于xcshareddata文件夹内容的描述。 - Mark Edington
@Mark:它忽略了 project.xcworkspace/。现在可能还好,但我不会指望在新的 Xcode 版本中仍然如此。 - Berik
6
这个答案是不正确的,GitHub 提供给开发者的标准 .gitignore 文件不应该包含 *.xccheckout - Chris Hanson
2
自从引入这个文件后,我已经将它包含在我的仓库中,但最近开始从所有的仓库中删除它。这个东西总是创建合并冲突,尤其是在包含我的框架作为子模块的项目中。而且,由于我使用 git 进行子模块管理,所以这个文件对我毫无用处。苹果,你很努力,谢谢,但我还是不需要。 - Pascal
显示剩余6条评论

38

这要看情况。该文件包含对你使用的远程仓库的引用。如果你使用像Perforce或Subversion这样的集中式版本控制系统,则每个人的远程仓库都是相同的,因此你可以并且应该将该文件进行检入。

如果你使用Mercurial或git等分布式版本控制系统,但像CVCS一样使用它(换句话说,每个人从共享仓库直接克隆到自己的个人工作空间),那么你仍然可能想要进行检入。

但是,如果你使用DVCS,每个人都有自己的远程克隆,例如在GitHub的标准使用模式下,你不想检入此文件。如果你这样做了,你的Pull Requests将会要求将你的仓库设置复制到每个人的xccheckout文件中,但是你的仓库设置与其他人的不同,因为你们都在使用不同的远程仓库。


1
这个答案对我来说似乎是最好的。将它们检入会导致我们团队提交的差异信息过于冗杂。我在.gitignore中添加了以下内容以将它们排除在外: ** / * .xcworkspace / xcshareddata / * .xccheckout我仍然不明白为什么苹果选择要冗余存储这些信息,因为这些信息已经在.git文件夹中了(我唯一的猜测是为了使事情在版本控制系统中保持一致)。 - Juan Carlos Méndez

20

是的,Project.xccheckout文件应该提交到您的代码库中。Xcode使用此文件告知他人打开工作区所使用的整个源代码控制存储库列表以及工作副本与工作区相对位置的位置,无论这些存储库是Git、SVN还是两者皆有。

当您打开工作区时,Xcode将使用Project.xccheckout文件通知用户,其中包含了形成工作区的其他存储库,并询问应该检查哪些存储库。在检出附加存储库时,Xcode会将工作副本放置在相同的工作区相对文件夹结构中,就像生成Project.xccheckout文件时一样。

正如Chris Hanson所说,对于单存储库、单项目的工作区可能没有影响,但对于更复杂的情况,这将非常方便。

您可以在WWDC 2013会议视频《了解Xcode中的源代码控制》中找到更多信息;相关部分从大约15分钟开始。


这个文件只有在你使用Xcode进行源代码管理时才有用,否则你根本不需要这个文件。如果你使用git forks工作,那么这个文件就更加不必要了,因为每个开发者的仓库路径都是唯一的。 - Carlos Ricardo

3
这是我在Xcode中的.gitignore文件内容。
#Xcode
*.xcuserstate
project.xcworkspace/
xcuserdata/

这样做可以将与项目外观的本地状态有关的任何内容保留在代码库之外。

xccheckout 文件位于此处,因此默认情况下不会被系统跟踪。

Xcode 已经更好地分离出需要共享和需要保留在本地的内容。例如;这些行将忽略默认的构建方案,这是可以接受的,因为您可以标记特定的构建方案为共享,并将它们放置在一个不被忽略的目录中。

断点会被忽略,但是你可以标记特定的断点作为跨项目共享,并将它们放置在一个未被忽略的目录中。


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