如何忽略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/表示不同的意思吗?
查理·帕克

6
@CharlieParker yes-ish:data将忽略匹配的文件目录,data/仅忽略匹配的目录。
jox

一定要记住,如果你已上演或承诺您要忽略的文件,然后就没有办法想我已经得到了我的错误模式和一个小时的浪费季度以后忽略它:(只是我的2美分。
亚当

@Adam正确,您将必须更新.gitignore,然后unstage / git rm-缓存文件。
克里斯·麦克奈特

Answers:


374

模式格式

  • 空行不匹配任何文件,因此可以用作分隔符以提高可读性。

  • 以开头的行#作为注释。

  • !否定模式的可选前缀;先前模式排除的所有匹配文件将再次包含在内。如果否定的模式匹配,它将覆盖优先级较低的模式源。

  • 如果该模式以斜杠结尾,则出于以下描述的目的将其删除,但它只会找到与目录匹配的内容。换句话说,foo/将匹配目录foo及其下的路径,但不匹配常规文件或符号链接foo(这与git中pathspec的工作方式一致)。

  • 如果该模式不包含斜杠/,则git会将其视为shell glob模式,并检查相对于.gitignore文件位置的路径名是否匹配(如果不是来自.gitignore文件,则相对于工作树的顶级)。

  • 否则,git将该模式视为适合通过标志fnmatch(3)使用的shell全局变量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文件放在顶层,并使其可用于其下的任何文件夹?谢谢。
罗伊2015年

104
-1 TL; DR几乎不能回答问题。它是关于目录的,而不是文件的,因此加粗的部分仅适用于某些精神体操。@Jefromi更直接。
鲍勃·斯坦

我读过这个人,@ Jefromi的答案更好-只要您也阅读@jox的警告-和@ Luke Hutton的答案对于忽略例如IDE项目文件可能更有用。
WillC

1
这实际上是git文档的复制粘贴
mcont

1
不确定(基本上)复制粘贴man页面或官方文档是否是SO的最佳格式...
jdk1.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语法的更多示例。

社区Wiki(不断更新):

.gitignore用于Visual Studio项目和解决方案

在此处可以找到更多使用特定语言的示例(感谢Chris McKnight的评论):

https://github.com/github/gitignore


5
@Stallman,就是那个range。所以它匹配*.Obj以及*.obj
诺伯特'16

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文件所在的目录有效。指定*.o将忽略此目录和所有子目录中的所有.o文件,而/*.o仅忽略该目录中的文件,而再次/foo/*.o仅忽略/foo/*.o中的文件。


34

如果您想将.gitignore文件放在顶层,并使其适用于它下面的任何文件夹,请使用/**/

例如,忽略*.map文件/src/main/夹和子文件夹中的所有文件,请使用:

/src/main/**/*.map

我需要这样做。不知道为什么需要两个 **。一个对我来说足够了。
Novocaine

8
**比赛也文件中的子目录
petrsyn

感谢您提供的信息@petrsyn
Novocaine

30

问题中的两个例子实际上都是非常糟糕的例子,可能导致数据丢失!

我的建议:/*除非有充分的理由,否则请勿追加到.gitignore文件中的目录!

例如,一个很好的理由是Jefromi写道:“如果您随后打算忽略该目录中的某些内容,”

否则不应该这样做的原因是,附加/*到目录的方式一方面可以正确地忽略目录的所有内容,但另一方面却具有危险的副作用:

如果在git stash -u存储库中执行(临时存储跟踪和未跟踪的文件)或git clean -df(删除未跟踪但保留被忽略的文件),则所有带有附加名被忽略的目录都/*将被不可逆地删除

一些背景

我不得不努力学习。我团队中的某人正在追加/*到.gitignore中的某些目录。随着时间的流逝,某些目录有时会突然消失。应用程序需要具有千兆字节本地数据的目录。没有人能解释,我总是讨厌重新下载所有数据。一段时间后,我意识到可能与之有关git stash。有一天,我想清理我的本地存储库(同时保留被忽略的文件),我正在使用git clean -df,然后数据又消失了。这次我受够了并且调查了这个问题。我终于知道原因是附加的/*

我认为可以通过directory/*忽略目录的所有内容而不忽略目录本身的事实来解释它。因此,删除内容时,既不会将其视为跟踪对象,也不会忽略它。即使git statusgit status --ignored给它一个略有不同的图片。

如何繁殖

这是重现行为的方法。我目前正在使用Git 2.8.4。

将在本地git存储库中创建一个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都将消失!

不确定是否可以将其视为错误,但是我想至少它是没人需要的功能。

我将其报告给git开发列表,看看他们对此有何看法。


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并且form是lib中唯一具有base子目录需要忽略的目录(请参阅该目录作为使用星号的示例)。


14

第一个。这些文件路径是相对于.gitignore文件所在位置的相对路径。


2
这仅适用于包含斜杠的模式。单个目录名称(例如“ mydir”)也将忽略位于任何深度的子文件夹中的目录(和文件)。仅在前面加一个斜杠会使它相对于.gitignore文件所在的位置。
jox

4

我正在维护一个基于GUI和CLI的服务,使您.gitignore可以在https://www.gitignore.io上非常轻松地生成模板。

您可以在搜索字段中键入所需的模板,也可以安装命令行别名并运行

$ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.