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

gitignore:忽略文件夹层次结构中除一个特定文件类型之外的所有文件,git,gitignore,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/i

我想忽略下面和文件夹中的所有文件,但文件夹层次结构中可能存在的特定文件类型除外:

范例

/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
My.gitignore文件不工作:

Test/
!layout.css

有什么建议吗?

我可以通过在
Test/
目录中放置一个
.gitignore
文件来让您的示例工作,该文件包含以下内容

*
!*/
!.gitignore
!layout.css

为了实现你想要的,你需要使用一些消极的排除

基本思想是,您需要排除任何文件的每个父目录,而这些文件是您想要忽略的

因此,如果您希望将/Test/in/a/unknown/folder/layout.css添加到git repo中,那么您必须取消/gnore/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状态
论分行行长
初始提交
要提交的更改:
(使用“git rm--cached…”取消存储)
新文件:.gitignore
新文件:Test/in/a/unknown/folder/layout.css
新文件:Test/layout.css

注意:您可以找到一个解释,解释为什么
git add all
是将文件添加到git repo的最佳方式,这个问题已经很老了,但由于我现在仍在为这个问题苦苦挣扎,我想我会分享这个问题的实际解决方案

问题是,虽然不能像被忽略一样提交Git中的空目录,但此规则不适用于
.gitignore

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

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

**匹配文件和目录中的所有内容

这就引出了GitDocs中的另一点:

可选前缀“!”否定模式;任何匹配的文件 被先前模式排除的将再次被包括<不是 如果文件的父目录为空,则可以重新包含该文件 已排除。
Git不会列出性能排除的目录 原因,所以包含的文件上的任何模式都不会产生任何影响 定义它们的地方。在第一行前面加一个反斜杠(\) “!”例如,对于以文字“!”开头的模式, “!重要!.txt”

如果图案以斜线结尾,则出于以下目的将其删除: 下面的描述,但它将只找到具有 目录换句话说,foo/将匹配目录foo和路径 在它下面,但与常规文件或符号链接不匹配 foo(这与pathspec在 吉特)

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

/path/to/git/repo
|-- .gitignore
|-- /cache
    |-- somefile
    |-- README    
    |-- /dir
        |-- somefile2
        |-- README
我们希望忽略缓存/中的所有文件,自述文件除外

如果我们这样指定gitignore:

/cache/**
!README
Git将忽略除
/cache/README
之外的所有内容。另一个自述文件不会显示,因为它的目录
/cache/dir
已被
/cache/**
排除!自述文件甚至不适用于它。
要解决此问题,我们需要将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

你也试过其他顺序吗?@Jan是的,我试过了-不幸的是没有成功参见:集中解决方案。David,谢谢你的回答。因为我有很多
Test
文件夹,所以我更喜欢“集中式”解决方案,而不是让各种.gitignore文件贯穿始终。@Jörg不幸的是,我找不到一种方法来做到这一点。您可能已经尝试调整我的解决方案,并在顶级目录中使用它,方法是在前两行添加
Test
(并删除第三行)。如果您这样做了,您会发现这并不能解决问题。希望有人知道如何提供一个更完整的解决方案。是的,我尝试了各种组合和您的解决方案的一些变体,但正如您所说,它不起作用。无论如何,谢谢你花时间。令人惊讶的是,这是唯一一个真正回答原始问题的答案。确认这对我有效。拥有
是至关重要的/cache/***/
(来自此处)