git diff를 grep하는 방법?


81

주어진 패턴으로 필터링 된 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} "

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


3
분명히 git-diff-grep이라는 github 프로젝트는 완전히 다른 작업을 수행합니다.
Kuba 2012 년

답변:


99

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

-G <정규식>

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

15
그것은 정확히 내가 찾고있는 것이 아닙니다. 패턴과 일치하는 줄만보고 싶기 때문입니다.-패턴 변경을 포함하는 파일의 전체 차이가 아닙니다
Kuba

그때 나는 당신과 같은 더 간단한 해결책이있는 것 같아요
CharlesB

적어도 git diff -G는 전체 git diff보다 더 나은 첫 번째 단계입니다.
쿠바

1
내 버전에는 -G 플래그가 없습니다. 제거 되었습니까?
RedX

3
정규식의 영향을받은 파일을 확인하는데도 유용합니다.git diff -G <regex> --raw
Raman

11

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


11

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

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

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

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

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


3

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


나는 그것들에 익숙합니다. 나는 역사를 보지 않고 현재의 작업 변화를보고 있습니다.
Kuba 2015 년

좋습니다. 그러면 동일한 방법 (인용 된 robinst)을 사용할 수 있습니다. 출력을 원하면 libgit2 또는 gitgui / gitk를 사용하는 라이브러리를 사용할 수 있습니다.
chelmertz

1

이것은 나를 위해 일했습니다. 누군가에게 도움이되기를 바랍니다.

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

1

"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: 다른 diff덩어리의 구분과 일치하는 마커 , "diff"로 시작하는 줄
  • pattern: 검색 할 패턴, "+"또는 "-"로 시작하고 "PATTERN"을 포함하는 줄

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

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


우수한!! bash 쉘 (예 : IDE에서 .sh 파일 편집)이 아닌 다른 ^[colored=$'(\e\[[0-9;]*[a-zA-Z])'brew install gnu-sedsed --> gsed
곳에이 이름

0

다음은 내부 변경 사항 (컨텍스트 제외)을 허용하는 사용자 정의 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

0

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

git diff -U0 | findstr string

파일 이름별로 그룹화하려면 다음을 사용하십시오.

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

0

나는 이것을 매우 만족스럽게 사용하고 있습니다 :)

grep -ri <MY_PATTERN> $(git diff 790e26393d --name-only) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.