gitignore에서 선행 슬래시를 사용하는 경우


108

나는 .gitignore구문을 더 명확하게 이해하려고 노력하고 있으며, 특히 https://github.com/github/gitignore gitignores에 관한 한.

선행 슬래시가 .gitignore파일 위치 ( http://git-scm.com/docs/gitignore에서 ) 와 관련된 경로 이름 만 일치시키는 데 사용되는 것을 확인했습니다 .

선행 슬래시는 경로 이름의 시작과 일치합니다. 예를 들어 "/*.c"는 "cat-file.c"와 일치하지만 "mozilla-sha1 / sha1.c"와는 일치하지 않습니다.

하지만 선행 슬래시를 제거하면 어떻게됩니까? 내가 이해 한 한 두 가지 경우가 있습니다.

  1. 패턴에 슬래시가 포함되지 않은 경우 (또는 후행 슬래시 만 포함되어 디렉토리와 일치해야 함) 검색은 전체 디렉토리 트리 내에서 수행됩니다. 예를 들어, 패턴이 dir/일치합니다 <root>/dir, <root>/a/dir, <root>/a/b/c/.../dir, 등, 어디 <root>의 위치입니다 .gitignore파일.
  2. 패턴에 후행 위치가 아닌 (마지막 문자가 아님) 슬래시가 포함 된 경우 .gitignore파일 위치에 상대적인 경로 이름과 만 일치합니다 .

다음은이 동작을 확인하기 위해 만든 예제입니다.

# Directory structure:
<root>
├─ dir/
│   └─ test
├─ src/
│   ├─ dir/
│   │   └─ test
test file is there only because Git does not track empty directories.

첫 번째 테스트 :

# .gitignore
dir/

# git status
nothing to commit

따라서 Git은 두 dir디렉토리를 모두 무시합니다 . 이것은 사례 번호 1과 일치합니다. 패턴에 슬래시가 없으므로 (후행을 제외하고) Git은 전체 디렉토리 트리를 감시하고 패턴과 일치하는 모든 것을 무시합니다.

두 번째 테스트 :

# .gitignore
/dir/

# git status
Untracked files:
    src/

여기서 Git은 dir패턴의 선행 슬래시 덕분에 루트 디렉토리 바로 아래 의 디렉토리 만 무시합니다 .

세 번째 테스트 :

# .gitignore
dir/*

# git status
Untracked files:
    src/

이는 케이스 번호 2와 일치합니다. 패턴 내부에 슬래시가 있으므로 루트 디렉토리에서 시작하는 경로 이름으로 간주됩니다.

이제 진짜 질문을 할 시간입니다. 이 gitignore 파일을 생각해 봅시다 . downloader/예를 들어 디렉토리를 무시할 때 downloader전체 디렉토리 트리에서 발견 된 모든 단일 디렉토리 를 실제로 무시하지 않습니까? 이것이 내가 전에 Git의 작동에 대해 본 이후로 생각하게 된 것입니다.

그렇다면 downloader내부에 디렉토리 가있는 사용자 정의 모듈이있는 경우 Magento 루트의 일반 모듈과 마찬가지로 예기치 않게 무시됩니까? 이것은 실제로 이미 나에게 발생하여 버그를 찾기가 정말 어렵 기 때문에 약간의 정당한 질문입니다.

그래서, 마 젠토에 .gitignore제대로 루트에서 시작하는 경로 이름에 대해 일치되도록 패턴의 많은, 슬래시를 포함하지만, 몇 가지 경우가, 같은가 (내가 BTW, 예로서 만 말하는 겁니다) 파일 downloader/또는 errors/것을 , 내가 착각하지 않았다면 잠재적으로 위험하며 아마도 /downloader/및 으로 변경해야합니다 /errors/.

보다 일반적인 질문으로, 루트에서 명시 적으로 시작하는 경로 이름을 선택하고 슬래시를 포함하는 패턴에는 사용하지 않으려는 경우 항상 슬래시를 포함하지 않는 패턴 (후행 제외)에 선행 슬래시를 사용해야합니까? 명확성을 위해 항상 선행 슬래시를 사용합니까? 당신이 그것에 대해 어떻게 생각하십니까?

읽어 주셔서 감사하고 긴 게시물에 대해 죄송합니다.


8
좋은 질문과 정말 좋은 설명, 나도 이것으로 귀찮았 고 당신의 연구는 나에게 분명한 것을 보여주었습니다. 이것을 읽은 후 루트에서 시작해야하는 경우 항상 슬래시로 경로를 시작하는 것이 좋은 습관이라고 말하고 싶습니다.
Martinsos

4
감사합니다 :) 의도를 더 명확히하기 위해 슬래시를 사용하는 것에 대한 귀하의 의견에 동의합니다.
swahnee 2014

8
이것은 .gitignore 문서의 일부 여야합니다. 이해하기 훨씬 쉽습니다!
rmorrin

이 훌륭한 게시물이 질문과 답변 섹션으로 나뉘어져있는 것을보고 싶습니다.
Barett

답변:


25

가능한 빠른 미래 참조를 위해 요약하고 싶었습니다. 선행 슬래시는 일치 항목을 루트에 고정합니다. 따라서 아래의 예에서 슬래시가 없으면 와일드 카드는 *트리 아래로 재귀 적으로 이동 하기 때문에 foo 내의 모든 항목도 제외 합니다. 그러나에서는 /*foo 폴더와 그 내용을 제외한 모든 항목을 제외합니다.

$ cat .gitignore
/*
!/foo

24

당신은 당신 자신의 질문에 완전히 대답했습니다. github / gitignore 저장소를 좀 더 자세히 살펴보면 대부분의 파일이 패턴 작성 방법에 대한 일관성없는 규칙을 사용하는 것을 볼 수 있습니다. 문서를 읽거나 테스트하지 않은 사람들이 대부분 기여했을 가능성이 큽니다.

따라서 도움이된다면 : 당신이 옳습니다.

이와 같은 협업 프로젝트에서 실수를 발견하면 주저하지 말고 지식을 제공하십시오. 자신감을 더 쌓아야 할 경우 에도 몇 가지 전례 가 있습니다.

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