"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.