我在查看一个开源的Mac应用程序时,他们给出了一些.gitignore的建议值。这些建议和我的预期相符...
然而,他们还建议在.gitattributes文件中添加以下条目:
*.pbxproj -crlf -diff -merge
我对git不太熟悉,所以我想知道-添加这行代码的好处是什么?它特别做什么?我只在这个项目中看到过这种建议,如果这是正常做法,我现在会期望在其他地方也看到它。因此,我对它如何特别适用于pbxproj文件很感兴趣。
pbxproj文件并不是人类可合并的。虽然它是纯文本,但是它是JSON格式的一种形式。实际上,您需要将其视为二进制文件。
以下是各个标志的含义:
-crlf:不使用crlf <=> cr转换
-diff:不要对文件进行差异比较
-merge:不要尝试合并文件
引自Scott Chacon的Pro Git书籍
有些文件看起来像文本文件,但实际上应该视为二进制数据。例如,在Mac上的Xcode项目中包含一个以.pbxproj结尾的文件,它基本上是IDE写入磁盘的JSON(纯文本JavaScript数据格式)数据集,记录了您的构建设置等信息。虽然从技术上讲它是文本文件,因为都是ASCII码,但您不希望将其视为文本文件,因为它实际上是一个轻量级数据库 - 如果两个人更改了它,您无法合并内容,而且差异通常也没有帮助。该文件是为机器消费而设计的。实质上,您要将其视为二进制文件。
在提交时,对于检查已更改的内容,差异通常很有用。因此,我发现保留差异能力非常有用,但是只需防止合并即可。因此,在我的.gitattributes文件中使用以下内容:
*.pbxproj -crlf -merge
另外,有人尝试过在pbxproj文件中使用merge=union吗?请参见:Should I merge .pbxproj files with git using merge=union?
在手动解决合并冲突后,我遇到了 *.pbxproj
文件损坏的问题。或者更常见的是,在合并后我的文件在工作树中“消失”了。这让我非常疯狂,因为我们是一个团队,你可以想象它会变得多么混乱。
因此,我测试了 merge=union
,目前它运行良好。我知道如果文件同时被删除或重命名,它无法帮助,但对于添加新文件,它的效果符合预期:没有冲突,并且文件不会在合并后消失。这也节省了相当多的时间。
如果您想尝试一下,这是我所做的:
1)创建全局 .gitattributes 文件。在终端中运行:
touch ~/.gitattributes
git config --global core.attributesfile ~/.gitattributes
2) 这个命令应该在文本编辑器中打开:
open ~/.gitattributes
3) 当文件打开时,请添加此行并保存文件:
*.pbxproj binary merge=union
完成了。希望这可以像对我有帮助一样,对新读者有所帮助。
UUID
替换为项目范围内唯一的32个字符MD5摘要,并删除任何未使用的UUID(通常是由于疏忽合并导致)。这将防止重复的UUID,因为不同的机器/Xcode在此文件中生成不同的UUID。Xcode会识别它并打开项目。在此过程中,删除项目文件中的所有无效行。PBXFileReference
和PBXBuildFile
部分进行排序
.pbxproj
文件。 - Besi