我试图解决一个大型目录结构上的 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 文件,忽略/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 文件,它们可以位于每个项目的顶部目录中,并且覆盖所有的“标准”子目录结构。
这似乎也是等价的:
a/b/c/*
!a/b/c/foo
这可能是我能做到的最接近于“工作”的事情,但是需要说明完整的相对路径和明确的异常,如果在子目录树的不同级别中有大量名为“ foo”的文件,这将是一件痛苦的事情。
无论如何,要么我不太理解排除规则是如何工作的,要么当目录(而不是通配符)被忽略时——被以/结尾的规则忽略时,排除规则根本不起作用
有人能解释一下吗?
有没有办法让 gitignore 使用正则表达式之类的合理的东西,而不是这种笨拙的基于 shell 的语法?
我在 Cygwin/bash3上使用 git-1.6.6.1,在 Ubuntu/bash3上使用 git-1.7。