Git의 디렉토리에있는 파일을 어떻게 무시합니까?


544

.gitignore파일이 디렉토리 의 파일을 무시 하는 올바른 구문은 무엇입니까 ?

일 것이다

config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*

또는

/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*

?


5
않는 .gitignore파일은 무시 디렉토리 구분을? 예를 들어, datavs data/는 다른 것을 의미합니까?
Charlie Parker

6
@CharlieParker yes-ish : 일치 data하는 파일 디렉토리를 data/무시하고 일치하는 디렉토리 만 무시합니다.
jox

당신이 개최하거나 무시하려는 파일을 저지른 경우 항상 기억, 다음 시간의 분기 내 패턴의 잘못을 가지고 있었다 생각하고 낭비 후 :( 그냥 내 2 센트를 무시하는 방법은 없습니다.
아담

@ 아담은 .gitignore를 업데이트 한 다음 unstage / git rm 파일을 캐시해야합니다.
Chris McKnight

답변:


374

패턴 형식

  • 빈 줄은 파일과 일치하지 않으므로 가독성을 위해 구분 기호로 사용할 수 있습니다.

  • 로 시작하는 줄 #은 주석 역할을합니다.

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

  • 패턴이 슬래시로 끝나는 경우 다음 설명의 목적으로 제거되지만 디렉토리와 일치하는 항목 만 찾습니다. 즉, foo/디렉토리 foo와 그 아래의 경로 는 일치 하지만 일반 파일 또는 기호 링크와는 일치하지 않습니다 foo(일반적으로 git에서 pathspec이 작동하는 방식과 일치합니다).

  • 패턴에 슬래시가 포함되어 있지 않은 경우 /, git은 패턴을 쉘 glob 패턴으로 취급하고 .gitignore파일 위치 (파일이 아닌 경우 작업 트리의 최상위 레벨에 상대적인)에 대한 경로 이름과 일치 하는지 확인 .gitignore합니다.

  • 그렇지 않으면, 자식 취급에 의한 소비에 적합한 쉘 글로브와 패턴 fnmatch(3)FNM_PATHNAME플래그 : 패턴에 와일드 카드가 일치하지 않습니다 /경로 이름에. 예를 들어, 또는 Documentation/*.html일치 Documentation/git.html하지는 않습니다 .Documentation/ppc/ppc.htmltools/perf/Documentation/perf.html

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

여기서 더 찾을 수 있습니다

git help gitignore
또는
man gitignore


2
.gitignore 파일을 최상위 레벨에 배치하고 그 아래의 모든 폴더에서 작동하게하려면 어떻게해야합니까? 감사합니다.
Royi

104
-1 TL; DR은 거의 질문에 대답하지 않습니다. 파일이 아닌 디렉토리에 관한 것이므로 굵게 표시된 부분은 일부 정신 체조에만 적용됩니다. @Jefromi는 더 직접적이었습니다.
Bob Stein

나는 남자를 읽었으며 @ Jefromi의 대답은 더 좋습니다-@jox의 경고도 읽는 한 @ Luke Hutton은 IDE 프로젝트 파일을 무시하는 데 더 유용 할 수 있습니다.
WillC

1
이것은 실제로 git 문서의 복사-붙여 넣기
mcont

1
확실하지 (본질적으로) 복사 - 붙여 넣기 man페이지 또는 공식 문서는 SO에 가장 적합한 형식입니다 ...
0 관련이

183

전자 일 것이다. 폴더 구조 대신 확장명으로 이동하십시오.

즉 내 예제 C # 개발은 파일을 무시합니다.

#OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

최신 정보

아래 의견에서 업데이트를 제공 할 것이라고 생각했습니다. OP의 질문에 직접 대답하지는 않지만 .gitignore구문의 더 많은 예는 다음을 참조하십시오 .

커뮤니티 위키 (항상 업데이트 중) :

Visual Studio 프로젝트 및 솔루션을위한 .gitignore

Chris McKnight의 의견 덕분에 특정 언어 사용과 관련된 더 많은 예제가 여기에 있습니다.

https://github.com/github/gitignore


5
@Stallman, 그게 다야 range. 따라서 *.Obj뿐만 아니라 일치 *.obj합니다.
norbert

131

슬래시가 포함 된 경로는 .gitignore 파일을 포함하는 디렉토리를 기준으로합니다 (보통 리포지토리의 최상위 레벨이지만 하위 디렉토리에도 배치 할 수 있음).

따라서 모든 예제에서 경로에 슬래시가 포함되어 있으므로 두 버전이 동일합니다. 이 때 슬래시를 둘 필요가 유일한 시간은 아닙니다 이미 경로의 하나. 예를 들어, 저장소의 최상위 레벨에서만 foo를 무시하려면을 사용하십시오 /foo. 간단히 작성 foo하면 저장소의 어느 곳에서나 foo라는 것을 무시합니다.

와일드 카드도 중복됩니다. 전체 디렉토리를 무시하려면 간단히 이름을 지정하십시오.

lib/model/om

와일드 카드를 사용하는 유일한 이유는 디렉토리에서 무언가를 무시하지 않으려는 경우입니다.

lib/model/om/*      # ignore everything in the directory
!lib/model/om/foo   # except foo

5
이 질문에 허용 된 답변보다 더 나은 설명
eerrzz

78

선행 슬래시는 .gitignore 파일이있는 디렉토리에 대해서만 ignore 항목이 유효 함을 나타냅니다. 지정 *.o하면서,이 디렉토리와 모든 하위 디렉토리에있는 모든 .o 인 파일을 무시합니다 /*.o그냥 디렉토리에서 그들을 무시합니다 다시, 동안, /foo/*.o단지 /foo/*.o에서 그들을 무시합니다.


34

.gitignore 파일을 최상위 레벨에 넣고 그 아래의 모든 폴더에서 사용할 수 있도록하려면 /**/.

예를 들어 폴더 및 하위 폴더의 모든 *.map파일 을 무시 /src/main/하려면 다음을 사용하십시오.

/src/main/**/*.map

나는 이것을해야했다. 왜 2 가 필요한지 잘 모르겠습니다 **. 하나는 충분했다.
Novocaine

8
** 하위 디렉토리의 파일과도 일치
petrsyn

정보 주셔서 감사합니다 @petrsyn
Novocaine

30

문제의 두 가지 예는 실제로 데이터 손실로 이어질 수있는 매우 나쁜 예입니다!

내 충고 : /*정당한 이유가 없다면 .gitignore 파일의 디렉토리에 절대 추가하지 마십시오 !

예를 들어 Jefromi가 다음과 같이 기록한 것이 그만한 이유 일 것입니다. "이후에 디렉토리에서 무언가를 무시하지 않으려면" .

그렇지 않으면 /*디렉토리에 추가하는 것이 디렉토리의 모든 내용을 올바르게 무시하는 방식으로 작동하지만 다른 한편으로는 위험한 부작용이 있기 때문입니다.

를 실행하면 git stash -u(임시 추적 추적되지 숨겨 놓은 파일) 또는 git clean -df(비 추적 삭제되지만 무시 파일을 보관) 저장소에 추가 된로 무시되고 모든 디렉토리가 /*될 것이다 비가 역적 삭제 !

일부 배경

나는 이것을 어려운 방법으로 배워야했다. 우리 팀의 누군가가 /*.gitignore의 일부 디렉토리에 추가 하고있었습니다. 시간이 지남에 따라 특정 디렉토리가 갑자기 사라지는 경우가있었습니다. 응용 프로그램에 필요한 기가 바이트의 로컬 데이터가있는 디렉토리 아무도 그것을 설명 할 수 없었고 항상 모든 데이터를 다시 다운로드하는 것을 싫어합니다. 잠시 후 나는 그것과 관련이있을 수있는 개념을 얻었다 git stash. 어느 날 나는 (무시 된 파일을 유지하면서) 내 로컬 저장소를 정리하고 싶었고 git clean -df데이터를 다시 사용 하고있었습니다. 이번에는 문제를 충분히 조사하고 조사했습니다. 나는 그 이유가 추가 된 것이라고 마침내 생각했다 /*.

나는 그것이 directory/*디렉토리 자체가 아니라 디렉토리의 모든 내용을 무시 한다는 사실에 의해 어떻게 든 설명 될 수 있다고 가정합니다 . 따라서 항목이 삭제 될 때 추적되거나 무시되지 않습니다. 그럼에도 불구 git status하고 git status --ignored약간 다른 그림을 제공하십시오.

재현하는 방법

다음은 동작을 재현하는 방법입니다. 현재 Git 2.8.4를 사용하고 있습니다.

라는 디렉토리 localdata/거기에 더미 파일 (와는 important.dat) 로컬 자식 저장소에 작성되고 내용은 퍼팅에 의해 무시됩니다 /localdata/*.gitignore파일. 언급 된 두 가지 git 명령 중 하나가 지금 실행되면 디렉토리가 (예기치 않게) 손실됩니다.

mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file

당신이 할 경우 git status --ignored여기, 당신은 얻을 것이다 :

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

  untracked-file

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

  localdata/

이제 어느 쪽이든

git stash -u
git stash pop

또는

git clean -df

두 경우 모두 무시 된 것으로 의심되는 디렉토리 localdata는 사라집니다!

이것이 버그로 간주 될 수 있는지 확실하지 않지만 적어도 아무도 필요없는 기능이라고 생각합니다.

나는 그것을 자식 개발리스트에보고하고 그들이 어떻게 생각하는지 볼 것이다.


15

다음과 같습니다.

config/databases.yml
cache
log
data/sql
lib/filter/base
lib/form/base
lib/model/map
lib/model/om

또는 아마도 :

config/databases.yml
cache
log
data/sql
lib/*/base
lib/model/map
lib/model/om

filter그리고 formlib에서 base디렉토리를 무시해야하는 하위 디렉토리가있는 유일한 디렉토리 인 경우 (별표로 수행 할 수있는 작업의 예로 참조)


14

첫번째. 해당 파일 경로는 .gitignore 파일의 위치와 관련이 있습니다.


2
슬래시가 포함 된 패턴의 경우에만 해당됩니다. "mydir"과 같은 단일 디렉토리 이름은 하위 폴더에있는 디렉토리 및 파일도 무시합니다. 슬래시 앞에만 넣으면 .gitignore 파일의 위치와 관련이 있습니다.
jox

4

https://www.gitignore.io.gitignore 에서 템플릿을 매우 쉽게 생성 할 수있는 GUI 및 CLI 기반 서비스를 유지 관리하고 있습니다 .

검색 필드에 원하는 템플릿을 입력하거나 명령 줄 별명을 설치하고 실행할 수 있습니다

$ gi swift,osx


0

샘플 .gitignore 파일은 Android Studio 프로젝트의 경우 아래와 같습니다.

# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties


#Eclipse
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
YourProjetcName/.gradle/
YourProjetcName/app/build/
*/YourProjetcName/.gradle/
*/YourProjetcName/app/build/

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# CDT-specific
.cproject

# PDT-specific
.buildpath

# Proguard folder generated by Eclipse
proguard/

# Intellij project files
*.iml
*.ipr
*.iws
.idea/
/build
build/
*/build/
*/*/build/
*/*/*/build/
*.bin
*.lock
YourProjetcName/app/build/
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
.gradle/
app/build/
*app/build/

# Local configuration file (sdk path, etc)
local.properties
/YourProjetcName/build/intermediates/lint-cache/api-versions-6-23.1.bin
appcompat_v7_23_1_1.xml
projectFilesBackup
build.gradle
YourProjetcName.iml
YourProjetcName.iml
gradlew
gradlew.bat
local.properties
settings.gradle
.gradle
.idea
android
build
gradle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.