【问题标题】:git clean -fd not removing a foldergit clean -fd 不删除文件夹
【发布时间】:2021-08-30 14:51:53
【问题描述】:

我在 ~/foo 文件夹中有一个 GIT 存储库。现在,在~/foo/public/bar/ 下创建了一个包含一些内容的bar/ 文件夹。它被 GIT 正确识别为未跟踪:

~/foo git status -s
?? public/bar/

我一直使用git clean -fd 删除未跟踪的文件夹,但由于某种原因它不起作用。当我运行它时,什么也没有发生:

~/foo git clean -fd
~/foo git status -s
?? public/bar/

GIT 有什么变化还是我遗漏了什么?我正在使用 GIT 2.32.0。

【问题讨论】:

  • 您能否在git status --untracked-files=all --ignored 的输出中edit 以防万一那里有任何其他线索。
  • @IMSoP 谜团解开了! public/bar 内部还有另一个 GIT 存储库,看起来 git clean -fd 没有触及嵌套存储库。

标签: git git-clean git-untracked


【解决方案1】:

文件夹本身对 Git 完全不感兴趣:只有 文件 未被跟踪(因为也只有文件被跟踪)。1 所以当@ 987654324@ 说:

?? public/bar/

它隐藏了一些东西。它所隐藏的事实是,在某处的public/bar/ 下至少有一个文件

运行git clean -fd 不一定会删除这个未跟踪的文件。特别是,如果没有-x-Xgit clean 会避免删除任何被忽略的未跟踪文件。

作为IMSoP mentions in a comment,使用git status --untracked-files=all --ignored 可以获得更多信息。我们将在public/bar/ 中看到各种文件的名称。 git status 在这里所做的是注意,当它可以通过宣布包含目录public/bar/(带有尾部斜杠)来总结有多个文件时,无需逐个宣布每个文件。


1这不是完全正确的,因为有子模块,但它足够接近让人们思考这个问题。另外,the git clean documentation-d 选项的描述下谈到了“未跟踪的目录”,那么这意味着什么?线索在-x-X 选项的描述中:

-x
不要使用标准的忽略规则...

这里通常缺少一些东西,这就是忽略规则的工作方式。即使the gitignore documentation,这在我剪断的部分中提到,也没有涵盖关键细节,即:

  • 要查找未跟踪的文件,Git 必须遍历工作树中的文件树。也就是说,它必须查看每个目录(或文件夹,如果您更喜欢该术语)以查看该目录中存在哪些文件。
  • 遍历文件树 - 打开和读取目​​录以获取文件列表,然后递归地打开和读取每个子目录 - 速度很慢。
  • Gitignore 规则——.gitignore 文件中忽略特定模式的行——可以列出 目录 名称,可以使用尾部斜杠显式列出,也可以因为目录名称与某些 gitignore 行匹配而隐式列出。李>
  • 因此,如果 Git 可以提前确定目录中的每个文件(例如,public/bar/-都将被忽略,那么 Git 可以简单地避免打开 该目录并阅读它。没有意义:Git 在这里找到的所有内容都将被忽略!

最后一个要点中的快捷方式可以节省时间。在大型构建中,在典型的现代系统上,它可以在 git status 运行中节省 (有时数十秒,甚至更大的数量级)。所以git statusgit clean 都尽可能利用这一点。但是,当他们必须枚举某些将忽略所有内容的目录中的实际文件时,他们仍然必须打开并读取该目录。

【讨论】:

  • 您好 torek,感谢您的详细回答,抱歉回复晚了。所以,我发现出了什么问题。让我首先说如果所有文件都将被忽略,git status 根本不会列出该文件夹。事实上,经过反复试验,我得知git clean -fd 不起作用,因为该文件夹中还有另一个.git 文件夹!所以事实证明它并没有删除嵌套的存储库,但我不确定为什么。
  • 啊哈。当存在一个或多个被忽略的文件一个或多个未被忽略的文件时,通常你会看到public/bar/ 的东西。您还会在其他一些特殊情况下看到它。子存储库案例就是其中之一。请注意,git clean-f -f 强制它递归到此类子存储库中,但使用它很少是一个好主意。查找子模块,这变得相当复杂。
猜你喜欢
  • 2017-09-04
  • 2014-11-07
  • 2012-08-16
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
相关资源
最近更新 更多