我正在尝试解决大型目录结构上的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进行观察。