git log -G<regex> -p
지정된 패턴과 일치하는 변경 사항에 대한 코드 베이스의 기록을 검색하는 훌륭한 도구입니다. 그러나 대부분 관련이 없는 청크의 바다에서 diff/patch 출력에서 관련 청크를 찾는 것은 압도적일 수 있습니다.
원시 문자열/정규식에 대한 출력을 검색하는 것은 확실히 가능 git log
하지만 관련 없는 많은 변경 사항으로 인한 시각적 노이즈와 간섭을 줄이는 데는 거의 도움이 되지 않습니다.
를 읽으면서 내가 원하는 것과 정반대인 이 git log
있다는 것을 알았습니다 . 출력을 (전체 변경 세트로) 확장하는 반면, 나는 그것을 (특정 청크로) 제한하고 싶습니다.--pickaxe-all
본질적으로 저는 diff/패치를 별도의 청크로 "지능적으로" 구문 분석한 다음 각 청크에 대해 검색을 수행하고(변경된 줄에 대해서만) 일치하지 않는 청크를 삭제하고 다음과 같은 청크를 출력하는 방법을 찾고 있습니다. 그게.
제가 설명하는 도구가 존재합니까? 일치하거나 영향을 받은 꽃미남을 얻는 더 좋은 방법이 있습니까?
제가 했던 사전조사는..
grep
출력을 비교/패치하고 컨텍스트 옵션 값을 동적으로 만들 수 있다면 (예: 줄 수 대신 정규식을 통해) 충분할 수 있습니다. 하지만grep
정확히 그런 식으로 구축된 것은 아닙니다(필수적으로 해당 기능을 요구하는 것도 아닙니다).찾았어요패치 도구Kit는 처음에는 내 요구에 맞는 것 같습니다. 그러나 해당 페이지를 읽은 후에는
man
이러한 도구가 정규식 기반 일치 블록을 처리할 수 없는 것 같습니다. (근데 잘생긴 남자 리스트는 받아들일 수 있는데...)드디어 만났어요분할 patch.rb
stdin
는 패치의 구문 분석을 잘 처리하는 것처럼 보이지만 패치를 읽고 필요한 청크를 일치시킨 다음 청크를 출력하여 구문 분석을 처리하려면 크게 향상될 필요가 있습니다 .
답변1
여기https://stackoverflow.com/a/35434714/5305907찾고 있는 작업을 수행하는 방법을 설명합니다. 효과적으로:
git diff -U1 | grepdiff 'console' --output-matching=hunk
주어진 문자열 "console"과 일치하는 친구들만 표시합니다.
답변2
위의 @nagu 답변과 다른 링크의 답변을 바탕으로 git log -G
관련 있는 친구만 표시할 수 있었습니다.
다음 내용을 포함하는 $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"
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
단일 파일에서만 작동하므로 관련되지 않은 몇 가지 파일을 건너뛰어야 할 수도 있습니다.