.gitignore 제외 폴더이지만 특정 하위 폴더 포함


964

application/추가 한 폴더 가 있습니다 .gitignore. application/폴더 안에는 폴더가 application/language/gr있습니다. 이 폴더를 어떻게 포함시킬 수 있습니까?

나는 이것을 시도했다

application/
!application/language/gr/

운없이 ...


1
" .gitignore패턴 형식"문서가 더 명확 해지기를 바랍니다 (2013 년 12 월). 아래 내 답변
VonC

내가 좋아하는 질문과 답변이 즐겨 찾기 및 브라우저 책갈피에 추가되었습니다.
codekiddy

답변:


1611

을 제외 application/하면 그 아래의 모든 제외 항목이 제외 됩니다 (나중에 일부 제외 제외 패턴 ( "무시")이 아래의 항목과 일치하더라도 application/).

원하는 작업을 수행하려면 "무시"하려는 모든 상위 디렉토리를 "무시"해야합니다. 일반적으로이 상황에 대한 규칙을 쌍으로 작성합니다. 디렉토리의 모든 것을 무시하지만 일부 하위 디렉토리는 무시합니다.

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

참고
후행 /*은 중요합니다.

  • 이 패턴 dir/은 이름이 지정된 디렉토리 dir와 그 아래의 모든 것을 암시 적으로 제외 합니다.
    을 사용 dir/하면 Git은 아래에있는 항목을 절대로 보지 dir않으므로 "exclude"패턴을 아래에있는 대상에 적용하지 않습니다 dir.
  • 패턴 dir/*dir그 자체 에 대해서는 아무 것도 말하지 않습니다 . 아래의 모든 것을 제외합니다 dir. 을 사용 dir/*하면 Git은의 직접 콘텐츠를 처리하여 dir다른 패턴에 콘텐츠의 일부를 "제외"할 수있는 기회를줍니다 ( !dir/sub/).

12
후행 별표가 중요합니까? 그렇다면 의미의 차이는 무엇입니까? gitignore 문서에 설명 된 알고리즘에 따라 슬래시로 끝나는 디렉토리는 디렉토리와 해당 디렉토리 아래의 경로와 일치합니다. 별표로 끝나는 것은 glob 패턴으로 취급 될 것입니다. 실험 결과 별표 변형이 작동하지만 슬래시로 끝나는 것은 아닙니다. 왜 그런지 이해하고 싶습니다.
seh

123
@ seh : 예, 후행 /*이 중요합니다. 디렉토리가 제외되면 Git은 해당 디렉토리의 내용을 절대 보지 않습니다. 이 패턴 dir/은 이름이 지정된 디렉토리 dir와 그 아래의 모든 것을 암시 적으로 제외 합니다. 패턴 dir/*dir그 자체 에 대해서는 아무 것도 말하지 않습니다 . 아래의 모든 것을 제외합니다 dir. 을 사용 dir/하면 Git은 아래에있는 항목을 절대로 보지 dir않으므로 "exclude"패턴을 아래에있는 대상에 적용하지 않습니다 dir. 을 사용 dir/*하면 Git은의 직접 콘텐츠를 처리하여 dir다른 패턴에 콘텐츠의 일부를 "제외"할 수있는 기회를줍니다 ( !dir/sub/).
크리스 존슨

7
아, 그 설명입니다. gitignore 문서를 몇 번 읽었 어도 되 돌린 패턴이 작동하지 않는 것을 이해하지 못했습니다. 당신의 설명으로, 이제 명확합니다. gitignore의 문서는이 작업을 수행하는 방법을 설명하기 위해 "조리법"절을 필요로한다.
seh

8
나는 이것을 작동시키지 못했습니다 (crazy .gitignore file!). 대신 내가 원하는 디렉토리에 cd 후 파일을 강제로 추가했습니다. git add -f .
K0D4

2
의 출력에 의존 할 수는 없습니다. git status최상위 디렉토리가 추가 될 것입니다. 대신 git add최상위 디렉토리 중 하나 를 수행 한 다음 git status패턴과 일치하는 파일의 서브 세트를 나열하십시오.
Matthew Strawbridge

136

Git 1.9 / 2.0 (2014 년 1 분기 )에 대한 Karsten Blees (kblees)의 Commit 59856de 는 다음과 같이 설명합니다.

gitignore.txt: 제외 된 디렉토리의 재귀 적 특성을 명확하게합니다.

!패턴을 무효화 하는 선택적 접두사 " "; 이전 패턴에서 제외 된 일치하는 파일은 다시 포함됩니다.

해당 파일의 상위 디렉토리가 제외 된 경우 파일을 다시 포함 할 수 없습니다. ( *)
( *: git 2.8+에서 특정 조건이 충족되지 않는 한, 아래를 참조하십시오)
Git은 성능상의 이유로 제외 된 디렉토리를 나열하지 않으므로 포함 된 파일의 패턴은 정의 된 위치에 관계없이 영향을 미치지 않습니다.

리터럴 " "로 시작하는 패턴 (예 : " \")의 경우 첫 번째 " !" 앞에 백 슬래시 ( " ")를 넣으십시오 .!\!important!.txt

특정 디렉토리를 제외한 모든 것을 제외하는 예 foo/bar( /*슬래시없이-와일드 카드도의 모든 것을 제외합니다 foo/bar) :

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

귀하의 경우 :

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

지정된 폴더 내에서 파일을 허용 목록에 추가하려면 먼저 폴더를 허용 목록에 추가해야 합니다.


2016 년 2 월 / 3 월 업데이트 :

git 2.9.x / 2.10 (2016 년 중반?) 을 사용하면 경로에 와일드 카드가 없으면 해당 파일의 상위 디렉토리가 제외 된 경우 파일을 다시 포함 할 수 있습니다 .

Nguyễn Thái Ngọc Duy ( pclouds) 가이 기능을 추가하려고합니다.

따라서 git 2.9+를 사용하면 실제로 작동 할 수 있었지만 궁극적으로 되돌 렸습니다.

application/
!application/language/gr/

Windows 용 git에 대한 답변 끝에 게시 된 업데이트 된 re-include 구문을 사용하려고 시도했지만 v2.8.1.windows.1작동하지 않는 것 같습니다. (
David Hancock

1
@DavidHancock 죄송합니다. 답변을 편집했습니다 : 아직 사용할 수 없습니다.
VonC

1
@DavidHancock 나도 : 그것은 여러 번 편집해야했던 13 개 이상의 스택 오버플로 답변입니다!
VonC

5
Git 2.9가 어제 릴리스되었습니다. 답변에 언급 된 application/+ !application/language/gr/패턴을 확인하는 것이 예상대로 작동합니다.
Ray Shan

1
@RayShan Strange : 되돌리기 커밋이 해당 기능을 취소하는 것을 보았지만 보지 못했습니다 ( 릴리트 노트 github.com/git/git/blob/master/Documentation/RelNotes/2.9.0.txt 는 언급하지 않았습니다) .gitignore 규칙을 개선하는 커밋.
VonC 2016 년

52

@Chris Johnsen의 대답은 훌륭하지만 최신 버전의 Git (1.8.2 이상)에서는 좀 더 간단한 솔루션을 위해 활용할 수있는 이중 별표 패턴이 있습니다.

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

이 방법으로 추적하려는 하위 폴더의 상위 디렉토리를 "고시"할 필요가 없습니다.


Git 2.17.0을 사용하면 (이 버전 이전에 얼마나 초기인지 확실하지 않을 수 있습니다. 1.8.2로 되돌아 갈 수 있습니다), **파일로 이어지는 각 하위 디렉토리에 대해 제외와 결합 된 패턴을 사용하면 작동합니다. 예를 들면 다음과 같습니다.

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder

9
패턴이 있기 때문에 아아,이 (힘내 1.8.4.msysgit.0) 실패 **제로 하위 폴더를 일치시킬 수 있습니다, 그리고 *일치 language의 포함을 방지를하고 제외 gr. @Chris Johnson이 권장하는 부모의 전체 체인은 여전히 ​​필요한 것 같습니다.
Sean Gugler

3
완벽하게 들리지만 git 2.3.7 ... /www/**/* !/www/config.xml !/www/resconfig.xml 에서 작동하지 않으며 res 디렉토리는 여전히 무시됩니다.
Rob

@Rob도 추가해야합니다 !/www/res/. folder/**/*패턴을 사용할 수 있지만 추가하려는 각 하위 디렉토리에 대해 제외를 추가해야합니다. 무시 / 제외 콤보보다 여전히 짧고 읽기 쉽습니다.
벤 케인

나는 그것이 오래된 의견이라는 것을 알고 있지만, 당신이 궁금하다면. 이 접근법을 문서화하는 답변에 수정 사항을 추가했습니다.
벤 케인

21

이것에 대해 비슷한 질문이 많이 있으므로 이전에 쓴 내용을 게시하겠습니다.

내 컴퓨터 에서이 작업을 수행하는 유일한 방법은 다음과 같이하는 것입니다.

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

포함하려는 각 수준에 대해 콘텐츠를 명시 적으로 허용해야하는 방법에 주목하십시오. 하위 테마가 5 개의 테마 아래에있는 경우에도 여전히이를 설명해야합니다.

이것은 @Yarin의 의견에서 온 것입니다 : https://stackoverflow.com/a/5250314/1696153

다음은 유용한 주제였습니다.

나는 또한 시도했다

*
*/*
**/**

**/wp-content/themes/**

또는 /wp-content/themes/**/*

그 중 어느 것도 나를 위해 일하지 않았습니다. 많은 시행 착오!


1
참고 : 순서는 .gitignore 파일에서도 중요하므로 !규칙을 맨 아래에 배치해야합니다 .
starbeamrainbowlabs


8

가장 간단하고 가장 좋은 방법은 파일을 수동으로 추가하는 것입니다 (일반적으로 .gitignore스타일 규칙 보다 우선 함 ).

git add /path/to/module

당신도 할 수 있습니다 -N 의도 추가 당신이 제안, 플래그를 수 있지만 즉시 추가합니다. 아직 준비 할 준비가되지 않은 새 파일에 대해 종종이 작업을 수행합니다.


이것은 쉽게 품질 보증이 될 수있는 것에 대한 답변사본입니다 . 가시성을 높이기 위해 여기에 다시 게시하고 있습니다. gitignore 규칙을 어지럽히 지 않는 것이 더 쉽다는 것을 알았습니다.


2
이 답변에 감사드립니다. .gitignore에 있기 때문에 -f를 추가해야
jasonflaherty

6

그래서 많은 프로그래머들이 node를 사용하기 때문에. 이 질문에 맞는 유스 케이스 는 예를 들어 node_modules하나의 모듈 을 제외 하고 제외하는 것입니다 module-a.

!node_modules/

node_modules/*
!node_modules/module-a/

2
자식 버전에서는 작동하지 않습니다 2.10.2.windows.1.
Sebastian

1
git 버전 2.10.2의 경우이 답변을
nalexn

👌 위대한 👋 👋.
Abdennour TOUMI

6

추가 답변을 추가하십시오.

!/.vs/              <== include this folder to source control, folder only, nothing else
/.vs/*              <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/       <== then include this folder to source control, folder only, nothing else
!/.vs/config/*      <== then include all files inside the folder

결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


2
이것은 시각 자료가 도움이 된 가장 유용한 대답이었습니다. 감사!
Joel Murphy

4

특히 이전 Git 버전의 경우 대부분의 제안이 제대로 작동하지 않습니다. 이 경우 다른 설정에 관계없이 내용을 포함시킬 디렉토리에 별도의 .gitignore를 넣고 필요한 것을 허용합니다.

예를 들면 다음과 같습니다. /.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

따라서 / dependency_files (심지어 .dll 파일)의 모든 내용이 포함됩니다.


4

나는 laravel에서 기본적으로 asterix를 .gitignore사용하는 모든 것을 무시하고 공용 디렉토리를 무시 하는 비슷한 경우를 발견했습니다 .

*
!public
!.gitignore

OP 시나리오가 시작되면 충분하지 않습니다.

public예를 들어 public/products디렉토리 에서 특정 하위 폴더를 커밋하려면 예를 들어 디렉토리에 하나의 하위 폴더 깊이에있는 파일을 포함 public/products/a/b.jpg시키려고합니다 !/public/products.!public/products/* 등 ..

해결책은 모든 경로 레벨에 대한 항목을 추가하여 모든 경로 레벨을 대체하는 것입니다.

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*

3

디렉토리 구조를 내려 가서 원하는 것을 정확하게 얻는 또 다른 예입니다. 참고 : 제외 Library/하지는 않았지만Library/**/*

# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme

> git add Library

> git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
    new file:   Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
    new file:   Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings

내가하고 싶었던 일 ;-)
Kitze

3

WordPress에서 이것은 나를 도왔습니다.

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**

3

gitignore-의도적으로 추적되지 않은 파일을 무시하도록 지정합니다.

특정 디렉토리 foo / bar 를 제외한 모든 것을 제외하는 예제 ( / * -슬래시없이 와일드 카드는 foo / bar 내의 모든 것을 제외 합니다 )

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

WordPress의 다른 예 :

!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin

자세한 내용은 여기 : https://git-scm.com/docs/gitignore


2

CLI 에서이 해결 방법을 자주 사용하는 경우 내 구성 대신 대신 디렉토리에도 불구하고 포함하거나 (하위) 디렉토리를 직접 정의하거나 재귀 적으로 무시 .gitignore하는 별도의 .include파일을 만듭니다 .gitignore.

따라서 나는 추가적으로

git add `cat .include`

준비하기 전에 커밋하기 전에

OP .include에는 다음과 같은 줄을 사용하는 것이 좋습니다 .

<parent_folder_path>/application/language/gr/*

참고 :를 사용하면 $ HOME (또는 기타 특정 디렉토리)을 지정하기 위해 cat별명을 사용할 수 없습니다 .include. 위의 명령 homedir/app1/*git add사용하여 전달 될 때 행 이로 나타나고 git add 'homedir/app1/*'작은 따옴표 ( '')로 문자를 묶으면 따옴표 안에 각 문자의 리터럴 값이 유지되므로 별칭 (예 : homedir )이 작동하지 않습니다 ( Bash Single 참조). 인용 부호 ).

여기 .include내 저장소에 사용 하는 파일 의 예가 있습니다 .

/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc

1

jquery 프로덕션 js 파일을 추적하고 싶었고 다음과 같이 작동했습니다.

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*

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