.gitignore에서 부정 패턴은 어떻게 작동합니까?


94

부정 된 패턴 (!로 시작하는 줄)이있는 .gitignore 파일을 사용하려고했지만 예상대로 작동하지 않습니다.

최소한의 예로서 다음과 같은 디렉토리 구조가 있습니다.

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

내 gitignore 파일에 다음이 있습니다.

aaa/
!aaa/ccc/

이 문서 페이지를 기반으로 한 내 이해 는 aaa / ccc / otherfile.txt 파일을 무시해서는 안되지만 실제로 git은 aaa 아래의 모든 것을 무시하고 있습니다.

이 문장을 오해하고 있습니까? "패턴을 무효화하는 선택적 접두사!; 이전 패턴에서 제외 된 일치하는 파일은 다시 포함됩니다."?

BTW, 이것은 msysgit 1.7.0.2를 사용하는 Windows에 있습니다.

답변:


163

실제로하고 싶은 것은 다음과 같습니다.

aaa/*
!aaa/ccc

당신은 그것을 "쳐다 보지 말라"라고 말하고 있기 aaa때문에 그것은 경로를 조사조차하지 않는다 aaa/ccc. 와일드 카드를 사용하는 경우 여전히의 내용을 읽은 aaa다음 각 항목이 와일드 카드와 일치하고 무시 aaa/ccc됩니다.


2
@iconoclast : 그렇다면 아마도 다른 일을하고있을 것입니다. 도움이 필요하면 다른 질문 (전체 정보 포함)을 게시하십시오.
Cascabel

이 중 나를 위해 작동하지 않았다 : / 응용 프로그램 / * / 응용 프로그램 /의 myapps / FluidTest / 빈 /!
재로드 스미스

5
@Jarrod 그것은 작동합니다; 당신은 뭔가 다른 일을하고 있습니다. 이 방법은 답에 주어진 정확한 이유 때문에 재귀 적으로 사용해야합니다. ! apps / myApps, apps / myApps / * 등.
Cascabel 2013 년

아, 이제 이해가 안되네요. 그러나 그래서 내가 다시 찬성하지 않을 것입니다.
재로드 스미스

!는 AAA / ** / * AAA / CCC / EEE (특정 경로에서 파일을 제외한 모든 것을 무시)에 대한 작업을하지 않는 이유 원더
푸옹 응웬

23

의 모든 항목을 제외 하고 그 아래의 모든 항목을 aaa포함 aaa/ccc하려면 다음을 사용해야합니다.

aaa/*
!aaa/ccc
!aaa/ccc/*

첫 번째 줄은 git에게 아래의 모든 내용을 무시하도록 지시하고 두 번째 줄은 실제로 세 번째 줄을 "활성화"하는 aaa폴더 aaa/ccc를 무시하지 않도록 지시 한 다음 아래의 모든 내용을 무시하지 않도록 지시합니다 aaa/ccc.


1
세 번째 줄은 나에게 아무런 차이가 없었습니다.
James Hopkin 2014 년

3
의 하위 디렉토리에있는 모든 것을 포함 할 수 있으려면 aaa/ccc무엇 나를 위해 일한 모든 수준에서, !aaa/ccc/**대신!aaa/ccc/*
boclodoa

3

누군가가 아직 git status실행 중 새로 무시되지 않은 항목을 보지 못한다면 git update-indexgit이 변경 사항을 보는 데 도움이 될 수 있습니다 (적어도 gitbash 버전 1.9.x에서).

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