首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.gitignore排除规则实际上是如何工作的?

.gitignore排除规则实际上是如何工作的?
EN

Stack Overflow用户
提问于 2010-06-09 06:46:53
回答 3查看 80.5K关注 0票数 157

我正在尝试解决一个大型目录结构上的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,并观察到这一点。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3001888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档