(git) diff를 생성하는 방법맥락의 특징?

(git) diff를 생성하는 방법맥락의 특징?

이것--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 config alias.diffwc '!path/to/git-diff-word-context'.

--stdin예를 들어, options 를 통해 호출하여 필터로 사용할 수도 있습니다 git show --color-words | git-diff-word-context --stdin -U5.

외부 diff 드라이버로 구성하려면 추가 단계를 수행해야 합니다( GIT_EXTERNAL_DIFF내부 참조 man git). IMHO, git diff이 경우에는 임의의 매개변수를 전달하는 것이 특히 어렵습니다.

예제 출력

관련 정보