【问题标题】:What is the reason for the /a /b prefixes of git diffgit diff 的 /a /b 前缀是什么原因
【发布时间】:2011-10-09 13:07:48
【问题描述】:

我已经使用 Git 好几年了,一直想知道为什么 git diff 在修改文件的名称前加上 a/b/ 前缀。我预计最终会偶然发现一个有用的用例,但直到现在它总是很​​烦人而且从来没有帮助。

它有什么用?为什么默认启用此功能?在什么情况下有用?

【问题讨论】:

  • 我不关心原因,但I've got我在这里用谷歌搜索到了什么^_^

标签: git git-diff


【解决方案1】:

正如diff man page 中提到的,a/b/ 表示区分源和目标的前缀。

实际上,您有以下选择:

--no-prefix

不显示任何源或目标前缀。

--src-prefix=<prefix>

显示给定的源前缀而不是“a/”。

--dst-prefix=<prefix>

显示给定的目的地前缀而不是“b/”

【讨论】:

  • @manojlds:谢谢,反正我们几乎是同时写作的。注意:comments.gmane.org/gmane.comp.version-control.git/175850 提到,diff 机制的路径前缀硬连线到源前缀“a/”和目标前缀“b/”。
  • @Denji 你在 OS X 上使用的是什么版本的 Git?
  • 我喜欢 git 上所有东西的默认设置有多糟糕。 ab 用于出发地和目的地......怎么清楚?无论如何,您也可以使用 git config --global diff.noprefix true 永久禁用
  • 有什么办法可以禁用git add --patch显示的前缀?
  • @JFlo 不确定:diff.noprefix 配置有帮助吗? (git-scm.com/docs/git-config#git-config-diffnoprefix)
【解决方案2】:

如果您觉得它没有用,您可以使用以下命令将其关闭:

git config --global diff.noprefix true

【讨论】:

  • 但是没有属性可以将其永久设置为有意义的东西?
  • 如果在使用git add --patch 时看到的差异有类似的选项,那就太好了。我喜欢双击这些名称以快速粘贴到 konsole 中,但总是要修剪这个愚蠢、无用的前缀很烦人。
【解决方案3】:

这些目录前缀基本上是为了兼容性,并被选为合理的默认值。解释如下。

在 git 之前

在 git(和其他 VCS)之前,为多个文件创建补丁的工作流程可能如下所示:

  • 假设您在目录asdf-source.latest 中有一个项目asdf 的源代码。
  • 您将目录复制到一个新目录(例如asdf-source.new,最好是hard-linking 里面的文件)。
  • 现在您可以在asdf-source.new 中进行所有更改,尝试编译代码、测试代码等。
  • 完成后,您可以使用例如创建一个补丁。 diff -r asdf-source.latest asdf-source.new &gt;new_feature.patch。输出也随时间演变。除此之外,git 默认使用“统一”输出,可以使用 diff 的 -u 参数获取。

现在您可以看到补丁包含使用目录名称更改文件的路径。

应用您的补丁的人(或构建脚本等)随后将使用patch,而不是使用git applygit am。为了让命令找到正确的文件,必须使用补丁的-pN 选项从路径中删除目录名(N 显示要删除的目录名和分隔符的数量)。在上述情况下,使用的命令可能是patch -p1 &lt;new_feature.patch。这使得补丁创建者可以使用他/她自己的目录名称。

如果您遇到使用大量补丁(例如,通常用于 Linux 发行版中稳定软件包版本的back-ported 补丁)的脚本修补某个项目,则补丁的格式可能会有所不同。 patch 命令能够正确检测这些格式,但路径有点困难(要删除多少目录)。 一些问题:

  • 强制开发人员使用 0 目录不是很好。
  • patch 查找文件可能很危险(因为它可能会找到不同的文件)。

因此,让每个人都发送可用于patch -p1 的补丁似乎是最明智的做法。

返回 git

当 git 创建时,它为这些选项采用了合理的默认值(与大多数项目的提交指南兼容,主要是内核)。多亏了这一点,您可以使用 git 并将格式正确的补丁发送给使用 patch 的人来应用它,反之亦然(git 也能够处理 diff 创建的补丁)。将“a”和“b”作为前缀尤其可以节省空间(和一小部分带宽),同时保持一切正常。

您可以设置 git config diff.mnemonicprefix true 以便 git 根据您要比较的内容使用不同的前缀(有关详细信息,请参阅 git help config

【讨论】:

  • 使用 git 你的声明/“强制开发人员使用 0 个目录不是很好”/没有意义。没有a vs b。 /“用补丁查找文件可能很危险(因为它可能会找到不同的文件)”/ 也没有意义,因为没有旧目录 a 和新目录 b。 -p0 是补丁默认值。使用-p1,您必须输入更多内容。所以diff.noprefix true 是一个有意义的默认值。
  • 说“强制开发人员使用 0 个目录”,我的意思是本节开头解释的用例。我更容易将它放在 2 个目录中,然后使用-p1 应用默认输出。关于“查找不同的文件”,这当然不是那么容易,但是拥有-p0 并不会删除任何内容,这意味着完整路径(例如/etc/hosts)将被保留和处理。这当然是在当前的补丁实现中处理的。
  • @rurban 根据patch(1) 2.7.1版的手册页,默认不是-p0。完全不使用-p(或--strip)选项将删除所有目录名称,因此使用/u/howard/src/blurfl/blurfl.c“根本不指定-p只会给你blurfl.c。”
  • 你是对的。 -p0 是必需的。对不起。使用diff.noprefix true,复制和粘贴文件也更容易。
【解决方案4】:

如果您想手动将git diff --no-prefix 添加到您的.gitconfig,只需添加以下内容:

[diff]
noprefix = true

【讨论】:

【解决方案5】:

就是区分源和目的。您还可以将其更改为更有意义:

--src-prefix=&lt;prefix&gt;

Show the given source prefix instead of "a/".

--dst-prefix=&lt;prefix&gt;

Show the given destination prefix instead of "b/".

http://git-scm.com/docs/git-diff

【讨论】:

  • 你们相隔 1 分钟创建了几乎完全相同的答案!
猜你喜欢
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多