IT

gitignore 제외 규칙은 실제로 어떻게 작동합니까?

lottoking 2020. 6. 21. 19:09
반응형

gitignore 제외 규칙은 실제로 어떻게 작동합니까?


큰 디렉토리 구조에서 gitignore 문제를 해결하려고하지만 내 질문을 단순화하기 위해 다음과 같이 줄였습니다.

새로운 git 저장소에 두 파일 (foo, bar)의 다음 디렉토리 구조가 있습니다 (지금까지 커밋 없음).

a/b/c/foo
a/b/c/bar

분명히 'git status -u'는 다음을 보여줍니다.

# Untracked files:
...
#       a/b/c/bar
#       a/b/c/foo

내가하고 싶은 것은 a / b / c 안의 모든 것을 무시하지만 'foo'파일을 무시하지 않는 .gitignore 파일을 만드는 것입니다.

내가 .gitignore를 만들면 :

c/

그런 다음 'git status -u'는 foo와 bar를 무시한 것으로 표시합니다.

# Untracked files:
...
#       .gitignore

내가 기대 한대로.

이제 foo에 대한 제외 규칙을 추가하면 다음과 같습니다.

c/
!foo

gitignore 맨 페이지에 따르면, 이것이 효과가있을 것으로 기대합니다. 그러나 그것은 아닙니다-여전히 foo를 무시합니다.

# Untracked files:
...
#       .gitignore

이것은 작동하지 않습니다 :

c/
!a/b/c/foo

이것도 마찬가지입니다 :

c/*
!foo

제공합니다 :

# Untracked files:
...
#       .gitignore
#       a/b/c/bar
#       a/b/c/foo

이 경우 foo는 더 이상 무시되지 않지만 bar도 무시되지 않습니다.

gitignore의 규칙 순서는 중요하지 않습니다.

이것은 또한 내가 기대하는 것을하지 않습니다 :

a/b/c/
!a/b/c/foo

그것은 foo와 bar를 모두 무시합니다.

작동하는 한 가지 상황은 a / b / c / .gitignore 파일을 만들고 거기에 넣는 경우입니다.

*
!foo

그러나 이것의 문제는 결국 a / b / c 아래에 다른 하위 디렉토리가있을 것이고 모든 단일 디렉토리에 별도의 .gitignore를 넣고 싶지 않다는 것입니다. '프로젝트 기반'.gitignore를 만들고 싶었습니다. 각 프로젝트의 최상위 디렉토리에 있고 모든 '표준'서브 디렉토리 구조를 포함 할 수있는 파일.

이것은 또한 동등한 것으로 보입니다.

a/b/c/*
!a/b/c/foo

이것은 내가 달성 할 수있는 "작동"에 가장 가까운 것일 수 있지만 전체 상대 경로와 명시 적 예외를 명시해야합니다. 다른 수준에서 'foo'라는 이름의 파일이 많이 있으면 고통 스럽습니다. 서브 디렉토리 트리의

어쨌든 제외 규칙의 작동 방식을 잘 모르겠거나 / 와일드 카드가 아닌 디렉토리가 무시 될 때 전혀 작동하지 않습니다.

누구든지 이것에 대해 약간의 빛을 비출 수 있습니까?

gitignore 가이 서투른 쉘 기반 구문 대신 정규 표현식과 같은 합리적인 것을 사용하게하는 방법이 있습니까?

Cygwin / bash3의 git-1.6.6.1 및 Ubuntu / bash3의 git-1.7.1에서 이것을 사용하고 관찰합니다.


/알파벳/*
! foo

Seems to work for me (git 1.7.0.4 on Linux). The * is important as otherwise you're ignoring the directory itself (so git won't look inside) instead of the files within the directory (which allows for the exclusion).

Think of the exclusions as saying "but not this one" rather than "but include this" - "ignore this directory (/a/b/c/) but not this one (foo)" doesn't make much sense; "ignore all files in this directory (/a/b/c/*) but not this one (foo)" does. To quote the man page:

An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again.

i.e., the file has to have been excluded already to be included again. Hope that sheds some light.


I have a similar situation, my solution was to use:

/a/**/*
!/a/**/foo

That should work for an arbitrary number of intermediate directories if I read ** correctly.


Here is another option:

*
!/a*
!/a/*
!/a/*/*
!/a/*/*/*

That would ignore every file and directory, except files/directories three levels deep within a.


this is definitely not clear from the .gitignore man page. This works:

*
!/a
!/a/b
!/a/b/c
!/a/b/c/foo

# don't forget this one
!.gitignore

As mentioned by Chris a directory is not even opened if it is excluded. So if you want to be able to ignore * but some files, you have to build the path to those files as above. For me this is convenient, because I want to do a code review on 1 file of a library and if I want to do another later I just add it, and all else is ignored.


On a more general note, git1.8.2 will include the patch (also in its v4, prompted by some Stack Overflow question) from Adam Spiers about determining which gitignore rule actually ignores your file.

See git1.8.2 release notes and the SO question "which gitignore rule is ignoring my file":
that will be the command git check-ignore.

참고URL : https://stackoverflow.com/questions/3001888/how-do-gitignore-exclusion-rules-actually-work

반응형