gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:19:12 25 4
gpt4 key购买 nike

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

这可能是我能实现的最接近“工作”的东西,但是需要说明完整的相对路径和明确的异常(exception)情况,如果我有很多名为“foo”的文件,这会很痛苦在子目录树的不同级别。

无论如何,要么我不太明白排除规则是如何工作的,要么当目录(而不是通配符)被忽略时它们根本不起作用 - 通过以/结尾的规则

任何人都可以阐明这一点吗?

有没有办法让 gitignore 使用像正则表达式这样的合理的东西,而不是这种笨拙的基于 shell 的语法?

我在 Cygwin/bash3 上使用 git-1.6.6.1 并在 Ubuntu/bash3 上使用 git-1.7.1 并观察它。

最佳答案

/a/b/c/*!foo

似乎对我有用(Linux 上的 git 1.7.0.4)。 * 很重要,否则您将忽略目录本身(因此 git 不会查看内部)而不是目录中的文件(允许排除)。

将排除视为“但不是这个”而不是“但包括这个” - “忽略这个目录(/a/b/c/)但不是这个(foo)"没有多大意义; “忽略此目录 (/a/b/c/*) 中的所有文件,但不忽略此目录 (foo)”。引用手册页:

An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again.

即,文件 必须已经被排除,才能再次被包含。希望能有所启发。

关于git - .gitignore 排除规则实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3001888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com