如何生成 (git) 差异上下文的特征?

如何生成 (git) 差异上下文的特征?

--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尤其困难。

例子

示例输出

相关内容