如何忽略Git目录中的文件?

.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/* 

模式格式

  • 空行不匹配任何文件,所以它可以作为可读性的分隔符。

  • #开头的行作为注释。

  • 一个可选的前缀! 否定了这种模式; 任何先前模式排除的匹配文件将再次包含在内。 如果否定模式匹配,则将覆盖较低的优先模式源。

  • 如果模式以斜线结尾,则为了以下描述的目的将其移除,但是它只能find与目录匹配的内容。 换句话说, foo/会匹配一个目录foo和它下面的path,但是不会匹配一个普通的文件或符号链接foo (这与pathspec在git中的工作方式是一致的)。

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

  • 否则,git把这个​​模式当作一个适合fnmatch(3)FNM_PATHNAME标志消费的shell glob:模式中的通配符不会和path名中的/匹配。 例如, Documentation/*.html匹配Documentation/git.html但不匹配Documentation/git.html Documentation/ppc/ppc.htmltools/perf/Documentation/perf.html

  • 前导斜杠匹配path名的开头。 例如, mozilla-sha1/sha1.c . /*.ccat-file.c /*.c匹配,但不匹配mozilla-sha1/sha1.c

你可以在这里find更多

git help gitignore
要么
man gitignore

这将是前者。 通过扩展去代替文件夹结构。

即我的例子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(不断更新):

Visual Studio项目和解决scheme的.gitignore

更多的具体语言使用的例子可以在这里find(感谢Chris McKnight的评论):

https://github.com/github/gitignore

包含斜杠的path是相对于包含.gitignore文件的目录(通常是存储库的顶层),但也可以将它们放在子目录中。

所以,因为在你给出的所有例子中,path都包含斜杠,所以这两个版本是相同的。 唯一需要放置前导斜杠的是当path中没有path时。 例如,要仅在存储库的顶层忽略foo,请使用/foo 。 简单地写foo会忽略库中任何地方的所谓的foo。

你的通配符也是多余的。 如果你想忽略整个目录,只需简单地命名它:

 lib/model/om 

如果您打算随后忽略目录中的某些内容,那么使用通配符的唯一原因是:

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

前导斜杠表示忽略条目仅对于.gitignore文件所在的目录有效。 指定*.o会忽略这个目录和所有子目录中的所有.o文件,而/*.o只会在该目录中忽略它们,同样,/ /foo/*.o *.o只会在/foo/*.o中忽略它们。

如果你想在顶层放置一个.gitignore文件,并使其可以在任何文件夹下工作,可以使用/**/

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

 /src/main/**/*.map 

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

我的build议是:除非你有一个很好的理由,否则绝对不要将/*追加到.gitignore文件中的目录中!

例如,Jeutti写道: “如果你打算随后忽略目录中的某些东西”

否则不应该这样做的原因是,追加/*目录一方面以正确忽略目录中所有内容的方式工作,另一方面却有一个危险的副作用:

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

一些背景

我必须以艰苦的方式学习这一点。 我的团队中有人正在将/*附加到我们的.gitignore中的某些目录中。 在那个时候,我有时候某些目录会突然消失。 目录与我们的应用程序所需的千兆字节的本地数据。 没有人能解释它,我总是重新下载所有的数据。 过了一段时间,我有一个想法,它可能必须做与git stash 。 有一天,我想清理本地回购(同时保留忽略的文件),我使用的是git clean -df而且我的数据也没有了。 这一次,我已经够了,并调查了这个问题。 我终于明白,原因是附加/*

我认为可以通过directory/*忽略目录的所有内容而不是目录本身来解释。 因此,当事情被删除时,它既不被视为被追踪也不被忽视。 即使git statusgit status --ignored给它一个稍微不同的图片。

如何重现

这里是如何重现行为。 我目前正在使用Git 2.8.4。

一个名为localdata/的目录(在localdata/有一个虚拟文件( important.dat ))将在本地git仓库中创build,通过将/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在这里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将会消失!

不知道这是否可以被视为一个错误,但我想这至less是一个没有人需要的function。

我会把这个报告给git开发列表,看看他们在想什么。

第一个。 这些文件path是相对的.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/*/base lib/model/map lib/model/om 

如果filterform是lib中唯一有一个需要被忽略的子目录的目录(把它看作是你可以用asterics做的一个例子)。

我正在维护一个基于GUI和CLI的服务,它允许您通过https://www.gitignore.io轻松生成;.gitignore模板。

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

$ gi swift,osx

Android Studio项目的示例.gitignore文件可能如下所示

 # 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