繁体   English   中英

gitignore:忽略文件夹层次结构中的所有文件,除了一种特定的文件类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM