我正在尝试在大型目录结构上解决Gitignore问题,但是为了简化我的问题,我将其简化为以下内容。

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

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

显然," git状态-u"显示:

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

我要做的是创建一个.gitignore文件,该文件忽略了A/B/C内的所有内容,但并不忽略文件" foo"。

如果我这样创建.gitignore:

c/

然后," git状态-u"同时显示了foo和bar,却被忽略:

# Untracked files:
...
#       .gitignore

正如我所期望的那样。

现在,如果我添加了FOO的排除规则,那么:

c/
!foo

根据Gitignore Manpage的说法,我希望这能起作用。但这不是 - 它仍然忽略了foo:

# Untracked files:
...
#       .gitignore

这也行不通:

c/
!a/b/c/foo

这也没有:

c/*
!foo

给出:

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

在这种情况下,尽管不再忽略foo,但也不忽略栏。

.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’的文件,那将是痛苦子目录树的。

无论如何,要么我不太了解排除规则的工作方式,要么在目录(而不是通配符)被忽略时它们根本不起作用 - 通过以A /结尾的规则

有人可以对此提供一些启示吗?

有没有办法使Gitignore使用明智的东西,例如正则表达式,而不是基于笨拙的壳语法?

我在cygwin/bash3上使用git-1.6.6.1和ubuntu/bash3上的git-1.7.1观察并观察它。

答案

/a/b/c/*
!foo

似乎对我有用(Linux上的GIT 1.7.0.4)。这*很重要,否则您会忽略目录本身(因此Git不会看在内部),而不是目录中的文件(允许排除)。

认为排斥说"但不是这个"而不是"包括",但请忽略这个目录(/a/b/c/)但是不是这个(foo)“没什么意义;“忽略此目录中的所有文件(/a/b/c/*)但是不是这个(foo)“做。引用男人页面:

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

文件必须被排除在外。希望能散发出一些光线。

来自: stackoverflow.com