![如何生成 (git) 差异上下文的特征?](https://linux22.com/image/146613/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90%20(git)%20%E5%B7%AE%E5%BC%82%E4%B8%8A%E4%B8%8B%E6%96%87%E7%9A%84%E7%89%B9%E5%BE%81%EF%BC%9F.png)
这--unified=<n>
选项允许您设置行数;有没有办法对角色做同样的事情?
例子
使用时限制 X 字符更改周围的上下文git diff --color-words=. file.ext
需要考虑的特殊情况
更改是在上一个和/或下一个更改的上下文中进行的
用例
比较包含一长行的缩小文件
长话短说
我想剪掉该行中的所有内容,除了更改及其上下文之外。
答案1
该脚本将完成这项工作,至少与预期的一样长的转义序列(用于着色)。例如将其称为git-diff-word-context -U 5
。它接受所有参数,git diff
将接受并拦截-U
(分别--unified=
)以设置字符数。它只是用来grep
完成任务:
#!/usr/bin/env bash
ESCAPE=$'\e'
START_DIFF="$ESCAPE\\[3[12]m"
END_DIFF="$ESCAPE\\[m"
NOESCAPE="[^$ESCAPE]"
CONTEXT="20"
STDIN=false
ARGS=()
while [ "${1::1}" = "-" ]; do
case "$1" in
"-U"|"--unified")
CONTEXT="$2"
shift
;;
"-U"*)
CONTEXT="${1#-U}"
;;
"--unified="*)
CONTEXT="${1#--unified=}"
;;
"--stdin")
STDIN=true
;;
"--")
break
;;
*)
ARGS+=("$1")
;;
esac
shift
done
set -o pipefail
ok() {
"$@"
true
}
if $STDIN; then
cat
else
git diff --color-words='[^\n]' "${ARGS[@]}" "$@"
fi |
ok grep -oP "$NOESCAPE{0,$CONTEXT}(($START_DIFF[^$ESCAPE]+$END_DIFF)+$NOESCAPE{0,$CONTEXT})+"
调用它的最简单方法是配置一个 Git 别名,例如使用git config alias.diffwc '!path/to/git-diff-word-context'
.
--stdin
例如,您还可以将其用作过滤器,通过选项调用它git show --color-words | git-diff-word-context --stdin -U5
。
要将其配置为外部 diff 驱动程序,您需要采取其他措施(请参阅GIT_EXTERNAL_DIFF
内部man git
)。恕我直言,在这种情况下,传递任意参数git diff
尤其困难。