我想创建一个 git diff 别名,只显示更改的行(彩色)。
[alias]
mdiff = diff --color | grep --color=never $'^\e\[3[12]m'
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为显然管道不能在 git 别名中使用,但这个答案显示了一种解决方法:
[alias]
mdiff = ! git diff --color | grep --color=never $'^\e\[3[12]m'
Run Code Online (Sandbox Code Playgroud)
但是,这也不起作用,我仍然收到此错误:fatal: bad config line 17 in file /home/me/.config/git/config
该答案下的评论表明问题是由于引号造成的。
没有的 git 别名!由 Git 本身运行。如果别名包含一个|字符,那么它只是一个|字符。不涉及外壳,因此|并不意味着管道。
以 开头的 git 别名!由 shell 运行。Git 在 shell 中运行后面的内容!(在进行一些引号解析之后),并在最后传递参数。您的第二次尝试无效,因为 Git 解析反斜杠,您需要将它们加倍,并在前面加倍反斜杠,[因为 shell 必须看到\\\\[才能让 grep 看到\\[:
mdiff = ! git diff --color | grep --color=never $'\\\\e\\\\\\\\[3[12]m'\nRun Code Online (Sandbox Code Playgroud)\n但这是不对的,因为git mdiff foo相当于运行 shell 命令
git diff --color | grep --color=never $'\\\\e\\\\\\\\[3[12]m' foo\nRun Code Online (Sandbox Code Playgroud)\n您需要安排将参数传递给 git。您可以通过定义一个函数然后执行它来做到这一点。您需要小心,因为;需要引用。这适用于 Git 端:
mdiff = ! "f () { git diff --color \\"$@\\" | grep --color=never $'\\\\e\\\\\\\\[3[12]m'; }; f"\nRun Code Online (Sandbox Code Playgroud)\n不过,这仅在 bash 时有效/bin/sh,在 dash 时无效。Dash 不支持$'\xe2\x80\xa6'转义语法。如果/bin/sh是破折号,则需要用 生成转义字符printf。
mdiff = ! "f () { git diff --color \\"$@\\" | grep --color=never $(printf '\\\\033\\\\\\\\[3[12]'); }; f"\nRun Code Online (Sandbox Code Playgroud)\n如果您只想删除上下文(但保留文件名和位置指示符),则内置:git diff -U0。