如何忽略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.html
或tools/perf/Documentation/perf.html
。 -
前导斜杠匹配path名的开头。 例如,
mozilla-sha1/sha1.c
./*.c
与cat-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的评论):
包含斜杠的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 status
和git 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
如果filter
和form
是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