我有这样的结构:
projects/
.gitignore
foo/
some_file
bar/
another_file
foo
,bar
,和 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)
答案 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 e041706 的 Andrew 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/
本身将被忽略。