파일 확장자를 기준으로 git diff를 필터링하는 방법은 무엇입니까?


152

git diff주어진 파일 확장자 세트 로 제한하는 옵션이 있습니까?

답변:


227

예, git이 쉘이 아닌 glob를 확장하도록 보장하면 어떤 수준에서나 일치하므로 이와 같이 (따옴표가 중요합니다) 제대로 작동합니다.

git diff -- '*.c' '*.h'

1
좋아, 내 자식 버전이 너무 오래되었습니다. 1.7.8로 알려진대로 작동합니다. 우수한.
Mat

3
광산은 중괄호 확장과 협력, 라git diff -- *.{c,h,etc}
마 플레처

9
이중 대시가 중요합니다 (예 : git diff master HEAD -- "*filename.txt"git diff master HEAD --name-only
neaumusic

작은 따옴표 ( '')도 중요합니다! git diff -- src/*.js이어야합니다git diff -- 'src/*.js'
Nickofthyme

1
또한 git 저장소의 루트 디렉토리 에서이 작업을 수행해야합니다.
John Jiang

10

재귀 적으로 파일을 포함 시키려면 (현재 디렉토리 포함) 이것이 나를 위해 일했습니다.

git diff -- '***.py'

1
나를 위해 그것은 최고의 솔루션입니다. 일부 파일 / 디렉토리를 제외 할 수도 있습니다. 예 :git diff -- '***.py' ':!.Trashes'
Bartosz

삼중 별표는 무엇입니까 (단일 별표와 비교하여)?
Jann Poppinga

IIRC 이중 별표는 중첩 디렉토리 (아마도 비어 있음)를 의미하고 단일 별표와 .py는 파일 이름을 의미합니다. 따라서 현재 또는 중첩 된 디렉토리의 * .py 파일이어야합니다.
Bohumir Zamecnik

8

쉘의 globstar (재귀 적 검색을 수행함) 1 , 2를 사용하십시오 .

shopt -s globstar 
git diff -- *.py **/*.py

또는 찾기를 사용하십시오.

find -name '*.py' -print0 | xargs -0 git diff --

둘 다 특수 이름과 공백 증명입니다. .py 확장자를 가진 디렉토리를 필터링하고 싶을 수도 있습니다 :)


1 나는 git diff -- {.,**}/*.py보통하고 싶다

2 globstar가 활성화되면 git diff -- **/*.py이미 포함되어 ./*.py있습니다. Bash의 맨 페이지에서 '/가 오는 경우 두 개의 인접한 *는 디렉토리와 하위 디렉토리에만 일치합니다.'


4

간단한 파일 패턴의 경우 다음과 같이 작동합니다.

$ git ls-files -zm '*.txt' | xargs --null git diff

공백은 안전하며 여러 확장명도 사용할 수 있습니다.

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

3

확장을위한 명령 줄 인수.

git diff *.py

다른 방법으로는, 당신은 파이프를 수 findgit diff:

find . -name '*.py' -type f | git diff --

답을 좀 더 읽기 쉽게 만드십시오. 당신은 git diff *.py외침 제목과 함께 또는없이 충분할 수 있습니다
sehe

1
'shout headings'는 쉘 스크립트에서 # -comments였습니다.
hughdbrown

이것은 나를 위해 일한 유일한 해결책이며 따옴표 등은 Windows 명령 프롬프트에서 작동하지 않았습니다.
Ed Bayiates 20

1

git 버전 2.18.0에서 테스트 한 것처럼 파일 확장자는 큰 따옴표로 묶어야합니다. 로컬 저장소와 원격 저장소 사이의 마지막 차이점을 찾으려면 끌어온 후 다음을 사용할 수 있습니다.

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

예를 들면 다음과 같습니다.

git diff master@{1} origin/master --name-only "*.cs"

1
확장 프로그램을 제공하기 전에 다음과 같이 제공했을 때 저에게 효과적이었습니다.git diff master@{1} origin/master --name-only -- "*.cs"
333

0

위의 답변 중 어느 것도 git bashWindows 에서 작동하지 않는 것 같습니다 . 버전 (1.8.4를 사용하고 있음)인지 Windows / bash인지 확실하지 않습니다. 또한 필자의 경우 각 분기마다 다른 분기에 추가 파일이없는 두 개의 분기를 비교하고 싶었습니다 (따라서 '찾기'기반 항목은 기각됩니다).

어쨌든 이것은 나를 위해 일했습니다 (예에서는 파이썬 파일 사이의 차이점을 찾고 있음).

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`

stackoverflow.com/a/8554987/4233229 는 작동하지만 Windows에서는 작은 따옴표 대신 작은 따옴표를 사용해야합니다
lcnittl

0

git diff 스테이지되지 않은 파일에서만 차이가 표시됩니다.

.info에서 파일 을 제외하고 싶기 때문에이 질문을 찾았습니다 git diff. 으로 스테이징 git add *.info하여 파일을 남겨두면 파일이 줄어 듭니다.


0

나는 이것으로 마무리했다.

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

파일 이름에 'test'(대소 문자 구분)라는 단어가 포함되어 있고 끝나지 않는 경우에만 지정된 커밋에 대한 diff를 표시 .sql하고 필요에 따라 파이프 라인을 수정하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.