gitignore:忽略文件夹层次结构中除一个特定文件类型之外的所有文件

时间:2011-10-18 07:16:09

标签: git gitignore

我想忽略下面和文件夹中的所有文件,除了特定文件类型可能位于文件夹层次结构中的某个位置:

示例

/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

有什么建议吗?

3 个答案:

答案 0 :(得分:27)

我能够通过将.gitignore文件放在Test/目录中以及以下内容来使您的示例工作。

*
!*/
!.gitignore
!layout.css

答案 1 :(得分:11)

为了达到您想要的效果,您需要使用一些否定排除。

基本思想是你需要排除任何你想要无条件的文件的每个父目录。

所以,如果你想将/Test/in/a/unknown/folder/layout.css添加到你的git repo中,那么你必须unignore / 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

注意:您可以找到解释为什么git add-all是将文件添加到http://lexsheehan.blogspot.com/2014/05/git-add-update.html

的git仓库的最佳方式的原因

答案 2 :(得分:9)

相当古老的问题但是因为我现在正在努力解决这个问题,所以我想我会分享这个问题的实际解决方案。

事情是,当您无法在Git中提交空目录时,就好像它们被忽略一样,此规则不适用于.gitignore

来自https://git-scm.com/docs/gitignore

  

尾随“/ **”匹配内部的所有内容。例如,“abc / **”   匹配目录“abc”内的所有文件,相对于位置   .gitignore文件,具有无限深度。

     

斜线后跟两个连续的星号,然后斜线匹配   零个或多个目录。例如,“a / ** / b”匹配“a / b”,   “a / x / b”,“a / x / y / b”等等。

**匹配内部的一切 - 文学上的一切 - 文件和目录。

这引出了我们在gitignore docs中的另一个观点:

  

可选前缀“!”否定了这种模式;任何匹配的文件   被先前模式排除的将被再次包括在内。 不是   如果该文件的父目录是,则可以重新包含文件   排除。 Git不会列出排除目录的性能   原因,所以包含文件的任何模式都没有效果,无论如何   他们被定义的地方。在第一个前面放一个反斜杠(“\”)   “!”对于以文字“!”开头的模式,例如,   “!重要!.TXT”。

     

如果图案以斜线结尾,则会将其删除   以下描述,但它只会找到一个匹配   目录。换句话说,foo /将匹配目录foo和路径   在它下面,但不匹配常规文件或符号链接   foo(这与pathspec一般工作的方式一致   GIT)。

现在,假设我们有一个以下的目录结构:

/path/to/git/repo
|-- .gitignore
|-- /cache
    |-- somefile
    |-- README    
    |-- /dir
        |-- somefile2
        |-- README

我们希望忽略缓存中的所有文件/ README文件除外。

如果我们像这样指定gitignore:

/cache/**
!README

Git会忽略/cache/README以外的所有内容。其他自述文件不会显示,因为/cache/dir排除了目录/cache/**!README甚至不会应用# 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 。 要解决这个问题,我们需要指定gitignore:

.sidebar {
   display: flex;
   align-items: center;
   justify-content: center;
   // other properties follow
}