Programing

git diff를 grep하는 방법?

lottogame 2020. 11. 28. 08:36
반응형

git diff를 grep하는 방법?


주어진 패턴으로 필터링 된 git-diff를 표시하는 방법이 있습니까?

같은 것

git grepdiff pattern

changed file
+++ some sentence with pattern
changed file 2
--- some other pattern

불행히도 가장 간단한 해결책으로는 충분하지 않습니다

git diff | grep pattern 

+++ some sentence with pattern
--- some other pattern
# not an option as doesn't put the filename close to the match

awk를 사용하여 해결 방법을 찾았습니다.

git diff | awk "/\+\+\+/{f = \$2}; /PATTERN/ {print f \$0} "

그러나 이것에 대한 명령이 있음을 알고 싶습니다.


확실하지 않지만 git diff -G <regex>플래그가 괜찮지 않습니까?

-G <정규식>

Look for differences whose added or removed line matches the given <regex>.

또 다른 가능성은 전체 diff를보고 일반 less명령 (입력 /한 다음 패턴)을 사용하여 출력을 검색하는 것 입니다.

less사용하여 경기 전에 몇 줄을 표시하도록 구성한 --jump-target=N경우 이것은 매우 유용합니다. 다음과 같이 시도하십시오.

PAGER="/usr/bin/less --jump-target=10" git diff

즉, 일치 항목이 10 행에 표시되어야하며 (위에 9 행의 컨텍스트가 표시됨) 파일 이름도 볼 수있을만큼 충분할 수 있습니다.

--jump-target=.5사용 하여 화면 중앙에 일치 위치를 지정할 수도 있습니다 .


git diff -S<string>또는 시도 했습니까 git diff -G".*string.*"? 동일하지 않다는 점에 유의하십시오 . -S가 수행하는 작업 은 곡괭이에 대한 설명서를 참조하십시오 .


나는 git log -p덜 열리는 (그러나 구성 가능)을 사용하며, 차례로 /. 또한 git log -S <searchword>.


"grep" diff출력에 대한 접근 방식 이 최선의 해결 방법 이라고 생각합니다 .

sed를 사용하여 awk 스크립트를 개선 할 수 있습니다.

colored="(^[\[[0-9;]*[a-zA-Z])"
marker="^$colored+diff"
pattern="^$colored+.*(\+|\-).*PATTERN"
git diff --color | sed -rn -e "/$marker/! H; /$marker/ ba; $ ba; b; :a; x; /$pattern/ p"
  • colored: 터미널 컬러 라인과 일치하는 정규식
  • marker: differents diff덩어리의 구분과 일치하는 마커 , "diff"로 시작하는 줄
  • pattern: 검색 할 패턴, "+"또는 "-"로 시작하고 "PATTERN"을 포함하는 줄

이렇게하면 PATTERN이 추가되거나 제거 된 전체 diff 덩어리가 인쇄되고 유용한 컬러 출력도 유지됩니다.

주의 ^[의는 colored문자 그대로, 실제이어야한다 ^[. Ctrl+ V, Ctrl+ 를 눌러 bash에서 입력 할 수 있습니다.[


다음은 내부 변경 사항 (컨텍스트 제외)을 허용하는 사용자 정의 diff 도구입니다.

용법

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

이렇게하면 변경 내용에 포함 된 행이 출력됩니다 foo( foo변경 사항으로 인해 사라진 행 포함 ). 대신 모든 grep 패턴을 사용할 수 있습니다 foo.

각 출력 줄은 다음 접두사로 시작합니다.

filename: oldlinenum: newlinenum|

이 스크립트는 --grep옵션 없이도 사용할 수 있습니다 .이 경우 위에서 설명한대로 전체 diff 형식 (즉, 전체 컨텍스트 제공)을 지정합니다.

mydiff

#!/bin/bash

my_diff()
{
    diff --old-line-format="$1"':%6dn:      |-%L'     \
         --new-line-format="$1"':      :%6dn|+%L'     \
         --unchanged-line-format="$1"':%6dn:%6dn| %L' \
         $2 $3
}

if [[ $1 == '--grep' ]]
then
    pattern="$2"
    shift 2
    my_diff "$1" "$2" "$5"|grep --color=never '^[^|]\+|[-+].\+'"$pattern"'.*'
else
    my_diff "$1" "$2" "$5"
fi

exit 0

Windows에서 간단한 솔루션은 다음과 같습니다.

git diff -U0 | findstr string

If you want grouping by filename, use this

FOR /F "usebackq delims==" %i IN (`git diff --name-only`) do git diff -U0 %~fi | findstr string

This did the job for me, I hope it will help someone:

git diff | grep  -P '^\+|^\-'

참고URL : https://stackoverflow.com/questions/12462538/how-to-grep-the-git-diff

반응형