"git diff"에서 파일을 제외하고 싶습니다


229

db/irrelevant.phpGit diff에서 파일 ( ) 을 제외하려고합니다 . line db이라는 서브 디렉토리에 파일을 넣으려고 시도하고 포함 이라는 파일을 작성하려고했습니다 ..gitattributesirrelevant.php -diff.git/info/attributesdb/irrelevant.php

모든 경우에 db/irrelevant.php파일은 Git 바이너리 패치로 diff에 포함됩니다. 내가 원하는 것은 diff 명령으로 해당 파일의 변경 사항을 무시하는 것입니다. 내가 뭘 잘못하고 있죠?

답변:


325

세상에, 드라이버와 awk가 파일을 제외할까요? 자식 1.9 이후로 할 수있는 것 :

git diff -- . ':(exclude)db/irrelevant.php' ':(exclude)db/irrelevant2.php'

아, 우아! 인용 된 답변을 참조하고 @torek 의이 답변 에 대한 자세한 내용


4
참고 : 특정 파일 이름을 제외하려면 .gitignore파일 구문 과 다른 접두사로 별표를 붙여야 합니다. 예 :!*shrinkwrap.yaml대신 :!shrinkwrap.yaml.
vaughan

7
더 많은 파일을 제외하십시오. 예를 들어 git diff에서 피하기 위해 * .min.css 및 * .min.js 파일이 있습니다. 그래서, 나는 명령을 사용합니다git diff -- . ':(exclude)*.min.js' ':(exclude)*.min.css'
maheshwaghmare

4
windows 구문 : git diff -- . ":(exclude)db/irrelevant.php"(작은 따옴표 대신 큰 따옴표)
cnlevy

4
감사합니다! 그런 난해한 구문 .. 매번 찾아봐야합니다.
Daniel Waltrip

1
@cnlevy 또는 따옴표 없음! git diff -- . :(exclude)db/irrelevant.php
Matthias

62

op 명령없이 사용자 정의 diff 드라이버를 설정하고 무시해야하는 파일에 할당 할 수 있습니다.

이 명령 으로 저장소 특정 diff 드라이버작성하십시오.

git config diff.nodiff.command /bin/true

또는 모든 당신의 repos에 대한 --global.

(경우 /bin/true, 맥 OS에 존재하지 않는 대안을 사용하는 것 /usr/bin/true또는 echo).

그런 다음 파일 에서 무시하려는 파일에 새 diff 드라이버를 할당.git/info/attributes 하십시오.

irrelevant.php    diff=nodiff

이 상태가 다른 개발자 와 공유되어야한다면 , 문서 파일이나 다른 것을 통해 동료 .gitattributes대신 명령을 사용하여 동료와 명령을 .git/info/attributes공유 할 수 있습니다 git config.


2
이것은 내가 찾던 정확히 것입니다 -에 설명 된대로 kerneltrap.org/mailarchive/git/2008/10/17/3711254 I 편집 ~ / .gitconfig 추가 : [diff "nodiff"] / TRUE '`명령 = / 빈 나는 다음라는 파일을 생성 내가 추가 한 .git / info / attributes : irrelevant.php diff=nodiff
Michael

12
이 대답은 나를 위해 더 나은 일 : stackoverflow.com/questions/1016798/...
닐 포레스터

3
흥미롭게도이 방법은 작동하지 않습니다 git diff --stat. 이 경우 git diff ... | diffstat해결 방법으로 사용할 수 있습니다 .
ddkilzer

@Michael 해당 링크가 망가진 것 같습니다. 다른 것이 있습니까?
DickieBoy

3
그냥 추가 : 당신은, 어쨌든 사용을 표시하는 자식은 diff를 강제하려는 경우--no-ext-diff
플로리안 클라인

35

당신은 또한 사용할 수 있습니다 filterdiff 의 프로그램 patchutils의 DIFF의 일부를 제외하는 프로그램 모음. 예를 들면 다음과 같습니다.

git diff | filterdiff -p 1 -x db/irrelevant.php

4
그 주 -p맨 페이지 (1)에서,는 "-pn, --strip 매치 = N 매칭 경로명의 처음 N 개의 성분을 무시하면." OP의 경로에서 부품을 -p 1제거 하는 것을 잡는 데 시간이 걸렸습니다 db. 파일 이름 만 지정하고 모든 경로 / dir 가능성을 무시하려면을 사용할 수 있습니다 -p 99.
Tyler Collier

32

이 방법은 허용되는 답변보다 짧습니다.

git diff 987200fbfb 878cee40ba --stat -- ':!*.cs'

다른 포함 / 제외 가능성에 대한 자세한 내용은 이 다른 게시물을 참조하십시오.


필터는 현재 디렉토리 아래의 모든 파일에만 적용됩니다.
Chiel ten Brinke

이것이 가장 좋은 대답이었습니다. : 나는 조금 더를 단순화 할 수 있었다 stackoverflow.com/a/58845608/3886183을
dlsso

2
나는 --stat 부분을 제거하거나 적어도 다른 답변이 포함되어 있지 않기 때문에 적어도 그 기능을 설명합니다.
mix3d

stat 플래그는 파일과 그 총계를 보여 주어 필터가 의도 한대로 작동했는지 쉽게 확인할 수 있습니다.
Chiel ten Brinke

17

이 한 줄 솔루션에는 다른 유틸리티 / 다운로드가 필요하지 않습니다.

git diff `git status -s |grep -v ^\ D |grep -v file/to/exclude.txt |cut -b4-`

file/to/exclude.txt물론 제외하려는 파일의 이름은 어디에 있습니까 ?

편집 : diff를 깨는 삭제 된 파일을 수정 한 신용 ksenzee .


나는 당신의 하나의 라이너를 git diff --stat master큰 성공없이 적응하려고 노력하고 있습니다 -당신은 도울 수 있습니까?
Mr_and_Mrs_D

13

내가해야 할 일에 대해 KurzedMetal의 정말 좋은 대답 은 파일이 변경되었음을 알 수 있지만 내 경우에는 커질 수있는 diff를 생성 할 수 없었습니다.

그러나 내 동료가 더 간단하고 나를 위해 일한 접근법을 제안했습니다.

.gitattributes무시할 파일이있는 디렉토리에 파일을 추가 git diff하면 다음 내용이 포함됩니다.

file-not-to-diff.bin -diff

그래도 git status파일이 변경되면 "볼" 수 있습니다 . git diff또한 파일이 변경되었음을 "참조"하지만을 생성하지는 않습니다 diff.

.bin예에서 파일의 확장자는 고의적이었다. 이진 파일에 대한 git의 기본 동작이라는 것을 알고 있으며로 특별한 처리가 필요하지 않습니다 .gitattributes. 그러나 필자의 경우이 파일은 git 및 "file"유틸리티에서 텍스트 파일로 인식되어 트릭을 수행했습니다.


11

가장 간단한 답변

git diff ':!db/irrelevant.php'

그것은 단지 ':!<path to file>'당신은 diff 명령 다음에. diff 명령은 원하는만큼 복잡 할 수 있으며 원하는 경우 와일드 카드를 사용 *.min.js하거나 여러 개의 제외를 추가 할 수 있습니다 (따옴표로 묶은 블록을 공백으로 구분).


5

git root 디렉토리와 관련

git diff 선택적 제외를 허용합니다.

git diff -- ":(exclude)thingToExclude"

와일드 카드를 추가하고 싶을 수도 있습니다

git diff -- ":(exclude)*/thingToExclude/*"

대상별 파일 형식

git diff -- ":(exclude)*/$1/*.png"

또는 도트 파일을위한 작은 스크립트를 삭제하십시오

같은 .bash_profile또는.zshrc

gde() {
    # git diff exclude files or folders 
    # usage: 
    # gde fileOrFolderNameToExclude
    git diff -- ":(exclude)*/$1/*"
}

이것은 단지 나를 위해 작동하지 않습니다, 나는 (제외) 또는!를 사용하여 두 구문으로 전혀 차이가 없습니다. 나는 git 2.21.0을 가지고있다
Olivvv

준비되지 않은 파일이나 준비된 파일을 git diff 할 수 있습니다. git을 추가하면 준비됩니다. 그들이 무대에 있다면 당신은 git diff --staged희망이 도움이 될 수 있습니다.
jasonleonhard

구문 적으로 콜론은 무엇을하고 있습니까?
요나

2

매우 간단합니다. 표준 유닉스 명령을 사용하여 원하는 것을 제외시킬 수 있습니다.이 명령은 Windows 환경에서도 git bash에서 사용할 수 있습니다. 아래 예제는 pom.xml 파일에 대해 diff를 제외하고, 먼저 파일 이름에 대해서만 diff를 마스터로 확인한 다음 'grep -v'제외 파일을 사용하여 원하지 않는 파일을 제외하고 다시 preffpred 목록으로 마스터에 diff를 실행하는 방법을 보여줍니다.

git diff master `git diff --name-only master | grep -v pom.xml`

1

Ben Roux의 솔루션 과 유사 하지만 어쨌든 공유하십시오.

git status --porcelain | grep -v $PATTERN_TO_EXCLUDE | awk '{print $2}' | xargs git diff

또는 변경 사항이 이미 로컬로 커밋 된 경우 :

git diff --name-only origin/master | grep -v $PATTERN_TO_EXCLUDE | xargs git diff origin/master

예 :

git status --porcelain | grep -v docs | awk '{print $2}' | xargs git diff origin/master

git diff --name-only origin/master | grep -v docs | xargs git diff origin/master

1

나는 다음을한다 :

git add *pattern_to_exclude*
git diff
git reset HEAD .

나는 그것이 우아한 해결책이 아니라는 것을 알고 때로는 때로는 캐럿을 사용할 수 있지만 (예 : 이미 준비가되어있는 경우) 복잡한 명령을 입력하지 않고도 트릭을 수행합니다.


0

diff를 육안으로 검사하기 위해이 작업을 수행하려면 Meld 와 같은 시각적 diff 도구를 사용하면 기억하기 쉬운 짧은 명령으로 수행 할 수 있습니다.

먼저 diff 도구를 설정하지 않았다면 설정하십시오.

$ git config --global diff.tool = meld

그런 다음 디렉토리 diff를 실행할 수 있습니다.

$ git difftool --dir-diff

Meld (또는 선택한 도구)에서 파일별로 diff를 찾아 볼 수 있습니다. 무시하려는 파일을 열지 마십시오.

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