Git和pbxproj

35

我在查看一个开源的Mac应用程序时,他们给出了一些.gitignore的建议值。这些建议和我的预期相符...

然而,他们还建议在.gitattributes文件中添加以下条目:

*.pbxproj -crlf -diff -merge

我对git不太熟悉,所以我想知道-添加这行代码的好处是什么?它特别做什么?我只在这个项目中看到过这种建议,如果这是正常做法,我现在会期望在其他地方也看到它。因此,我对它如何特别适用于pbxproj文件很感兴趣。


该文章 https://dev59.com/ZHE85IYBdhLWcg3wx2n2 鼓励合并 .pbxproj 文件。 - Besi
4个回答

28

pbxproj文件并不是人类可合并的。虽然它是纯文本,但是它是JSON格式的一种形式。实际上,您需要将其视为二进制文件。

以下是各个标志的含义:

-crlf:不使用crlf <=> cr转换

-diff:不要对文件进行差异比较

-merge:不要尝试合并文件

引自Scott Chacon的Pro Git书籍

有些文件看起来像文本文件,但实际上应该视为二进制数据。例如,在Mac上的Xcode项目中包含一个以.pbxproj结尾的文件,它基本上是IDE写入磁盘的JSON(纯文本JavaScript数据格式)数据集,记录了您的构建设置等信息。虽然从技术上讲它是文本文件,因为都是ASCII码,但您不希望将其视为文本文件,因为它实际上是一个轻量级数据库 - 如果两个人更改了它,您无法合并内容,而且差异通常也没有帮助。该文件是为机器消费而设计的。实质上,您要将其视为二进制文件。


11
根据我的(尽管有限)经验,非常简单的更改(例如添加新文件)通常可以在.pbxproj文件中合并。如果你进行更复杂的操作,比如一个分支添加文件,另一个重新排列源组,那么通常会得到一个已损坏的.pbxproj文件,但对于简单的东西,通常是可行的。我还不确定是否最好将.pbxproj文件视为二进制文件。 - Nick Forge
1
我同意,使用Perforce合并.pbxproj文件我取得了很好的成功。我非常小心地检查每一个更改。虽然需要时间,但肯定是可行的。到目前为止,我还没有遇到过损坏的项目文件。但我也知道我所做的更改,并且只在一个方向上进行集成(不是将所有内容都集成进去)。 - CodeSmile
4
99%的情况下,在合并项目文件时失败的原因是两个人都添加了新文件,从而导致冲突。这种情况很容易通过接受双方的更改来解决。除此之外,如果有一个人修改了设置,那么就会很容易地干扰其他更改。如果你考虑一下,JSON实际上和其他任何代码SCM系统需要合并的代码一样。 - Kendall Helmstetter Gelner
19
Scott Chacon所说的那句话是错误的。.pbxproj格式可以完全被"人类"阅读和轻松修改...顺便说一句,我最近开始使用"merge=union"来处理.pbxproj文件,目前看起来还不错... - Ariel Malka
1
再加上原来的“Xcode”项目文件格式是二进制的。他们一段时间前更改了它,使其变得可读,以便处理在版本控制系统中驻留的项目。 - dbainbridge
显示剩余2条评论

7

在提交时,对于检查已更改的内容,差异通常很有用。因此,我发现保留差异能力非常有用,但是只需防止合并即可。因此,在我的.gitattributes文件中使用以下内容:

*.pbxproj -crlf -merge

另外,有人尝试过在pbxproj文件中使用merge=union吗?请参见:Should I merge .pbxproj files with git using merge=union?


5

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

因此,我测试了 merge=union,目前它运行良好。我知道如果文件同时被删除或重命名,它无法帮助,但对于添加新文件,它的效果符合预期:没有冲突,并且文件不会在合并后消失。这也节省了相当多的时间。

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

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

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

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

open ~/.gitattributes

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

*.pbxproj binary merge=union

完成了。希望这可以像对我有帮助一样,对新读者有所帮助。


这真是救命稻草。我被那些旋转圆圈的合并工具逼疯了。 - Aleksandar Vacić

3
我编写了一个名为xUnique的Python脚本来解决合并冲突问题。
该脚本执行以下操作:
  • 将所有24个字符的UUID替换为项目范围内唯一的32个字符MD5摘要,并删除任何未使用的UUID(通常是由于疏忽合并导致)。这将防止重复的UUID,因为不同的机器/Xcode在此文件中生成不同的UUID。Xcode会识别它并打开项目。在此过程中,删除项目文件中的所有无效行。
  • 对项目文件进行排序。我编写了一个Python版本Webkit团队的sort-Xcode-project-file,具有更多新功能:
    • 支持对PBXFileReferencePBXBuildFile部分进行排序
    • 删除重复的文件/引用
    • 即使没有更改也避免创建新文件,这样在使用此脚本后可以减少提交次数
有关xUnique的更多详细信息和更新,请参见README

好主意,但是使用起来真的很复杂。 - ScottyBlades
@ScottyBlades 基本上它只是一个要执行的命令。其他选项,如git hook或“build-post-action”,只是让你更轻松地运行该命令。 - Xiao

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