我怎样才能使这个带有引号的 git 别名起作用?

我怎样才能使这个带有引号的 git 别名起作用?

我想创建一个 git diff 别名,只显示更改的行(彩色)。

[alias]
    mdiff = diff --color | grep --color=never $'^\e\[3[12]m'

这不起作用,因为显然管道不能在 git 别名中使用,但是这个答案显示了一个解决方法:

[alias]
    mdiff = ! git diff --color | grep --color=never $'^\e\[3[12]m'

但是,这也不起作用,我仍然收到此错误:fatal: bad config line 17 in file /home/me/.config/git/config

该答案下的评论表明问题是由于引号造成的。

答案1

没有的 git 别名!由 Git 本身运行。如果别名包含一个|字符,那么它只是一个|字符。不涉及外壳,因此|并不意味着管道。

以 开头的 git 别名!由 shell 运行。 Git 在 shell 中运行后面的内容!(在进行一些引号解析之后),并在最后传递参数。您的第二次尝试无效,因为 Git 解析反斜杠,您需要将它们加倍,并在前面加倍反斜杠,[因为 shell 必须看到\\[才能让 grep 看到\[

mdiff = ! git diff --color | grep --color=never $'\\e\\\\[3[12]m'

但这是不对的,因为git mdiff foo相当于运行 shell 命令

git diff --color | grep --color=never $'\\e\\\\[3[12]m' foo

您需要安排将参数传递给 git。您可以通过定义一个函数然后执行它来做到这一点。您需要小心,因为;需要引用。这适用于 Git 端:

mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $'\\e\\\\[3[12]m'; }; f"

不过,这仅在/bin/shbash 时有效,在 dash 时无效。 Dash 不支持$'…'转义语法。如果/bin/sh是破折号,则需要用 生成转义字符printf

mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $(printf '\\033\\\\[3[12]'); }; f"

如果您只想删除上下文(但保留文件名和位置指示符),则内置:git diff -U0

相关内容