정규식 기반 차이점/패치에 관련 블록만 표시

정규식 기반 차이점/패치에 관련 블록만 표시

git log -G<regex> -p지정된 패턴과 일치하는 변경 사항에 대한 코드 베이스의 기록을 검색하는 훌륭한 도구입니다. 그러나 대부분 관련이 없는 청크의 바다에서 diff/patch 출력에서 ​​관련 청크를 찾는 것은 압도적일 수 있습니다.

원시 문자열/정규식에 대한 출력을 검색하는 것은 확실히 가능 git log하지만 관련 없는 많은 변경 사항으로 인한 시각적 노이즈와 간섭을 줄이는 데는 거의 도움이 되지 않습니다.

를 읽으면서 내가 원하는 것과 정반대인 이 git log있다는 것을 알았습니다 . 출력을 (전체 변경 세트로) 확장하는 반면, 나는 그것을 (특정 청크로) 제한하고 싶습니다.--pickaxe-all

본질적으로 저는 diff/패치를 별도의 청크로 "지능적으로" 구문 분석한 다음 각 청크에 대해 검색을 수행하고(변경된 줄에 대해서만) 일치하지 않는 청크를 삭제하고 다음과 같은 청크를 출력하는 방법을 찾고 있습니다. 그게.

제가 설명하는 도구가 존재합니까? 일치하거나 영향을 받은 꽃미남을 얻는 더 좋은 방법이 있습니까?

제가 했던 사전조사는..

  • grep출력을 비교/패치하고 컨텍스트 옵션 값을 동적으로 만들 수 있다면 (예: 줄 수 대신 정규식을 통해) 충분할 수 있습니다. 하지만 grep정확히 그런 식으로 구축된 것은 아닙니다(필수적으로 해당 기능을 요구하는 것도 아닙니다).

  • 찾았어요패치 도구Kit는 처음에는 내 요구에 맞는 것 같습니다. 그러나 해당 페이지를 읽은 후에는 man이러한 도구가 정규식 기반 일치 블록을 처리할 수 없는 것 같습니다. (근데 잘생긴 남자 리스트는 받아들일 수 있는데...)

  • 드디어 만났어요분할 patch.rbstdin는 패치의 구문 분석을 잘 처리하는 것처럼 보이지만 패치를 읽고 필요한 청크를 일치시킨 다음 청크를 출력하여 구문 분석을 처리하려면 크게 향상될 필요가 있습니다 .

답변1

여기https://stackoverflow.com/a/35434714/5305907찾고 있는 작업을 수행하는 방법을 설명합니다. 효과적으로:

git diff -U1 | grepdiff 'console' --output-matching=hunk

주어진 문자열 "console"과 일치하는 친구들만 표시합니다.

답변2

위의 @nagu 답변과 다른 링크의 답변을 바탕으로 git log -G관련 있는 친구만 표시할 수 있었습니다.

  1. 다음 내용을 포함하는 $PATH 어딘가에 스크립트를 생성하여 시작하십시오.

    #!/bin/bash
    
    # pickaxe-diff : external diff driver for Git.
    #                To be used with the pickaxe options (git [log|show|diff[.*] [-S|-G])
    #                to only show hunks containing the searched string/regex.
    
    path=$1
    old_file=$2
    old_hex=$3
    old_mode=$4
    new_file=$5
    new_hex=$6
    new_mode=$7
    
    filtered_diff=$(diff -u -p $old_file $new_file | \
                    grepdiff "$GREPDIFF_REGEX" --output-matching=hunk | \
                    grep -v -e '+++ ' -e '--- ')
    
    a_path="a/$path"
    b_path="b/$path"
    
    echo "diff --git $a_path $b_path"
    echo "index $old_hex..$new_hex $old_mode"
    echo "--- $a_path"
    echo "+++ $b_path"
    echo "$filtered_diff"
    
  2. Git을 호출하여 스크립트를 외부 diff 드라이버로 git log -G사용하도록 지시합니다 .pickaxe-diff

    export GREPDIFF_REGEX=<string>; 
    GIT_EXTERNAL_DIFF=pickaxe-diff git log -p --ext-diff -G $GREPDIFF_REGEX
    

    이것은 pickaxe-diff 스크립트를 사용하여 diff를 생성하므로 git log나머지 출력(커밋 해시, 메시지 등)은 변경되지 않은 상태로 유지됩니다.

경고하다
Git 곡괭이가 작동하는 방식은 출력을 다음으로 제한하는 것입니다.문서누구 친구가 주어진 문자열/정규식을 변경합니까? 이는 해당 파일의 다른 블록에도 검색 문자열/정규식이 포함되어 있지만 이를 변경하지 않으면 여전히 위 스크립트와 함께 표시된다는 의미입니다. 이는 grepdiff의 제한 사항입니다. patchutils 프로젝트에는 --only-matching이러한 청크를 적절하게 필터링하는 데 필요한 기능을 제공하는 플래그를 grepdiff에 추가하기 위한 공개 풀 요청이 있습니다 .


나는 내 솔루션을 썼다이 점.

답변3

정확히 요청한 내용은 아니지만 grep을 수행하는 한 가지 방법은 대화형으로 패턴을 추가하는 것입니다. 이를 위해서는 관심 있는 패치 이후 커밋을 확인해야 합니다.

git checkout COMMIT_ID

그런 다음 VCS에서 한 단계 뒤로 이동하지만 작업 디렉토리에서는 돌아가지 않습니다.

git reset --soft HEAD^

(이 시점에서 인덱스와 작업 디렉터리의 차이는 관심 있는 패치에 해당합니다.)

이제 를 실행할 수 있습니다 . 그러면 일부 행이 정규식과 일치하는 블록을 찾을 수 있는 옵션이 포함된 git add -p대화형 세션이 시작됩니다 . /이는 패치를 추가로 처리하려는 경우(예: 부분 체리 수확 준비)에 특히 유용합니다.

불행하게도 적어도 지금은 이 /명령이 add -p단일 파일에서만 작동하므로 관련되지 않은 몇 가지 파일을 건너뛰어야 할 수도 있습니다.

관련 정보