【问题标题】:Git and pbxprojGit 和 pbxproj
【发布时间】:2010-12-05 16:40:56
【问题描述】:

我正在查看一个开源 Mac 应用程序,他们为 .gitignore 提供了一些建议值。他们是我所期望的......

但是,他们也建议在 .gitattributes 文件中添加条目:

*.pbxproj -crlf -diff -merge

我在 git 方面不是最了解的,所以我想知道 - 添加这条线到底有什么好处?具体做什么?我只在one project 中看到过这个建议,如果这是正常做法,我本来希望现在在其他地方看到它。所以我很好奇它是如何具体应用于 pbxproj 文件的。

【问题讨论】:

标签: xcode git


【解决方案1】:

pbxproj 文件并不是真正的人类可合并的。虽然它是纯 ASCII 文本,但它是 JSON 的一种形式。本质上,您希望将其视为二进制文件。

以下是各个标志的作用:

-crlf:不使用crlf cr转换

-diff:不区分文件

-merge:不要尝试合并文件

来自 Scott Chacon 的 Pro Git

有些文件看起来像文本文件,但 出于所有意图和目的是 视为二进制数据。例如, Mac 上的 Xcode 项目包含一个 以 .pbxproj 结尾的文件,即 基本上是一个 JSON(纯文本 javascript数据格式)数据集 由 IDE 写入磁盘 记录您的构建设置等。 虽然它在技术上是一个文本文件, 因为都是ASCII,你不想要 对待它,因为它是 真正的轻量级数据库——你 如果两个人不能合并内容 改变了它,差异通常不是 有帮助。该文件旨在 被机器消耗。本质上,你 想把它当作一个二进制文件。

【讨论】:

  • 根据我(诚然有些有限)的经验,非常简单的更改(例如添加新文件)通常可以合并到 .pbxproj 文件中。如果你做任何更复杂的事情,比如让一个分支添加一个文件,另一个重新排列你的源组,那么你通常会得到一个损坏的 .pbxproj,但对于简单的东西,它通常是可行的。我不确定将 .pbxproj 文件视为二进制文件是否更好。
  • 我同意,我已经成功地使用 Perforce 合并 .pbxproj 文件。我非常小心,彻底检查了每一个变化。这需要时间,但肯定是可行的。到目前为止,我还没有得到一个损坏的项目文件。但我也知道我做了什么改变,我只是在一个方向上整合(只是没有整合所有东西)。
  • 99% 的情况下,合并项目文件失败的原因是两个人添加新文件。然后有一个冲突,通过接受这两个更改很容易解决。除此之外,如果一个人做了类似更改设置之类的事情,它很容易对其他更改感到厌烦。如果你仔细想想,JSON 真的就像 SCM 系统必须合并的任何其他代码一样。
  • Scott Chacon 的引述完全错误。 .pbxproj 格式完全是“人类”可读且易于修改的...顺便说一句,我最近开始对 .pbxproj 文件使用“merge=union”,到目前为止似乎还可以...
  • 加上原来的“Xcode”项目文件格式WAS二进制。他们不久前将其更改为人类可读的,以便处理驻留在版本控制系统中的项目。
【解决方案2】:

差异通常在提交时用于检查已更改的内容。所以我发现保持差异能力很有用,但只是防止合并。所以我在我的 .gitattributes 文件中使用它:

*.pbxproj -crlf -merge

另一方面,有人尝试对 pbxproj 文件使用 merge=union 吗?见:Should I merge .pbxproj files with git using merge=union?

【讨论】:

    【解决方案3】:

    我写了一个名为xUnique的python脚本来解决这个合并冲突问题。

    此脚本执行以下操作:

    • 将所有 24 个字符 UUID 替换为项目范围内唯一的 32 个字符 MD5 摘要,并删除所有未使用的 UUID(通常是由于之前不小心合并造成的)。这将防止重复的 UUID,因为不同的机器/Xcode 在此文件中生成不同的 UUID。 Xcode 确实可以识别它并且可以打开该项目。在此过程中,删除项目文件中的所有无效行
    • 对项目文件进行排序。我写了一个python versionsort-Xcode-project-file from Webkit team 有更多新功能:
      • 支持对PBXFileReferencePBXBuildFile 部分进行排序
      • 删除重复的文件/引用
      • 即使没有进行任何更改,也应避免创建新文件,这样可以减少使用此脚本后的提交次数

    更多xUnique详情及更新,请参考README

    【讨论】:

    • 好主意,但是使用起来很复杂。
    • @ScottyBlades 基本上它只是一个要执行的命令。 git hook 或 'build-post-action' 等其他选项只会让您更轻松地运行命令。
    【解决方案4】:

    在手动解决合并冲突后,我遇到了*.pbxproj 文件损坏的问题。或者,更常见的是,我的文件只是在合并后从工作树中“消失”。这让我很生气,因为我们在一个团队中工作,所以你可以想象它会很快变得多么混乱。

    所以,我已经测试了merge=union,到目前为止它运行良好。我知道如果同时删除或重命名文件将无济于事,但是对于添加新文件,它可以按预期工作:没有冲突并且文件在合并后不会消失。而且还可以节省不少时间。

    如果您想尝试一下,这就是我所做的。

    1) 创建一个全局 .gitattributes 文件。在终端中运行:

    touch ~/.gitattributes
    git config --global core.attributesfile ~/.gitattributes
    

    2) 这个命令应该在文本编辑器中打开它:

    open ~/.gitattributes
    

    3) 当文件打开时,添加这一行并保存文件:

    *.pbxproj binary merge=union
    

    完成。希望这会帮助像它帮助我一样的新读者。

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      相关资源
      最近更新 更多