자식 diff에서 디렉토리를 제외


179

내 Git diff에서 전체 디렉토리를 제외시키는 방법이 궁금합니다. (이 경우 / spec). git diff 명령을 사용하여 전체 소프트웨어 릴리스에 대해 diff를 작성하고 있습니다. 그러나 사양 변경은이 절차와 관련이 없으며 두통을 유발할뿐입니다. 이제 내가 할 수 있다는 걸 알아

git diff previous_release..current_release app/

이로 인해 app 디렉토리의 모든 변경 사항에 대한 차이점이 있지만 lib / 디렉토리에는 없습니다. 누구 든지이 작업을 수행하는 방법을 알고 있습니까? 감사!

편집 : 나는 분명히하고 싶습니다. 끝에 모든 디렉토리의 매개 변수를 빼고 / spec을 뺄 수 있다는 것을 알고 있습니다. 명령에서 단일 디렉토리를 실제로 제외하는 방법이 있기를 바랐습니다.


4
하위 모듈 을 무시하려고했기 때문에이 놀라운 질문을 발견했습니다 . 이 경우 나만큼 순진한 사람이라면 이 질문 이 더 도움 될 수 있습니다.
brandizzi

2016 년 9 월에이 작업을 수행 할 기본 Git 스위치가 아직 없다는 것은 이상합니다.
Michael Z

답변:


138

bash를 사용하고 확장 globbing ( shopt -s extglob)을 활성화했다고 가정하면 쉘 측에서 처리 할 수 ​​있습니다.

git diff previous_release current_release !(spec)

다른 모든 것을 나열 할 필요가 없습니다.

또는, 쉘 불가지론 :

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --

당신은 인수를 다시 입력 해야하는 자신을 저장하기 위해 하나의 라이너 쉘 스크립트로 마무리 할 수 ​​있습니다.


1
PS 당신이 강박 관념이 있다면 그래서, 당신은에 압정으로 할 수 있습니다, 숨겨진 파일과 일치하지 않는 글 로빙 .!(.|)로 시작하는 일치하는 모든 것을 .외에 .하고 ...
Cascabel

새 파일이거나 지점 전체에서 삭제 된 파일에서는 작동하지 않는 것 같습니다. 스크립트 실행을 중단시키는 오류가 발생하여 스크립트와 비교할 수 없습니다.
Graham Christensen

2
@ Graham : --방금 추가 한 것이 그 문제를 해결해야 한다고 생각 합니다.
Cascabel

1
멋진 답변입니다. 나는 이름이 (실제 diff가 아닌) 표시되기를 원했기 때문에 --name-only맨 끝에 추가해야 했습니다.
aug

1
파일 이름을 변경하면 오류가 발생하지만 추가하기 만하면 -- path/of/new/file됩니다. :)
aug

321

이 답변 을 바탕으로 다음 을 사용할 수도 있습니다.

git diff previous_release..current_release -- . ':!spec'

이것은 특정 경로를 제외시킬 수있는 새로운 git 기능입니다. 다양한 쉘 원 라이너보다 더 안정적이어야합니다.

이 질문이 여전히 "git diff exclude path"에서 여전히 1 위이기 때문에 이것을 게시하고 있습니다.


4
이 답변을 좋아하십시오. 옵션을 추가하는 경우 이중 대시 전에 추가하십시오. 예 : git diff previous_release current_release --name-status -- . ':!spec'
liamvictor

나는에 대한 브랜치 이름을 사용할 수 몰랐 current_releaseprevious_release- 나를 웃게 만들어 내가 그것을 알아 냈 때.
trueheart78

2
나를 위해 일한 것 git diff --stat dev -- . ':!/Mopy/Docs/*'. 무엇을 않았다 없는 나를 위해 작동 git diff dev --stat -- . ':!('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'및 변형
Mr_and_Mrs_D

정말 도움이됩니다. 다음은 database.yml 이외의 파일이 변경되었는지 확인하는 구문입니다.git diff --check -- . ':!config/database.yml'
Dan Kohn

17
다음과 같이 여러 항목을 제외 할 수도 있습니다.git diff previous_release current_release -- . ':!file_a' ':!file_b'
PseudoNoise

37

git diff에서 제외 할 경로를 두 개 이상 지정하려면 끝에 제외 매개 변수를 추가하십시오 (예 : stats 에서 공급 업체bin 디렉토리의 모든 항목 제외) .

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'

33

lib 디렉토리 내의 모든 파일에 대해 diff 속성을 시도하고 설정 해제 할 수 있습니다.
.gitattributes:

lib/* -diff

racl101 은 주석에 다음을 추가합니다 .

git diffWebpack의 .js파일 번들링에 의해 생성 된 모든 JavaScript와 같이 특정 디렉토리 및 하위 디렉토리 내에서 특정 유형의 파일 출력 을 제한하려는 사용자 를 위해 추가하면됩니다. ~까지 .gitattributes:

dist/js/**/*.js -diff

그런 다음 git diff 출력에 모든 노이즈가 표시되지 않고 다음과 같이 표시됩니다 Binary files ... differ.


이것은 내 모든 diff에서 spec을 제거합니다. 나는 여전히이 '릴리스'diff를 실행할 때가 아니라 spec 폴더에서 내 diff를 정상적으로보고 싶다.
Mysrt

2
@Mystr : .gitattributes이런 종류의 '릴리스'diff만을 위해 만들어진 특별한 브랜치에서 파일을 설정할 수 있습니다.) 그 특별한 브랜치를 리베이스하고 current_release거기에서 diff를하십시오.
VonC

이것은 분기에서 삭제 된 파일에는 작동하지 않는 것 같습니다. 제거 된 파일은 여전히 ​​완전한 diff를 보여줍니다.
Graham Christensen

나를 위해 작동하지 않습니다. _ 경로는 특별합니까? _site/* -diff
Marius

@MariusAndreiana 아니요, '_'은 특별하지 않습니다. git-scm.com/docs/git-check-attr
VonC

22

힘내 diff는 이제 사용자 정의 제외 형식을 허용합니다. git diff -- ':(exclude)lib/*'

반복적 인 폴더 이름 ( '/ app', '/ lib'등)이 많은 경우 현재 작업 디렉토리 및 git root 디렉토리에 상대적인 파일이 제외되므로주의하십시오.


1
점이 누락 git diff -- . ':(exclude)lib/*'되었습니까?
Nicolas Dermine

1
@NicolasDermine 아니요, 작성한 내용은 동일합니다. 경로의 "포함"부분도 선택 사항입니다. 그렇기 때문에 git diff현재 경로와 관련된 모든 것을 요구하지 않고 할 수 있습니다.git diff -- .
MaxPRafferty

참고 : Windows 컴퓨터에서는 다음과 같이 큰 따옴표를 사용하십시오.git diff -- ":(exclude)lib/*"
cnlevy

왜 그런지 모르겠지만 @NicolasDermine에서 제안한대로 점에서만 작동합니다. win10에서 Cmder를 사용합니다.
Olivvv

3

git root 디렉토리와 관련

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

git diff -- ":(exclude)thingToExclude"

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

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

대상별 파일 형식

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

일부 구문 설탕이 적용됨

git diff -- ":!/\$1/"

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

같은 .bash_profile또는.zshrc

gde() {
    : '
        git diff exclude files or folders
        usage:
        gde fileOrFolderNameToExclude
    '
    git diff -- ":!/\$1/"
}

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