git diff的/ a/b前缀是什么原因

mkl*_*mkl 57 git git-diff

我已经使用git多年了,并且总是想知道为什么git diff用/和b /作为修改文件的名称前缀.我预计最终会偶然发现一个有用的用例,但直到现在它总是令人讨厌而且从来没有用过.

到底有什么好处呢?为什么默认启用?在哪些情况下有用?

Von*_*onC 46

diff手册页中所述,/ et b /表示区分源和目标的前缀.

实际上,您有以下选择:

--no-prefix
Run Code Online (Sandbox Code Playgroud)

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

--src-prefix=<prefix>
Run Code Online (Sandbox Code Playgroud)

显示给定的源前缀而不是"a /".

--dst-prefix=<prefix>
Run Code Online (Sandbox Code Playgroud)

显示给定的目标前缀而不是"b /"

  • 我喜欢git上的所有内容的默认值有多糟糕.原产地和目的地的'a`和`b` ......怎么这么清楚?无论如何,你也可以使用`git config --global diff.noprefix true`禁用 (3认同)
  • @GringoSuave 谢谢。我已将您的评论包含在答案中以获得更多可见性。 (2认同)

Wil*_*ard 33

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

git config --global diff.noprefix true
Run Code Online (Sandbox Code Playgroud)

  • 如果使用“git add --patch”时看到的差异有类似的选项,那就太好了。我喜欢双击这些名称以快速粘贴到 konsole 中,但总是必须修剪这个愚蠢、无用的前缀,这很烦人。 (2认同)

ner*_*ert 16

这些目录前缀基本上是为了兼容性而选择作为合理的默认值.说明如下.

在git之前

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

  • 假设您asdf在目录中有项目的源代码asdf-source.latest.
  • 您将目录复制到新目录(例如asdf-source.new,理想情况下硬链接内部文件).
  • 现在您可以进行所有更改asdf-source.new,尝试编译代码,测试代码等.
  • 完成后,使用eg创建一个补丁diff -r asdf-source.latest asdf-source.new >new_feature.patch.产出也随着时间的推移而演变.除了其他东西,git默认使用"统一"输出,可以使用diff的-u参数获取.

现在,您可以使用目录名称看到修补程序包含已更改文件的路径.

然后,应用您的补丁的人(或构建脚本等)将使用patch而不是使用git applygit am.为了使命令能够找到适当的文件,必须使用patch的-pN选项(N显示要删除的目录名和分隔符的数量)从路径中删除目录名.在上面的例子中,使用的命令可以是patch -p1 <new_feature.patch.这使得补丁创建者可以使用他/她自己的目录名.

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

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

因此,让所有人发送可以应用的补丁patch -p1似乎是最合理的方式.

回到git

创建git时,它采用了合理的默认值(与大多数项目的提交指南(主要是内核)兼容)用于此类选项.多亏了这一点,你可以使用git并将一个格式正确的补丁发送给使用patch它的人,反之亦然(git也可以处理diff创建的补丁).将"a"和"b"作为前缀特别节省空间(以及一小部分带宽),同时保持一切正常.

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

  • 你是对的.-p0是必需的.抱歉.使用`diff.noprefix true`,复制和粘贴文件也更容易. (3认同)

aru*_*436 7

If you want to add git diff --no-prefix to your .gitconfig manually, just add the following:

[diff]
noprefix = true
Run Code Online (Sandbox Code Playgroud)


man*_*lds 6

它是为了区分来源和目的地.您还可以将其更改为更有意义:

--src前缀=<prefix>

Show the given source prefix instead of "a/".
Run Code Online (Sandbox Code Playgroud)

--dst前缀=<prefix>

Show the given destination prefix instead of "b/".
Run Code Online (Sandbox Code Playgroud)

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