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

git diff的/a/b前缀的原因是什么,git,git-diff,Git,Git Diff,我已经使用git好几年了,一直想知道为什么git diff会在修改过的文件名前面加上a/和b/。我希望最终会偶然发现一个有用的用例,但直到现在,它总是令人讨厌,而且从来没有帮助过 它有什么好处?为什么默认情况下会启用此选项?在哪些情况下有用?如中所述,a/et b/表示用于区分源和目标的前缀 实际上,您可以选择: --no-prefix 不显示任何源或目标前缀 --src前缀= 显示给定的源前缀,而不是“a/” ——dst前缀= 显示给定的目标前缀,而不是“b/” 这是为了区分来源和目的地

我已经使用git好几年了,一直想知道为什么git diff会在修改过的文件名前面加上a/和b/。我希望最终会偶然发现一个有用的用例,但直到现在,它总是令人讨厌,而且从来没有帮助过

它有什么好处?为什么默认情况下会启用此选项?在哪些情况下有用?

如中所述,a/et b/表示用于区分源和目标的前缀

实际上,您可以选择:

--no-prefix
不显示任何源或目标前缀

--src前缀=
显示给定的源前缀,而不是“a/”

——dst前缀=
显示给定的目标前缀,而不是“b/”


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

--src前缀=

--dst前缀=


如果您觉得它没有用,可以通过以下方式将其关闭:

git config --global diff.noprefix true

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

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

[diff]
noprefix = true
  • 假设您在目录
    asdf source.latest
    中有一个项目
    asdf
    的源代码
  • 您可以将目录复制到新目录(例如,
    asdf source.new
    ,最好是其中的文件)
  • 现在,您可以在
    asdf source.new中进行所有更改,尝试编译代码、测试代码等
  • 完成后,使用例如
    diff-r asdf-source.latest asdf-source.new>new_功能创建补丁。补丁
    。输出也随着时间的推移而变化。除其他外,git默认使用“统一”输出,可以使用diff的
    -u
    参数获取
现在,您可以看到修补程序具有使用目录名更改文件的路径


应用补丁的人(或构建脚本等)将使用
patch
,而不是使用
git-apply
git-am
。为了让命令找到正确的文件,必须使用修补程序的
-pN
选项从路径中删除目录名(N显示要删除的目录名和分隔符的数量)。在上述情况下,使用的命令可以是
patch-p1,如果要手动将
git diff--no prefix
添加到.gitconfig中,只需添加以下内容:

[diff]
noprefix = true

@马诺兹:谢谢,反正我们几乎是在同一时间写的。注意:提到diff机器的路径前缀过去是通过硬连线连接到“
a/
”作为源前缀,而“
b/
”作为目标前缀。@Denji您在OS X上使用的是什么版本的Git?我喜欢Git上所有东西的默认值有多糟糕<代码>a
b
用于起点和终点。。。这怎么清楚?无论如何,您也可以使用
git config--global diff.noprefix true
永久禁用
git add--patch
显示的前缀?@JFlo不确定:diff.noprefix配置会有帮助吗?()对于git,您的声明/“强制开发人员使用0目录不是很好”/毫无意义。没有a对b/“让修补程序查找文件可能很危险(因为它可能会找到不同的文件)”/也没有意义,因为没有旧的目录a和新的目录b<代码>-p0
是补丁的默认值。使用
-p1
,您必须键入更多。因此,
diff.noprefix true
是一个有意义的默认值。所谓“强制开发人员使用0目录”,我指的是在本节开头解释的用例。我更容易将它放在两个目录中,然后使用
-p1
应用默认输出。关于“查找不同的文件”,这当然不是那么容易,但是拥有
-p0
并不意味着保留和处理完整路径(例如
/etc/hosts
)。当然,这是在当前的补丁实现中处理的。@rurban根据补丁(1)版本2.7.1的手册页,默认值不是
-p0
。完全不使用
-p
(或
-strip
)选项将剥离所有目录名,因此使用
/u/howard/src/blurfl/blurfl.c
“完全不指定-p只会给您带来blurfl.c。”您是对的-p0是必需的。很抱歉使用
diff.noprefix true
也更容易复制和粘贴文件。你们两人在1分钟内创建了几乎相同的答案!但是没有永久性地将其设置为有意义的属性?如果在使用
git add--patch
时可以看到类似的diff选项,那就太好了。我喜欢dbl点击这些名称快速粘贴到konsole中,但总是要修剪这个愚蠢的、无用的前缀,这很烦人。这很有效,但通过创建不可用的
git diff
s打破了
git apply
;看---git是迟钝的。
Show the given destination prefix instead of "b/".
git config --global diff.noprefix true
[diff]
noprefix = true