【发布时间】:2011-10-09 13:07:48
【问题描述】:
我已经使用 Git 好几年了,一直想知道为什么 git diff 在修改文件的名称前加上 a/ 和 b/ 前缀。我预计最终会偶然发现一个有用的用例,但直到现在它总是很烦人而且从来没有帮助。
它有什么用?为什么默认启用此功能?在什么情况下有用?
【问题讨论】:
-
我不关心原因,但I've got我在这里用谷歌搜索到了什么^_^
我已经使用 Git 好几年了,一直想知道为什么 git diff 在修改文件的名称前加上 a/ 和 b/ 前缀。我预计最终会偶然发现一个有用的用例,但直到现在它总是很烦人而且从来没有帮助。
它有什么用?为什么默认启用此功能?在什么情况下有用?
【问题讨论】:
正如diff man page 中提到的,a/ 和b/ 表示区分源和目标的前缀。
实际上,您有以下选择:
--no-prefix
不显示任何源或目标前缀。
--src-prefix=<prefix>
显示给定的源前缀而不是“a/”。
--dst-prefix=<prefix>
显示给定的目的地前缀而不是“b/”
【讨论】:
a/”和目标前缀“b/”。
a 和 b 用于出发地和目的地......怎么清楚?无论如何,您也可以使用 git config --global diff.noprefix true 永久禁用
git add --patch显示的前缀?
如果您觉得它没有用,您可以使用以下命令将其关闭:
git config --global diff.noprefix true
【讨论】:
git add --patch 时看到的差异有类似的选项,那就太好了。我喜欢双击这些名称以快速粘贴到 konsole 中,但总是要修剪这个愚蠢、无用的前缀很烦人。
这些目录前缀基本上是为了兼容性,并被选为合理的默认值。解释如下。
在 git(和其他 VCS)之前,为多个文件创建补丁的工作流程可能如下所示:
asdf-source.latest 中有一个项目asdf 的源代码。asdf-source.new,最好是hard-linking 里面的文件)。asdf-source.new 中进行所有更改,尝试编译代码、测试代码等。diff -r asdf-source.latest asdf-source.new >new_feature.patch。输出也随时间演变。除此之外,git 默认使用“统一”输出,可以使用 diff 的 -u 参数获取。现在您可以看到补丁包含使用目录名称更改文件的路径。
应用您的补丁的人(或构建脚本等)随后将使用patch,而不是使用git apply 或git am。为了让命令找到正确的文件,必须使用补丁的-pN 选项从路径中删除目录名(N 显示要删除的目录名和分隔符的数量)。在上述情况下,使用的命令可能是patch -p1 <new_feature.patch。这使得补丁创建者可以使用他/她自己的目录名称。
如果您遇到使用大量补丁(例如,通常用于 Linux 发行版中稳定软件包版本的back-ported 补丁)的脚本修补某个项目,则补丁的格式可能会有所不同。
patch 命令能够正确检测这些格式,但路径有点困难(要删除多少目录)。
一些问题:
patch 查找文件可能很危险(因为它可能会找到不同的文件)。因此,让每个人都发送可用于patch -p1 的补丁似乎是最明智的做法。
当 git 创建时,它为这些选项采用了合理的默认值(与大多数项目的提交指南兼容,主要是内核)。多亏了这一点,您可以使用 git 并将格式正确的补丁发送给使用 patch 的人来应用它,反之亦然(git 也能够处理 diff 创建的补丁)。将“a”和“b”作为前缀尤其可以节省空间(和一小部分带宽),同时保持一切正常。
您可以设置 git config diff.mnemonicprefix true 以便 git 根据您要比较的内容使用不同的前缀(有关详细信息,请参阅 git help config。
【讨论】:
-p0 是补丁默认值。使用-p1,您必须输入更多内容。所以diff.noprefix true 是一个有意义的默认值。
-p1 应用默认输出。关于“查找不同的文件”,这当然不是那么容易,但是拥有-p0 并不会删除任何内容,这意味着完整路径(例如/etc/hosts)将被保留和处理。这当然是在当前的补丁实现中处理的。
-p0。完全不使用-p(或--strip)选项将删除所有目录名称,因此使用/u/howard/src/blurfl/blurfl.c“根本不指定-p只会给你blurfl.c。”
diff.noprefix true,复制和粘贴文件也更容易。
如果您想手动将git diff --no-prefix 添加到您的.gitconfig,只需添加以下内容:
[diff]
noprefix = true
【讨论】:
git apply,因为创建了不可用的git diffs;见stackoverflow.com/a/57340649 --- git 是迟钝的。
就是区分源和目的。您还可以将其更改为更有意义:
--src-prefix=
<prefix>Show the given source prefix instead of "a/".--dst-prefix=
<prefix>Show the given destination prefix instead of "b/".
【讨论】: