IT박스

.gitignore 파일의 경로에 차이가 있습니까?

itboxs 2021. 1. 7. 07:46
반응형

.gitignore 파일의 경로에 차이가 있습니까?


나는 git을 사용해 왔지만 여전히 .gitignore 파일 경로 에 대해 혼란을 겪고 있습니다.

그렇다면 .gitignore 파일 에서 다음 두 경로의 차이점은 무엇 입니까?

tmp / *
공개 / 문서 / ** / *

tmp/*안에있는 모든 파일과 폴더를 무시 한다는 것을 이해할 수 있습니다 . 내가 맞아? 하지만 두 번째 줄 경로는 무엇을 의미합니까?


이것은 쉘의 동작에 따라 다릅니다. Git은이를 확장하는 방법을 결정하는 작업을 수행하지 않습니다. 일반적으로 *단일 파일 또는 폴더와 일치합니다.

/a/*/z
 matches        /a/b/z
 matches        /a/c/z
 doesn't match  /a/b/c/z

** 모든 폴더 문자열과 일치합니다.

/a/**/z
 matches        /a/b/z
 matches        /a/b/c/z
 matches        /a/b/c/d/e/f/g/h/i/z
 doesn't match  /a/b/c/z/d.pr0n

**결합 *하여 전체 폴더 트리의 파일을 일치 시키십시오.

/a/**/z/*.pr0n
 matches        /a/b/c/z/d.pr0n
 matches        /a/b/z/foo.pr0n
 doesn't match  /a/b/z/bar.txt

업데이트 (2016 년 3 월 8 일)

오늘날 나는 **주장대로 작동하지 않는 기계를 찾을 수 없습니다 . 여기에는 OSX-10.11.3 (El Capitan) 및 Ubuntu-14.04.1 (Trusty)이 포함됩니다. 업데이트 된대로 git-ignore 또는 사람들이 예상하는 최근 fnmatch 핸들 일 **수 있습니다. 따라서 받아 들여지는 대답은 이제 실제로 올바른 것 같습니다.


원본 게시물

**의미를 특별한이 없습니다 자식을 . bash> = 4.0의 기능입니다.

shopt -s globstar

그러나 gitbash를 사용하지 않습니다 . git이 실제로 무엇을하는지보기 위해 git add -nv여러 수준의 하위 디렉토리에서 및 파일을 실험 할 수 있습니다 .

OP의 경우 .gitignore파일 에 대해 생각할 수있는 모든 조합을 시도했지만 이보다 더 잘 작동하는 것은 없습니다.

public/documents/

다음은 모든 사람이 생각하는대로 작동하지 않습니다.

public/documents/**/*.obj

내가 무엇을 시도하더라도 작동하도록 할 수는 없지만 적어도 git docs 와 일치합니다 . 사람들이 .gitignore그것을에 추가하면 .obj파일이 정확히 하나의 하위 디렉토리 깊이 이기 때문에 우연히 작동 한다고 생각합니다 . 그들은 아마도 bash 스크립트에서 이중 별표를 복사했을 것입니다. 그러나 아마도 fnmatch(3)bash처럼 이중 별표를 처리 할 수 있는 시스템이있을 것 입니다.


Bash 4와 같은 셸을 사용하는 경우 **는 기본적으로 *의 재귀 버전이며 모든 하위 디렉터리와 일치합니다.

예제에 파일 확장자를 추가하면 더 합리적입니다. tmp 내부의 로그 파일을 즉시 일치 시키려면 다음을 입력합니다.

/tmp/*.log

tmp의 하위 디렉토리에있는 로그 파일을 일치 시키려면 다음을 입력합니다.

/tmp/**/*.log

그러나 git 버전 1.6.0.4 및 bash 버전 3.2.17 (1) -release로 테스트 한 결과 git은 ** glob을 전혀 지원하지 않는 것으로 보입니다. gitignore에 대한 가장 최근의 man 페이지는 이 중 지원되지 않는 아주 새로운 (1), (2), (3) 글 로빙의 시스템의 구현에 어떻게 든 의존하므로, ** 언급하거나하지 않습니다.

또한, 귀하의 예에는 미묘한 것이 있습니다. 이 표현 :

tmp/*

... 실제로는 " 소스 트리의 모든 위치에있는 tmp 디렉토리 내의 모든 파일을 무시 하지만 tmp 디렉토리 자체를 무시하지 마십시오"를 의미합니다. 정상적인 상황에서는 아마도 다음과 같이 작성할 것입니다.

/tmp

...which would ignore a single top-level tmp directory. If you do need to keep the tmp directories around, while ignoring their contents, you should place an empty .gitignore file in each tmp directory to make sure that git actually creates the directory.


Note that the '**', when combined with a sub-directory (**/bar), must have changed from its default behavior, since the release note for git1.8.2 now mentions:

The patterns in .gitignore and .gitattributes files can have **/, as a pattern that matches 0 or more levels of subdirectory.

E.g. "foo/**/bar" matches "bar" in "foo" itself or in a subdirectory of "foo".


See commit 4c251e5cb5c245ee3bb98c7cedbe944df93e45f4:

"foo/**/bar" matches "foo/x/bar", "foo/x/y/bar"... but not "foo/bar".
We make a special case, when foo/**/ is detected (and "foo/" part is already matched), try matching "bar" with the rest of the string.

"Match one or more directories" semantics can be easily achieved using "foo/*/**/bar".

This also makes "**/foo" match "foo" in addition to "x/foo", "x/y/foo"..

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>


Simon Buchan also commented:

current docs (.gitignore man page) are pretty clear that no subdirectory is needed, x/** matches all files under (possibly empty) x

The .gitignore man page does mention:

A trailing "/**" matches everything inside. For example, "abc/**" matches all files inside directory "abc", relative to the location of the .gitignore file, with infinite depth.

A slash followed by two consecutive asterisks then a slash matches zero or more directories. For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on.


When ** isn't supported, the "/" is essentially a terminating character for the wildcard, so when you have something like:

public/documents/**/*

it is essentially looking for two wildcard items in between the slashes and does not pick up the slashes themselves. Consequently, this would be the same as:

public/documents/*/*

It doesn't work for me but you could create a new .gitignore in that subdirectory:

tmp/**/*.log

can be replaced by a .gitignore in tmp:

*.log

ReferenceURL : https://stackoverflow.com/questions/681262/difference-in-the-paths-in-gitignore-file

반응형