我正在尝试解决一个大型目录结构上的gitignore问题,但为了简化我的问题,我将其简化为以下内容。
我在一个全新的git库中有两个文件(foo,bar)的目录结构(到目前为止还没有提交):
a/b/c/foo
a/b/c/bar
显然,“git status -u”显示:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
我想要做的是创建一个.gitignore文件,它忽略a/b/c中的所有内容,但不忽略文件'foo‘。
如果我这样创建一个.gitignore:
c/
然后'git status -u‘将foo和bar都显示为已忽略:
# Untracked files:
...
# .gitignore
正如我所料。
现在,如果我为foo添加一个排除规则,如下所示:
c/
!foo
根据gitignore手册页,我希望这能起作用。但它没有-它仍然忽略了foo:
# Untracked files:
...
# .gitignore
这也不起作用:
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‘的文件,这将是一件痛苦的事情。
无论如何,要么我不太理解排除规则是如何工作的,要么是当目录(而不是通配符)被忽略时它们根本不起作用-通过以/结尾的规则
有谁能解释一下这个问题吗?
有没有办法让gitignore使用一些合理的东西,比如正则表达式,而不是这种笨拙的基于shell的语法?
我在Cygwin/bash3上使用git-1.6.6.1,在Ubuntu/bash3上使用git-1.7.1,并观察到这一点。
https://stackoverflow.com/questions/3001888
复制相似问题