Git 무시 디렉토리와 directory / *의 차이점은 무엇입니까?


108

git의 디렉토리 내용을 무시하는 올바른 방법이 무엇인지 혼란 스럽습니다.

다음 디렉터리 구조가 있다고 가정합니다.

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

이것을 두는 것의 차이점은 무엇입니까?

www

이?

www/*

제가이 질문을하는 이유는 다음과 같습니다. git에서 디렉토리가 비어 있으면 git은 저장소에 빈 디렉토리를 포함하지 않습니다. 그래서 나는 비어 있지 않도록 디렉토리 아래에 여분의 .gitkeep 파일을 추가하는 솔루션을 시도했습니다. 해당 솔루션을 시도 할 때 .gitignore 파일에 다음과 같이 작성합니다.

www
!*.gitkeep

작동하지 않습니다 (내 의도는 www 아래의 모든 내용을 무시하고 디렉토리를 유지하는 것입니다). 그러나 다음을 시도하면 :

www/* 
!*.gitkeep

그러면 작동합니다! 그래서 두 가지 접근 방식 사이에 약간의 차이가있을 것 같습니다.


사이의 간단한 차이 binbin/전자 파일이나 폴더, 후자의 폴더 만 무시하는 것입니다. 나는 차이점을 모르겠어요bin/*
패닉 대령

답변:


203

www, www/및 간에 차이점이 있습니다 www/*.

기본적으로에서 문서 와 내 자신의 테스트 www, 파일이나 디렉토리와 일치하는 항목을 찾지 www/만 디렉토리와 일치하면서 www/*경기의 디렉토리와 파일 내부 www.

난 단지 사이의 차이점을 설명하겠습니다 www/www/*의 차이 때문에, 여기 www와는 www/분명하다.

의 경우 www/git은 디렉토리 www자체를 무시 하므로 내부를 보지 않을 것입니다. 그러나의 www/*경우 git www은 내부의 모든 파일 / 폴더를 확인 하고 패턴으로 모든 파일 / 폴더 를 무시합니다 *. www자식 파일 / 폴더가 모두 무시되면 git이 빈 폴더를 추적하지 않기 때문에 동일한 결과가 나타나는 것 같습니다 . 그리고 실제로 결과는 OP의 경우 www/또는 www/*독립형에 차이가 없습니다 . 그러나 다른 규칙과 결합하면 차이가 있습니다.

예를 들어, www/1.txt내부에 다른 모든 것을 포함 하고 무시 하려면 어떻게해야 www합니까?

다음 .gitignore은 작동하지 않습니다.

www/
!www/1.txt

다음 .gitignore은 작동 하지만 그 이유는 무엇입니까?

www/*
!www/1.txt

전자의 경우 git은 디렉토리를 무시하고 다시 www포함하기 위해 내부를 보지 않습니다 www/1.txt. 첫 번째 규칙은 상위 디렉토리를 제외 www하지만 제외하므로 www/1.txt결과적 www/1.txt으로 " 다시 포함 "할 수 없습니다 .

그러나 후자의 경우 git은 먼저 아래의 모든 파일 / 폴러를 무시한 www다음 www/1.txt.

이 예의 경우 문서의 다음 줄이 도움이 될 수 있습니다.

선택적 접두사 "!" 패턴을 부정합니다. 이전 패턴에서 제외 된 일치 파일은 다시 포함됩니다. 해당 파일의 상위 디렉토리가 제외 된 경우 파일을 다시 포함 할 수 없습니다.


당신은 그렇게 생각하지 마십시오 www/1.txt다음 www/... 두 번째 방법과 동일 할 것
나비 드 버트

8

나는 문서를 파싱하고 있으며, 내가 말할 수있는 한 그들은 더 고급 패턴에서만 다릅니다.

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

나는 위의 테스트를하고 교체하는 경우 !/foo!/foo/*, 당신은 실제로 다른 결과를 얻을 수 없습니다.

노트

foo

모든 파일을 제외 foo하지만

foo/

foo라는 디렉토리 만 제외합니다.


3

이미 얻은 완벽하게 좋은 답변을 제외하고는 .gitignore하위 폴더를 포함하여 프로젝트의 모든 위치에 있을 수 있습니다 .

그래서 당신은 내부의 모든 파일을 무시하려면 www,하지만 whant www폴더 대신 빈을 사용하는 버전이 될 .gitkeep, .dummy또는 무엇이든 당신이 선택 이름을 왜 사용하지 .gitignore모든 파일을 무시하는 말, 거기?

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

루트 .gitignore(a)에서는 www폴더 나 그 내용에 대해 아무 말도하지 않습니다 .

에서 www/.gitignore(b) 귀하는 다음을 넣어 :

# ignore all files in this folder except this .gitignore
*
!.gitignore

이렇게하면 모든 것이 더 체계적으로 보입니다 (적어도 나에게는).


1

dotfile을 제외한 디렉토리의 모든 것을 무시하려면 다음 glob 패턴을 사용할 수 있습니다 .gitignore.

www/[^.]*

따라서 .gitignore추가는 필요하지 않습니다 . 디렉토리에 .keep파일을 추가하기 만하면 www됩니다.

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