Xcode更改未修改的故事板和XIB文件

JK *_*iho 129 xcode interface-builder storyboard xib ios

当多人合作时,故事板从git工作流角度来看是一种巨大的痛苦.例如,.storyboard文件中的XML具有其起始<document>标记toolsVersionsystemVersion属性,这些属性由最新文件操作符恰好运行的任何配置更改.大家同步的Xcode版本恰恰似乎帮助toolsVersion,但systemVersion变化不管是什么,这取决于具体的Mac和/或开发运行OS X的版本上.

这是愚蠢的,但大多是无害的.然而,令我们担心的是,在其他时候,只需在故事板之后打开它们,就会自动对故事板进行一些其他更改git pull.也就是说,Alice对故事板进行了更改,提交并将它们推送到存储库.然后鲍勃拉出爱丽丝的变化并打开故事板进行进一步的更改.他打开故事板的那一刻,文件图标立即变为修改,但是,未保存的状态,以及git status已发生的任何数量的变化怪异表演.所有这一切,没有鲍勃改变任何东西或自己保存文件.

我们看到的最常见的自动更改是<classes>故事板文件末尾附近整个标记层次的消失或重新出现.我们还没弄清楚造成这种情况的原因.我们可能在各种.lproj目录中有几个本地化版本的故事板,当在Interface Builder中打开它们时,类层次结构可能会自动从某些层次结构中删除并添加到其他版本中,或者单独留在某些层次结构中.这会导致很多噪音git diff,但实际上并没有破坏任何功能.我们经常会有选择地将我们所做的实际更改添加到git的索引中,提交那些,然后只丢弃自发的,荒谬的<classes>变化.这是为了保持提交小而好,因为它们应该是.然而,最终,由于Xcode不断重新进行更改,它变得太麻烦了,有人只是愤怒地提交它们以及其他一些东西......这很好,直到其他人的Xcode决定要将它们更改为否明显的原因.(我们的提交历史对此很多咒骂.)

是否有其他人看到这种行为?这是我们的一个或多个开发者Mac上的Xcode错误还是配置问题?我们在与XIB文件协作时已经看到了一些类似的行为,但故事板似乎更容易受此影响.

Mar*_*ski 77

这不是错误,这是Xcode处理故事板文件的结果.我正在编写故事板文件的差异和合并程序(GitHub链接),我花了几个小时分析故事板文件逻辑以及Xcode如何处理它.这是我发现的:

  • 为什么故事板文件会发生奇怪的变化? Xcode使用NSXML API将故事板文件解析为NSSet基于某种逻辑树结构.当Xcode需要编写更改时,它会NSXMLDocument根据逻辑树结构创建一个,清除storyboard文件并调用XMLDataWithOptions:再次填充文件.因为集合不保留其元素的顺序,即使最轻微的修改也可能改变整个故事板XML文件.

  • 为什么类标签会随机消失或重新出现?<class>部分只不过是一个内部Xcode缓存.Xcode使用它来缓存有关类的信息.缓存经常更改..h/.m当Xcode怀疑它们已经过时时,在打开和删除类文件时添加元素(至少较旧的Xcodes表现得像这样).保存故事板时,将转储当前版本的缓存,这就是该<class>部分经常更改甚至消失的原因.

我没有反向设计Xcode; 我通过试验Xcode和storyboard文件来做出这些观察.尽管如此,我几乎100%确定它是这样工作的.

结论:

  • 缓存部分并不重要; 你可以放心地忽略它的任何变化.
  • 与您在所有论坛上可以找到的内容相反,合并故事板文件并不是一项复杂的任务.例如,假设您MyController1在故事板文档中更改了视图控制器.打开故事板文件,找到这样的东西 <viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>.您可以安全地仅提交此部分中的更改并忽略其他所有内容.如果您更改了segues或约束,也可以提交“ory-XY-OBM”内部的任何内容.简单!

  • "这不是一个错误,这是Xcode如何处理故事板文件的结果."恭敬地,这句话的下半部分没有解释也没有合理化第一个.我将其修改为:"这是一个错误.它是一个[很遗憾未解决且非常烦人] XCode如何处理.xib文件的结果." 从XCode 5.x到6.2(今天,150311).xib文件没有被开发人员修改,只是在IB中查看,遭受了无偿的xml更改.这是影响生产力的严重错误.像"NBD,只是用git处理大块"这样的回应让我无言以对. (12认同)
  • 关于xcode diff/merge工具的任何更新?听起来它对这个社区来说非常有用. (8认同)
  • "我没有对Xcode进行逆向工程;我通过试验Xcode和storyboard文件来做出这些观察." 那*是*(浅层)逆向工程,而且它很酷**.:-) (7认同)

del*_*ser 17

这是XCode 4.5+中的一个错误,我希望它得到修复,是的它是一个PITA.

这是Apple的完整错误

如何避免Xcode对故事板文件的无偿编辑?


Phi*_*vin 11

通过git add -p对Xcode生成的任何文件(包括故事板,XIB,核心数据模型和项目文件)进行非常明智的使用,可以稍微减轻这个问题,所有这些文件都受到类似的瞬态修改,这些修改对实际接口/模型没有影响/项目.

我在故事板上看到的最常见的垃圾变化是系统版本号(正如你所提到的)以及该部分的不断添加和删除<classes>,我从未见过的遗漏导致问题.对于XIB,它是添加和删除<reference key="NSWindow"/>,甚至不是Cocoa Touch中的类.哇哇.

把它想象成大海:有高潮和低潮.让它洗过你.

啊.而已.

在暂存更改,重置垃圾更改以及进行干净提交时,可以忽略这些修改.

从技术角度来看,我在XIB上看到的故事板的唯一优势是Apple还没有扼杀FileMerge拒绝合并冲突的故事板.(FileMerge曾经能够合并XIB,但是新版本打破了.Thxxxx家伙!!!)

请在http://bugreporter.apple.com/上提交关于所有这些问题的大量错误!并且不要忘记在OpenRadar上创建条目.


Rob*_*Rob 6

在这里提出另一个答案,因为这种情况有了很大改善.表示StoryBoard的XIB文件的XML已经大大简化了.

我最近也咬了一口,开始使用Xcode中的界面来源代码控制.我已经在命令行上工作多年并且很开心,但界面很好,它允许你拆分提交,如果你使用链接到提交的票务系统,这非常重要.

无论如何,我今天注意到故事板上有一个变化,内置的差异显示我是文档标签(systemVersion)中的一个属性.所以没什么大不了的.

我读过一些文章,人们说SB因为合并问题而被禁止参加他们的团队.完全疯狂.他们是如此惊人,特别是现在他们内置了智能自动布局,如果你不使用它们,你真的错过了.