从 git 工作流程的角度来看,当多人协作时,故事板是一种巨大的痛苦。例如,.storyboard 文件中的 XML 有其起始位置<document>
tag's toolsVersion
and systemVersion
属性由最新文件操纵器正在运行的任何配置更改。精确同步每个人的 Xcode 版本似乎有帮助toolsVersion
, but systemVersion
无论如何,都会发生变化,具体取决于开发人员运行的特定 Mac 和/或 OS X 版本。
这是愚蠢的,但基本上是无害的。然而,令我们担心的是,在其他时候,只需在故事板打开一段时间后,就会自动对故事板进行一些其他更改。git pull
。也就是说,Alice 对故事板进行更改,提交并将其推送到存储库。然后,鲍勃提取爱丽丝的更改并打开故事板以进行进一步的更改。当他打开故事板时,文件图标立即变为已修改但未保存的状态,并且git status
表明已经发生了许多奇怪的变化。所有这一切,鲍勃都没有更改任何内容或亲自保存文件。
我们看到的最常见的自动化变化是整个系统的消失或重新出现。<classes>
故事板文件末尾附近的标记层次结构。我们还没有弄清楚是什么原因造成的。我们可能在各个 .lproj 目录中拥有故事板的多个本地化版本,当在 Interface Builder 中打开它们时,类层次结构可能会自发地从某些版本中删除并添加到其他版本中,或者在某些版本中单独保留。这会导致很多噪音git diff
,但它实际上并没有破坏任何功能。我们经常会选择性地将我们所做的实际更改添加到 git 索引中,提交这些更改,然后丢弃自发的、无意义的更改<classes>
变化。这是为了让提交保持小而美好,正如它们应该的那样。但最终,它变得太麻烦了,因为 Xcode 不断地重新进行更改,而有人只是愤怒地将它们与其他一些东西一起提交......这很好,直到其他人的 Xcode 决定想要免费将它们更改回来。明显的原因。 (我们的提交历史对此有很多脏话。)
还有其他人看到这种行为吗?这是 Xcode 错误还是我们的一台或多台开发人员 Mac 上的配置问题?在与 XIB 文件协作时,我们已经看到了一些类似的行为,但故事板似乎更容易受到此影响。
这不是一个错误,这是 Xcode 处理故事板文件方式的结果。
我正在为故事板文件编写一个差异和合并程序(GitHub 链接) https://github.com/marcinolawski/StoryboardMerge我花了几个小时分析 Storyboard 文件逻辑以及 Xcode 如何处理它。这是我发现的:
为什么故事板文件会发生奇怪的变化?Xcode 使用 NSXML API 将故事板文件解析为一些NSSet
基于逻辑树结构。当 Xcode 需要写入更改时,它会创建一个NSXMLDocument
基于逻辑树结构,清除storyboard文件并调用XMLDataWithOptions:
再次填充文件。由于集合不保留其元素的顺序,因此即使是最轻微的修改也可能会更改整个故事板 XML 文件。
为什么类别标签会随机消失或重新出现?
The <class>
部分只不过是内部 Xcode 缓存。 Xcode 使用它来缓存有关类的信息。缓存经常变化。上课时添加元素.h/.m
当 Xcode 怀疑文件已过时时,文件会被打开并删除(至少较旧的 Xcode 是这样的)。当您保存故事板时,current缓存的版本被转储,这就是为什么<class>
部分经常发生变化甚至消失。
我没有对 Xcode 进行逆向工程;我通过试验 Xcode 和故事板文件得出了这些观察结果。尽管如此,我几乎 100% 肯定它是这样工作的。
结论:
- 缓存部分并不重要;您可以安全地忽略其中的任何更改。
- 与您在所有论坛上找到的内容相反,合并故事板文件并不是一项复杂的任务。例如,假设您更改了
MyController1
故事板文档中的视图控制器。打开故事板文件,找到类似这样的内容<viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>
。
您可以安全地仅提交此部分中的更改并忽略其他所有内容。如果您更改了 Segues 或约束,也请提交任何已更改的内容“ory-XY-OBM”
里面。简单的!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)