代码之家  ›  专栏  ›  技术社区  ›  davidA

gitignore排除规则实际上是如何工作的?

  •  134
  • davidA  · 技术社区  · 16 年前

    我试图解决一个大型目录结构上的gitinore问题,但为了简化我的问题,我将其简化为以下内容。

    我在一个全新的git存储库中有两个文件(foo,bar)的目录结构(到目前为止没有提交):

    a/b/c/foo
    a/b/c/bar
    

    显然,“git status-u”表示:

    # Untracked files:
    ...
    #       a/b/c/bar
    #       a/b/c/foo
    

    我要做的是创建一个.gitinore文件,它忽略a/b/c中的所有内容,但不忽略文件“foo”。

    如果我创建一个.git,那么:

    c/
    

    然后,“git status-u”将foo和bar显示为忽略:

    # Untracked files:
    ...
    #       .gitignore
    

    正如我所料。

    c/
    !foo
    

    根据gitignore手册,我希望这能奏效。但它没有-它仍然忽略了foo:

    #未跟踪的文件:
    ...
    

    c/
    !a/b/c/foo
    

    c/*
    !foo
    

    # Untracked files:
    ...
    #       .gitignore
    #       a/b/c/bar
    #       a/b/c/foo
    

    在这种情况下,虽然foo不再被忽略,但bar也不会被忽略。

    gitignore中规则的顺序似乎也不重要。

    这也没有达到我的预期:

    a/b/c/
    !a/b/c/foo
    

    那个人忽略了foo和bar。

    一种可行的情况是,如果我创建文件a/b/c/.gitignore并将其放入其中:

    *
    !foo
    

    但问题是,最终a/b/c下会有其他子目录,我不想把一个单独的.gitignore放到每个子目录中—我希望创建“基于项目的.gitignore文件”,可以放在每个项目的顶部目录中,并覆盖所有“标准”子目录结构。

    这似乎也相当于:

    a/b/c/*
    !a/b/c/foo
    

    这可能是我能实现的最接近“工作”的东西,但是需要说明完整的相对路径和显式异常,如果在子目录树的不同级别中有许多名为“foo”的文件,这将是一件痛苦的事情。

    不管怎样,要么我不太明白排除规则是如何工作的,要么当目录(而不是通配符)被忽略时它们根本就不工作—由以/

    有人能解释一下吗?

    我在Cygwin/bash3上使用git-1.6.6.1,在Ubuntu/bash3上使用git-1.7.1。

    5 回复  |  直到 7 年前
        1
  •  163
  •   Chris    16 年前
    /a/b/c/*
    !foo

    似乎适合我(Linux上的Git1.7.0.4)。这个 * 这一点很重要,否则您将忽略目录本身(因此git不会查看内部),而不是目录中的文件(允许排除)。

    把排除项看作是“但不是这个”而不是“但包括这个”-“忽略这个目录”( /a/b/c/ foo )“没什么意义忽略此目录中的所有文件( /a/b/c/* )“是的。引用手册页:

    可选前缀!否定了这种模式;被先前模式排除的任何匹配文件都将再次被包括在内。

    i、 例如 必须被排除在外才能再次被包括在内。希望能给我们一些启示。

        2
  •  24
  •   Rafał Rawicki    14 年前

    /a/**/*
    !/a/**/foo
    

    如果我读的话,对任意数量的中间目录都应该有效 **

        3
  •  7
  •   Peter Petrik    15 年前

    还有一个选择:

    *
    !/a*
    !/a/*
    !/a/*/*
    !/a/*/*/*
    

    这将忽略每个文件和目录,除了文件/目录的三个层次深入在一个。

        4
  •  6
  •   user1115652 user1115652    15 年前

    从.git手册页上看,这一点肯定不清楚。这样做有效:

    *
    !/a
    !/a/b
    !/a/b/c
    !/a/b/c/foo
    
    # don't forget this one
    !.gitignore
    

    正如Chris提到的,如果目录被排除在外,它甚至不会被打开。因此,如果您想能够忽略*但是一些文件,您必须如上所述构建这些文件的路径。对我来说这很方便,因为我想对一个库的一个文件做一个代码复查,如果我想以后再做一个,我只添加它,其他的都忽略了。

        5
  •  5
  •   Community Mohan Dere    9 年前

    一般来说, 第1.8.2条 将包括 patch (同时 in its v4 prompted by some Stack Overflow question )从 Adam Spiers gitignore 规则实际上忽略了您的文件。

    git1.8.2 release notes “还有一个问题” which gitignore rule is ignoring my file ":
    git check-ignore .