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

时间:2019-01-05 02:33:03

标签: bash git

基于this postthis post
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

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

3 个答案:

答案 0 :(得分:2)

TL; DR:仅查找空目录。您可以安全地删除它们-好吧,“安全”取决于您自己的软件,但是就 Git 而言,它是安全的。 (请注意缺少的文件,请参阅下面的“丢失”的定义,它可能会删除Git以后想要的目录,但这没关系,因为Git会再次创建它。)

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

find . -name .git -prune -o -type d -empty -print

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

长(ish)

Git对文件夹/目录不感兴趣。没有跟踪文件夹,就没有跟踪文件夹一样:Git只关心文件。具体来说,文件位于索引中,也可以不在索引中,如果文件不在索引中,则该文件不会被跟踪。

当您使用各种选项列出未跟踪的文件时(由于您通常想要,它们往往会跳过那些未被跟踪和忽略的文件),因此Git有时会将所有某个文件夹中的文件,请注意该文件夹中没有 tracked 文件,并使用汇总符号进行报告。您可以使用git status --untracked-mode=all停止此操作;那么您将获得各个文件名。

请注意,可能会跟踪某些文件,但缺少。例如,假设sub/README.txt是一个跟踪文件,并且实际上存在。然后我们运行rm sub/README.txt。文件sub/README.txt保留在Git的索引中,而保留在下一个提交中,但丢失了。如果那是您工作树中sub中唯一的 文件,则sub现在为空,您可以使用rmdir sub将其删除。即使sub/README.txt仍然丢失(并且sub也丢失!),这也不影响下一次提交:它将 still 包含sub/README.txt,因为该文件在索引中。 (如果需要的话,也可以使用git rm --cached sub/README.txt将其从索引中删除。)

如果并且当Git打算将sub/README.txt从索引中复制回工作树时,Git此时将发现没有sub。 Git只会耸耸肩,然后创建sub目录,然后将sub/README.txt放入其中。因此,这是为什么 Git对文件夹/目录不感兴趣的原因:它们只是枯燥乏味,仅在需要保存文件时才需要按需创建。

如果要Git创建目录,则需要在其中存储文件。由于由Git管理的程序需要能够忽略名为.gitignore的文件,因此,将其粘贴到这样的目录中是一个很好的文件名。您可以将*写入该文件,并将其添加到提交中,这样Git将创建目录并在其中写入包含.gitignore的{​​{1}}文件,从而将忽略所有其他未跟踪的文件。目录中的文件。

侧面说明:通常,当Git从某个目录中提取最后一个文件 时,它也会删除该目录,但是偶尔我会看到它留下了一些内容。 (当然,如果它仍然包含一些未跟踪的文件,则必须将目录留在后面。请注意,*会删除空目录,尽管它也会删除未跟踪的文件。)

答案 1 :(得分:1)

git ls-files --others --exclude-standard> not_tracked
find . -depth -empty -type d \( ! -regex '.*/\..*' \) >> not_tracked

请检查我的回答,我花了2天时间。

答案 2 :(得分:0)

命令ds完全可以满足您的要求。