我想创建一个 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/sh
bash 时有效,在 dash 时无效。 Dash 不支持$'…'
转义语法。如果/bin/sh
是破折号,则需要用 生成转义字符printf
。
mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $(printf '\\033\\\\[3[12]'); }; f"
如果您只想删除上下文(但保留文件名和位置指示符),则内置:git diff -U0
。