[英]gitignore: Ignore all files in folder hierarchy except one specific filetype
我想忽略文件夹中下方和文件夹中的所有文件,但可能位于文件夹层次结构中的特定文件类型除外:
例
/Test
/Test/unknown/folder/structure/below
现在,我想忽略Test
文件夹中及其下方的所有文件,除了某些名为layout.css
CSS文件之外,例如:
/Test/layout.css
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/layout.css
/Test/in/a/unknown/folder/ignore.me
.gitignore应该忽略
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/ignore.me
我的.gitignore文件不起作用:
Test/
!layout.css
有什么建议么?
通过将.gitignore
文件放在Test/
目录中,可以得到您的示例,其中包含以下内容。
*
!*/
!.gitignore
!layout.css
为了完成您想要的工作,您需要使用一些否定排除项。
基本思想是您需要排除要忽略的任何文件的每个父目录。
因此,如果您希望将/Test/in/a/unknown/folder/layout.css添加到git仓库中,则必须忽略/ Test /,/ Test / in /,/ Test / in / a /,/ Test / in / a / unknown /和/ Test / in / a / unknown / folder /。
然后,当您最终进入包含一些被忽略文件和一些未被忽略文件的目录时,需要分别指定每个文件,如下所示:
# Fille: .gitignore
!Test/
Test/*
!Test/layout.css
Test/fileto.ignore
!Test/another/
Test/another/*
!Test/another/folder/
Test/another/folder/*
!Test/in/
Test/in/*
!Test/in/a/
Test/in/a/*
!Test/in/a/unknown/
Test/in/a/unknown/*
!Test/in/a/unknown/folder/
Test/in/a/unknown/folder/ignore.me
!Test/in/a/unknown/folder/layout.css
因此,当您运行$ git add-all
您将看到所需的结果:
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitignore
new file: Test/in/a/unknown/folder/layout.css
new file: Test/layout.css
注意:您可以在http://lexsheehan.blogspot.com/2014/05/git-add-update.html上找到有关为什么git add-all
是将文件添加到git repo的最佳方法的解释。
这是一个非常古老的问题,但是由于我一直在努力解决这个问题,即使现在我仍想与我分享解决该问题的实际方法。
问题是,您无法像在忽略Git中一样提交空目录时,此规则不适用于.gitignore
。
来自https://git-scm.com/docs/gitignore
尾部的“ / **”匹配里面的所有内容 。 例如,相对于.gitignore文件的位置,“ abc / **”匹配目录“ abc”内的所有文件的深度是无限的。
斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。 例如,“ a / ** / b”匹配“ a / b”,“ a / x / b”,“ a / x / y / b”等。
**匹配内部所有内容-几乎所有内容-文件和目录。
这将我们引到gitignore docs中的另一点:
可选的前缀“!” 否定了模式; 先前模式排除的所有匹配文件将再次包含在内。 如果排除该文件的父目录,则无法重新包含该文件。 由于性能原因,Git不会列出被排除的目录,因此包含在文件上的任何模式无论在何处定义都无效。 在第一个“!”前面加上反斜杠(“ \\”)。 以文字“!”开头的模式,例如“!important!.txt”。
如果该模式以斜杠结尾,则出于以下描述的目的将其删除,但它只会找到与目录匹配的内容。 换句话说,foo /将匹配目录foo及其下的路径,但不会匹配常规文件或符号链接foo(这与pathspec通常在Git中的工作方式一致)。
现在,我们有以下目录结构:
/path/to/git/repo
|-- .gitignore
|-- /cache
|-- somefile
|-- README
|-- /dir
|-- somefile2
|-- README
而且我们要忽略cache /内的所有文件(自述文件除外)。
如果我们这样指定gitignore:
/cache/**
!README
Git将忽略/cache/README
以外的所有内容。 其他自述文件将不会显示,因为它的目录/cache/dir
被/cache/**
排除在外, !README
甚至不适用于它。 为了解决这个问题,我们需要指定gitignore为:
# Ignore everything inside cache/ dir
/cache/**
# Except for subdirectories(won't be commited anyway if there is no commited file inside)
!/cache/**/
# And except for README files
!README
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.