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

Jör*_*örg 26 git gitignore

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

/Test
/Test/unknown/folder/structure/below
Run Code Online (Sandbox Code Playgroud)

现在我想忽略文件Test夹内部和下面的所有文件,除了某个名为的css文件layout.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
Run Code Online (Sandbox Code Playgroud)

.gitignore应该忽略

/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/ignore.me
Run Code Online (Sandbox Code Playgroud)

我的.gitignore文件不起作用:

Test/
!layout.css
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Dav*_*ber 28

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

*
!*/
!.gitignore
!layout.css
Run Code Online (Sandbox Code Playgroud)


l3x*_*l3x 11

为了达到你想要的效果,你需要使用一些负面的排除.

基本思想是您需要排除任何您想要取消签名的文件的每个父目录.

所以,如果你想将/Test/in/a/unknown/folder/layout.css添加到你的git仓库,那你就必须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
Run Code Online (Sandbox Code Playgroud)

因此,当你跑步时,$ 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
Run Code Online (Sandbox Code Playgroud)

注意:您可以git add-allhttp://lexsheehan.blogspot.com/2014/05/git-add-update.html找到有关将文件添加到git仓库的最佳方法的原因的说明.


Ale*_*nek 9

相当古老的问题,但由于我现在正在努力解决这个问题,我想我会分享问题的实际解决方案.

问题是你不能在Git中提交空目录,就好像它们被忽略一样,这个规则不适用于.gitignore.

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

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

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

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

这引出了我们在gitignore文档中的另一点:

可选前缀"!" 否定了这种模式; 之前模式排除的任何匹配文件将再次包含在内.如果排除该文件的父目录,则无法重新包含文件.出于性能原因,Git不会列出排除的目录,因此无论在何处定义,所包含文件的任何模式都不起作用.在第一个"!"前放一个反斜杠("\")对于以文字"!"开头的模式,例如"!important!.txt".

如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项.换句话说,foo /将匹配目录foo和它下面的路径,但是不匹配常规文件或符号链接foo(这与pathpec在Git中的工作方式一致).

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

/path/to/git/repo
|-- .gitignore
|-- /cache
    |-- somefile
    |-- README    
    |-- /dir
        |-- somefile2
        |-- README
Run Code Online (Sandbox Code Playgroud)

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

如果我们像这样指定gitignore:

/cache/**
!README
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是,这是实际回答原始问题的唯一答案. (2认同)