.gitignore가 몇 개의 파일을 제외한 모든 것을 무시하게하십시오.


1698

gitgitore 파일이 Git의 버전 제어에서 지정된 파일을 은폐한다는 것을 이해합니다. 실행되면서 많은 추가 파일 (.auth, .dvi, .pdf, 로그 등)을 생성하는 프로젝트 (LaTeX)가 있지만 파일을 추적하고 싶지 않습니다.

폴더를 무시할 수 있기 때문에 모든 파일이 프로젝트의 별도 하위 폴더에 저장되도록 할 수 있음을 알고 있습니다.

그러나 출력 파일을 프로젝트 트리의 루트에 유지하고 .gitignore를 사용하여 Git으로 추적하는 파일을 제외한 모든 것을 무시하는 가능한 방법이 있습니까? 같은 것

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

12
stackoverflow.com/q/9162919/321973복제본 (이것이 새로운 것이지만 대답은 더 정확하다는 것을 알고 있습니다). 실제로이 답변 은 아마도 최고 일 것입니다
Tobias Kienzler

답변:


2437

!패턴을 무효화 하는 선택적 접두사 입니다. 이전 패턴에서 제외 된 일치하는 파일은 다시 포함됩니다. 부정 패턴이 일치하면 우선 순위가 낮은 패턴 소스보다 우선합니다.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

14
루트 디렉토리 이외의 파일에 'script.pl'이라는 이름의 파일을 찾을 수 없도록 이것도 하위 폴더를 '무시'하는 것처럼 보입니다. 나는 이것을 지금 (* .pl과 함께) 사용하고 있으며 .gitignore 파일 아래의 하위 디렉토리에 많은 디렉토리가 있지만 모든 * .pl 파일은 무시됩니다.
PandaWood

38
@ 판다 우드 그 문제는 여기 에 제기되었습니다 (stackoverflow.com). 디렉토리를 포함하여 모든 것을 일치시키는 첫 번째 표현식으로 인해 발생합니다. 수정하려면 현재 디렉토리의 하위 디렉토리 (재귀 적으로)와 일치하는 (! * /)를 추가하십시오. 이것은 특정 파일을 허용하는 상위 응답에 도움이되지 않습니다 (하위 디렉토리에있는 경우 전체 경로를 수동으로 지정하거나 디렉토리 특정 .gitignore 파일을 사용하려고 할 것입니다).
simont

40
나는 이것을 작동시킬 수 없었다. 폴더 (예 :)를 무시하고 wp/있지만 해당 폴더의 일부 파일 (예 :)을 무시하고 싶지 않습니다 wp/path/to/some/location/*. 내가 그것을 작동시킬 수있는 유일한 방법은git add -f wp/path/to/some/location/*
trusktr

13
@trusktr simont의 !*/예외 사용
Tobias Kienzler

7
그 마지막 규칙은 다음과 같습니다 . 파일을 !*/엮어 쓸데없는 시도에서 모든 차이를 만듭니다 .gitignore. 대단히 감사합니다.
racl101

627

하나의 파일을 제외하고 디렉토리의 전체 내용을 무시하려면 파일 경로의 각 디렉토리에 대해 한 쌍의 규칙을 작성할 수 있습니다. pippo / pluto / paperino.xml을 제외한 pippo 폴더를 무시하는 .gitignore

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

58
우수 대답은하지만, 그것의 가치는 나중에이 건너 오는 사람을 위해 지적 foo하고 foo/*있다 되지 같은. 이 작업을 수행하려면, 당신은 필요로 사용하는 foo/*기본 폴더
thislooksfun

20
@Mayank Pippo는 이탈리아어로 Goofy이고 Paperino는 Donald Duck이고 Pluto는 영어와 동일합니다. 예전에는 샘플을 프로그래밍하기 위해 매우 일반적인 변수 이름의 삼중 항이었습니다. 다시 읽을 수있어서 좋았습니다 .. :)
Ghidello

"file x 이외의 폴더를 제외하려면"@thislooksfun의 말이 중요합니다.
Czechnology

8
! 나에게하지 작업을 수행합니다 node_modules / * node_modules는 / 부트 스트랩
SuperUberDuper

1
@simple_human 저장소 루트의 모든 것을 무시하거나 언급 된 디렉토리 내부에서 관심을 가질 .gitignore 파일이있는 경우에 해당됩니다.
xZero

244

/*대신 *또는 */대부분의 경우에 사용하려고합니다

사용 *은 유효하지만 재귀 적으로 작동합니다. 그때부터 디렉토리를 조사하지 않습니다. !*/디렉토리를 화이트리스트에 다시 사용 하는 것이 좋지만 실제로는 최상위 폴더를 블랙리스트에 추가하는 것이 좋습니다./*

# Blacklist files/folders in same directory as the .gitignore file
/*

# Whitelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Whitelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

위의 코드를 제외한 모든 파일을 무시합니다 .gitignore, README.md, folder/a/file.txt, folder/a/b1/그리고 folder/a/b2/그 마지막 두 개의 폴더에 포함 된 모든 것을. (그리고 .DS_Store*.log파일은 해당 폴더에서 무시됩니다.)

분명히 나는 예를 들면 할 수 !/folder또는 !/.gitignore너무.

추가 정보 : http://git-scm.com/docs/gitignore


3
매우 영리합니다. 감사합니다. IMO는 최소 포함 규칙 수가있는 WordPress 사이트에 가장 적합한 방법입니다. 또한 귀하의 명시 적 허가 없이는 새로운 플러그인, 테마 또는 WP 업데이트가 제거되거나 추가되지 않습니다. GitHub Desktop을 사용할 때 .DS_Store파일은 무시되지 않지만 명령 줄을 통해 문제가되지 않습니다. 이 문제를 해결하려면 **/.DS_Store다른 모든 규칙 아래 로 이동해야했습니다 .
Jibran

7
내 내부 구문 강조 표시기가 게시물 제목에 이상한 반응을 보이고 있습니다.
itsadok

3
그라시아 스! 폴더에있는 파일을 화이트리스트에 추가 할 수도 있습니다 ..! /some/folder/file.txt
PodTech.io

위의 답변이 그렇지 않은 경우 * 대신 / *를 사용하면 모든 문제가 해결되었습니다. 내 유일한 질문은 이제! / folder와! / folder / *의 차이점은 무엇입니까? *없이! / 폴더를 사용하면 내가 알 수있는 한 폴더의 모든 파일에 대한 변경 사항을 계속 선택합니다.
dallin

1
@dallin 아무런 차이가 없습니다. 하나는 폴더를 허용하고 다른 하나는 해당 폴더의 하위를 허용합니다. 당신이 할 수있는 유일한 문제는, 폴더 또는 파일의 부모가 화이트리스트되기 전에 허용 목록에 포함되어야하는 것입니다 /*다음 !/nested/folder/*(또는 동등 !/nested/folder하지 않고) !/nested/또는 !/nested첫번째! (그리고 아마 /nested/*사이에). 기억해야 할 요령은 깊게 중첩 된 하위 폴더를 화이트리스트에 올리는 경우 각 하위 폴더의 하위 항목을 완전히 차단해야하며 해당 블랙리스트는 "슬래시 스타"로 끝나는 것입니다.
Ryan Taylor

75

좀 더 구체적으로 :

예 : 모든 것을 무시 webroot/cache하고 유지하십시오 webroot/cache/.htaccess.

cache폴더 뒤에 슬래시 (/)가 있습니다 .

실패

webroot/cache*
!webroot/cache/.htaccess

공장

webroot/cache/*
!webroot/cache/.htaccess

VS 코드를 사용하는 경우 폴더 이름은 녹색으로 바뀌지 만 .gitkeep 파일은 무시되는 다른 모든 파일과 마찬가지로 회색으로 표시되므로 .gitkeep이있는 폴더에이 파일을 적용한 후 파일 색상을 잘못 읽지 않도록주의하십시오. .gitkeep은 무시 된 것처럼 보이지만 오른쪽에 'U'가있어 감지되었음을 나타냅니다.
OzzyTheGiant


28

디렉토리의 일부 파일을 무시하려면 올바른 순서 로 수행해야합니다 .

예를 들어 index.php 및 "config"폴더를 제외한 "application"폴더의 모든 항목은 무시 하십시오 .

먼저 원하는 것을 부정해야합니다.

실패

application/*

!application/config/*

!application/index.php

공장

!application/config/*

!application/index.php

application/*


38
잘못된. "모든 것을 무시"한 후에 부정합니다.
Carlos

2
git status변경 사항이 .gitignore예상대로 작동 하는지 확인하기 위해 속지 마십시오
Philippe Rathé

10
경우 git status가보고되고 무엇을 무시 무엇을 말하려고하지 않습니다이 작동하고 있다면, 당신은 어떻게 알 수 있습니까?
kris

1
@kris 먼저 git 캐시를 지우십시오. "git rm --cached *"를 먼저 수행 한 다음 "git add --all"을 수행하면 "git status"가 모든 새로운 gitignore 변경 사항을 표시합니다.
Mark McCorkle

20

사용할 수 있으며 git config status.showUntrackedFiles no추적되지 않은 모든 파일이 숨겨집니다. 자세한 내용 man git-config을 참조하십시오.


많은 파일 중 일부 파일 만 커밋하려는 경우 유용합니다!
Josh M.

16

.gitignore에서 폴더를 제외하기 위해 다음을 수행 할 수 있습니다.

!app/

app/*
!app/bower_components/

app/bower_components/*
!app/bower_components/highcharts/

bower_components제외한 내부의 모든 파일 / 하위 폴더는 무시 됩니다 /highcharts.


14

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

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

# 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 and files if you wish:
!wordpress/somefile.jpg
!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/**/*

그 중 어느 것도 나를 위해 일하지 않았습니다. 많은 흔적과 오류!


2
이것은 특정 파일 확장자를 독점적으로 포함하는 유일한 방법입니다. 더 나은, 그것은 훌륭한 ASCII 예술을 만듭니다 : gist.github.com/Wolfgange3311999/91c671f5e4d3c56cf5a1
Matthew D. Scholefield

10

하위 폴더에 문제가있었습니다.

작동하지 않습니다 :

/custom/*
!/custom/config/foo.yml.dist

공장:

/custom/config/*
!/custom/config/foo.yml.dist

9

위의 모든 답변을 시도했지만 아무도 효과가 없었습니다. gitignore 문서 ( here )를 읽은 후 폴더를 먼저 제외하면 하위 폴더의 파일 이름이 색인화되지 않는다는 것을 알았습니다. 따라서 나중에 느낌표를 사용하여 파일을 포함하면 인덱스에 파일이 없으므로 git 클라이언트에 포함되지 않습니다.

그것이 해결책을 찾는 방법이었습니다. 폴더 트리의 모든 하위 폴더에 예외를 추가하여 작업을 시작했습니다. 나중에 자세한 구성을 아래 구성으로 압축 할 수 있었으며 이는 문서와 약간 상반됩니다.

.gitignore 작업 중 :

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' subfolder
/Pro/3rdparty/*
!Pro/3rdparty/domain/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

결과적으로 내 자식 클라이언트에서 Pro / 3rdparty / domain / modulename / 폴더의 두 파일 만 다음 커밋을 위해 준비되고 있으며 그것이 바로 내가 찾던 것입니다.

동일한 폴더의 여러 하위 폴더를 허용 목록에 추가하려면 다음과 같이 느낌표 행을 제외 문 아래에 그룹화하십시오.

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' & 'hosting' subfolders
/Pro/3rdparty/*
!Pro/3rdparty/domain/
!Pro/3rdparty/hosting/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

# Ignore the 'hosting' folder, except for the 'modulename' subfolder
Pro/3rdparty/hosting/*
!Pro/3rdparty/hosting/modulename/

그렇지 않으면 예상대로 작동하지 않습니다.


마지막으로 효과가있었습니다. .gitignore가 실제로 어떻게 작동하는지 이해할 때 궁금합니다
David

8

그것이 나를 위해 일한 것입니다. 리포지토리에 Cordova 플러그인을 하나만 커밋하고 싶었습니다.

...
plugins/*
!plugins/cordova-plugin-app-customization

8

나는 파티에 늦었다는 것을 알고 있지만 여기에 내 대답이 있습니다.

@Joakim이 말했듯이 파일을 무시하려면 다음과 같이 사용할 수 있습니다.

# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

그러나 파일이 중첩 된 디렉토리에 있으면 규칙을 수동으로 작성하는 것이 약간 어렵습니다.

예를 들어, git프로젝트의 모든 파일을 건너 뛰고 싶은 파일은 건너 뛰고 싶은 경우 a.txt가 있습니다 aDir/anotherDir/someOtherDir/aDir/bDir/cDir. 그러면 우리 .gitignore는 이런식이 될 것입니다

# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

위의 주어진 .gitignore파일은 제외한 모든 디렉토리와 파일을 건너 뜁니다.!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

언급했듯이 이러한 규칙을 정의하기는 어렵습니다.

이 장애물을 해결하기 위해 규칙을 생성하는 git-do-not-ignore 라는 간단한 콘솔 응용 프로그램을 만들었습니다 . 자세한 지침과 함께 github 에서 프로젝트를 호스팅했습니다 .

사용 예

java -jar git-do-not-ignore.jar "aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt"

산출

!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

간단한 웹 버전도 있습니다 .

감사합니다.


7

bower의 Jquery와 Angular가 있습니다. Bower는 그들을 설치했습니다

/public_html/bower_components/jquery/dist/bunch-of-jquery-files
/public_html/bower_components/jquery/src/bunch-of-jquery-source-files
/public_html/bower_components/angular/angular-files

최소화 된 jquery는 dist디렉토리 안에 있고 angular는 angular디렉토리 안에 있습니다. github에 커밋 할 최소화 파일 만 필요했습니다. .gitignore를 약간 조작하면 이것이 바로 활용됩니다 ...

/public_html/bower_components/jquery/*
!public_html/bower_components/jquery/dist
/public_html/bower_components/jquery/dist/*
!public_html/bower_components/jquery/dist/jquery.min.js
/public_html/bower_components/angular/*
!public_html/bower_components/angular/angular.min.js

누군가가 이것을 유용하게 사용할 수 있기를 바랍니다.


7

이것이 내가 한 방법입니다.

# Ignore everything
*

# Whitelist anything that's a directory
!*/

# Whitelist some files
!.gitignore

# Whitelist this folder and everything inside of it
!wordpress/wp-content/themes/my-theme/**

# Ignore this folder inside that folder
wordpress/wp-content/themes/my-theme/node_modules

# Ignore this file recursively
**/.DS_Store

gig status -u추적되지 않은 디렉토리의 개별 파일을 재귀 적으로 보는 데 사용 합니다. git status폴더 만 표시되므로 폴더 내부의 모든 내용이 추적되었다고 생각할 수 있습니다.


5

파일과 루트 폴더를 제외한 모든 것을 무시해야하는 경우 간단한 솔루션 :

/*
!.gitignore
!showMe.txt
!my_visible_dir

마술은 /*(위에서 설명한 것처럼) (루트) 폴더의 모든 것을 무시하지만 재귀 적으로는 무시합니다.


4

또한 단일 파일의 부정과 관련하여 몇 가지 문제가있었습니다. 나는 커밋 할 수 있었지만 IDE (IntelliJ)는 항상 무시 된 파일에 대해 불평했습니다.이 파일은 추적됩니다.

git ls-files -i --exclude-from .gitignore

이 방법으로 제외시킨 두 파일을 표시했습니다.

public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

결국, 이것은 나를 위해 일했습니다 :

public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

열쇠는 먼저 폴더부정이었습니다typo3conf/ .

또한 진술의 순서는 중요하지 않은 것 같습니다. . 대신 단일 파일을 무효화하기 전에 모든 하위 폴더를 명시 적으로 무효화해야합니다.

폴더 !public/typo3conf/와 폴더 내용 public/typo3conf/*은 .gitignore에 대해 서로 다른 두 가지입니다.

큰 실! 이 문제는 잠시 동안 나를 귀찮게했습니다.)


3

lib에서 하나의 jar를 추가하려고했기 때문에 지금까지 아무것도 효과가 없었습니다.

이것은 효과가 없었다 :

build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar 

이것은 효과가 있었다 :

build/*
!build/libs

3

나는이 일을했다

# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib

2

OP와 비슷한 문제가 있었지만 상위 10 개의 공감 된 답변은 실제로 효과가 없었습니다 .
나는 마침내 다음을 발견했다

잘못된 구문 :

*
!bin/script.sh

올바른 구문 :

*
!bin
!bin/script.sh

gitignore 매뉴얼 페이지의 설명 :

선택적 접두사 "!" 패턴을 무효화합니다. 이전 패턴에서 제외 된 일치하는 파일은 다시 포함됩니다. 해당 파일의 상위 디렉토리가 제외 된 경우 파일을 다시 포함 할 수 없습니다 . Git은 성능상의 이유로 제외 된 디렉토리를 나열하지 않으므로 포함 된 파일의 패턴은 정의 된 위치에 관계없이 영향을 미치지 않습니다.

확장 된 예 :

$ 나무.

.
├── .gitignore
└── bin
    ├── ignore.txt
    └── sub
        └── folder
            └── path
                ├── other.sh
                └── script.sh

$ 고양이 .gitignore

*
!.gitignore
!bin
!bin/sub
!bin/sub/folder
!bin/sub/folder/path
!bin/sub/folder/path/script.sh

$ 자식 상태-추적되지 않은 파일-무시

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        bin/sub/folder/path/script.sh

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)
        bin/ignore.txt
        bin/sub/folder/path/other.sh

nothing added to commit but untracked files present (use "git add" to track)

1

요점

# Ignore everything
*

# But not these files...
!script.pl
!template.latex

그리고 아마도 다음을 포함하십시오 :

!.gitignore

참고

에서 https://git-scm.com/docs/gitignore :

!패턴을 무효화 하는 선택적 접두사 " "; 이전 패턴에서 제외 된 일치하는 파일은 다시 포함됩니다. 해당 파일의 상위 디렉토리가 제외 된 경우 파일을 다시 포함 할 수 없습니다. Git은 성능상의 이유로 제외 된 디렉토리를 나열하지 않으므로 포함 된 파일의 패턴은 정의 된 위치에 관계없이 영향을 미치지 않습니다. 리터럴 " "로 시작하는 패턴 (예 : " \")의 경우 첫 번째 " !" 앞에 백 슬래시 ( " ")를 넣으십시오 .!\!important!.txt

...

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

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

0

나는 아무도 언급하지 않은 나를 위해 일한 것을 발견 한 것 같습니다.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*

기본적으로 하위 디렉토리가 무시되는 것을 무시하는 것처럼 보입니다. 하위 디렉토리 자체에 대한 항목 !subdir/과 그 아래의 모든 파일 및 폴더로 확장되는 항목이 있어야 합니다.!subdir/**/*

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