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