Git忽略父目录中的.gitignore文件

时间:2017-12-11 15:16:04

标签: git

我有这样的结构:

projects/
    .gitignore
    foo/
        some_file
    bar/
        another_file

foobar projects是git项目。在.gitignore我有*(实际上我尝试了很多东西),但是当我在git status内运行projects/foo时,它仍然告诉我添加some_file。如果我正确地阅读了.gitignore文档,那么Git应该在所有父文件夹中查找.gitignore文件并使用它们。但是它似乎完全忽略了.gitignore中的那个。这是怎么回事?

我已经尝试了git check-ignore,就好像.gitignore不存在一样。

重现:

/ $ cd /tmp
/tmp $ mkdir projects
/tmp $ cd projects
/tmp/projects $ echo "*" > .gitignore
/tmp/projects $ git init
Initialized empty Git repository in /private/tmp/projects/.git/
/tmp/projects $ mkdir foo
/tmp/projects $ cd foo
/tmp/projects/foo $ git init
Initialized empty Git repository in /private/tmp/projects/foo/.git/
/tmp/projects/foo $ touch some_file
/tmp/projects/foo $ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    some_file

nothing added to commit but untracked files present (use "git add" to track)

3 个答案:

答案 0 :(得分:3)

Git仅使用当前存储库中的.gitignore文件中的规则。您可能希望将.gitignore文件从父目录符号链接或硬链接到所有子目录,如果您希望它应用于所有子存储库。

答案 1 :(得分:0)

哦......它只读取它们up to the top level of the git repository

  

从与路径相同的目录中的.gitignore文件读取的模式,或在任何父目录中读取的模式,其中模式位于更高级别的文件(直到工作树的顶层)

措辞不好但还不错。

答案 2 :(得分:0)

在 Git 2.33(2021 年第 3 季度)中阐明了 .gitignore 检测:

请参阅 commit e041706Andrew Berry (deviantintegral)(2021 年 7 月 6 日)。
(2021 年 7 月 22 日于 Junio C Hamano -- gitster --commit bb3a55f 合并)

<块引用>

docs:.gitignore 解析到 repo 的顶部

签字人:Andrew Berry

<块引用>

当前文档读起来好像 .gitignore 文件将在每个父目录中解析,直到它们到达存储库边界。
这澄清了当前的行为。

同样,这将“顶级”更正为“顶级”,匹配“顶级域”的用法。

gitignore 现在包含在其 man page 中:

<块引用>

从同一目录中的 .gitignore 文件读取的模式 作为路径,或在任何父目录中(直到工作的顶层 树),更高级别文件中的模式被那些文件中的模式覆盖 低级文件到包含文件的目录。

这些图案 相对于 .gitignore 文件的位置进行匹配。

由于您在 /private/tmp/projects/foo/.git/ 中初始化了一个嵌套的 Git 存储库,因此 .gitignore 中的 projects/ 本身将被忽略。