使用git时如何查找所有空文件夹和未跟踪的文件?

kit*_*irl 5 git bash

基于这篇文章这篇文章
git ls-files --others --exclude-standard可以列出所有未跟踪的文件
但我对其进行了测试,无法列出空文件夹(已跟踪和未跟踪)。

例如,不能列出archiver folder如下空文件夹:

.
??? admin.php
??? api
?   ??? index.htm
?   ??? remote
?       ??? mod
?           ??? index.htm
?           ??? mod_cron.php
?           ??? mod_index.php
??? archiver folder
Run Code Online (Sandbox Code Playgroud)

那么我的问题是:如何列出所有未跟踪的文件和空文件夹

tor*_*rek 5

TL;DR:只需查找空目录。你可以安全地删除它们\xe2\x80\x94嗯,“安全”取决于你自己的软件,但只要Git而言而言,它是安全的。(注意丢失的文件\xe2\x80\x94请参阅下面“丢失”的定义\xe2\x80\x94,这可能会删除 Git 稍后可能需要的目录,但这没关系,因为 Git 只会创建它再次。)

\n\n

在 Unix / Linux 系统上(经过编辑以纠正转录中丢失的单词):

\n\n
find . -name .git -prune -o -type d -empty -print\n
Run Code Online (Sandbox Code Playgroud)\n\n

(在工作树的顶层)将找到空目录。

\n\n

长(左右)

\n\n

Git 对文件夹/目录不感兴趣。不存在未跟踪的文件夹,就像不存在跟踪的文件夹一样:Git 只关心文件。具体来说,文件要么在索引中,要么不在索引中,如果不在索引中,则它不会被跟踪。

\n\n

当您使用各种选项列出未跟踪的文件时(这往往会跳过未跟踪并忽略的文件,因为您通常希望这样做),Git 有时会将某个文件夹中的所有文件聚合在一起,请注意该文件夹中没有跟踪文件,并使用聚合符号报告它们。您可以通过以下方式停止此操作:git status --untracked-mode=all:然后您将获得各个文件名。

\n\n

请注意,可能有一些文件已被跟踪,但丢失了。例如,假设sub/README.txt是一个跟踪文件,并且确实存在。然后我们就跑rm sub/README.txt。该文件sub/README.txt保留在 Git 的索引中,并将在下一次提交中出现,但它丢失了。如果这是工作树中唯一的文件,那么现在是空的,您可以使用. 即使仍然丢失(并且也丢失了!),这不会影响下一次提交:它仍然会包含,因为该文件位于索引中。(使用subsubrmdir subsub/README.txtsubsub/README.txtgit rm --cached sub/README.txt,您也可以将其从索引中删除,如果您想要的话。)

\n\n

如果当 Git 将sub/README.txt索引复制回工作树时,此时 Git 将发现不存在sub. Git 只会耸耸肩并创建目录sub,然后将其放入sub/README.txt其中。所以这就是为什么Git 对文件夹/目录不感兴趣:它们只是无聊而乏味,仅在需要保存文件时才需要,按需创建。

\n\n

如果你想让Git创建一个目录,你需要在其中存储一个文件。由于 Git 管理的程序需要能够忽略名为 的文件.gitignore,因此这是一个非常适合粘贴到此类目录中的文件名。您可以写入*该文件,并将其添加到您的提交中,以便 Git 将创建该目录并.gitignore在其中写入一个包含以下内容的文件:*,从而自动忽略该目录中所有其他未跟踪的文件。

\n\n

旁注:一般来说,当 Git某个目录中提取最后一个文件时,它也会删除该目录,但偶尔我会看到它留下一些内容。(当然,如果目录中仍然包含一些未跟踪的文件,则必须保留该目录。请注意git clean -fd将删除空目录,但它也会删除未跟踪的文件。)

\n