git clean:什么是“Would not remove”?

21
当我运行git clean --dry-run时,结果有点像:
Would remove an_untracked_file
Would remove an_untracked_file_2
Would not remove some_unrelated_folder/subfolder/

“无关的”文件夹已被跟踪且没有更改,因此我不希望git将它们删除。
但是,为什么git会报告对于一些,而不是所有的项目正常(且完全未更改)的文件夹,Would not remove
我能否知道是什么原因导致git考虑过,但最终决定不删除它们? git status仅列出我知道的几个未跟踪的文件。如预期。 git ls-files --other --exclude-standard返回相同的未跟踪文件。如预期。 git ls-files --other --exclude-standard --directory返回相同的未跟踪文件,以及一堆看起来很正常的目录。这不是我希望看到的,因为我认为--directory作用是减少返回的结果数量。
在检查意外目录时,似乎每个目录都是空的,除了一个包含“.gitignore”的.svn子文件夹。也许这会影响事情。
有人能帮我理解这种行为吗?
谢谢

注意:git clean现在有一个交互式模式!请参见我的答案(适用于git 1.8.4+)。 - VonC
5个回答

30

默认情况下,git clean不会删除文件夹。它告诉您它看到了一个未跟踪的文件夹,但是不会将其删除。给它加上-d标志以指示它也删除目录,例如:git clean -d -n


谢谢,这很有用。然而,在这种情况下,我没有任何未跟踪的目录。不过这让我想到了一些问题,并且我已经更新了问题。 - nonot1
@nonot1:从技术上讲,你只有*未跟踪的目录,因为Git只跟踪文件。 - Ben Jackson
@nonot1:如果一个目录完全为空,通常不会出现在像git ls-files --others这样的东西中,因为Git只关心文件。这就是为什么当您添加--directory标志时会看到额外的输出。Git甚至没有“未跟踪目录”的概念。它所拥有的是“包含空内容或仅包含未跟踪文件的目录”,这就是您在git clean的输出中看到的内容。 - Lily Ballard

9
我能告诉你是什么原因导致git考虑删除,但又决定不删除吗?实际上可以!(自2013年7月以来,即将推出的git 1.8.4版本):“git clean”命令学会了交互模式(“git clean -i”)。请参见commit 17696002086e8c6b9e998543d212e707c7d511ab以获取最初的实现:请参见commit d1239264f2786d7ea15543b980c6bf6afbc4701a以获取实现:
为交互式git-clean添加一个新的动作:按模式过滤。当用户选择此操作时,用户可以输入以空格分隔的模式(与gitignore相同的语法),与其中一个模式匹配的每个清理候选项将被排除在清理之外。当用户感觉可以时,按ENTER并返回确认对话框。
请参见commit db627fd568410499c47d764937c3d7a10bbadffa以获取测试和示例。
请参见commit c0be6b4c8a1d16a92efad00d73683075cf2da60d以获取文档。
显示将要完成的内容并交互式地清理文件。

交互模式

当命令进入交互模式时,它会显示要清理的文件和目录,并进入其交互式命令循环。

命令循环显示可用的子命令列表,并给出提示 "What now>"。
通常情况下,当提示以单个 '>' 结尾时,您只能从给定的选项中选择一个并键入 return,如下所示:

------------
  *** Commands ***
  1: clean                2: filter by pattern    3: select by numbers
  4: ask each             5: quit                 6: help
  What now> 1
------------

只要选择唯一,您也可以使用cclean

主命令循环有6个子命令。

clean::

开始清理文件和目录,然后退出。
filter by pattern::

这将显示要删除的文件和目录,并发出“输入忽略模式>>”提示。
您可以输入以空格分隔的模式,以排除要删除的文件和目录。
例如,“*.c *.h”将会排除以“.c”和“.h”结尾的文件不被删除。
当您对筛选结果满意时,请按下 ENTER(空格键)返回主菜单。
select by numbers

这将展示要删除的文件和目录,并发出“选择要删除的项目>>”提示。
当提示以双重'>>'结尾时,您可以进行多个选择,用空格或逗号连接。
您还可以说范围。
例如,使用“2-5 7,9”从列表中选择2、3、4、5、7、9。
如果范围中的第二个数字被省略,则会选择所有剩余的补丁。
例如,“7-”从列表中选择7、8、9。
您可以使用'*'选择所有内容。
当您对筛选结果满意时,请按ENTER(空白)返回主菜单。
ask each::

这将开始清理,您必须逐个确认以便删除项目。
请注意,此操作不像上述两个操作那样高效。
quit::

这让您在不进行清理的情况下退出。
help::

显示交互式git-clean的简要用法。

6

如果在执行命令时某些文件和文件夹持续出错,则运行

git clean -d -f

-f会强制操作。

使用-n进行干运行


2

本答案主要供参考,因为我认为这是清理你的repo dir最常见的情况。

递归删除所有未跟踪的目录:

git clean -d -f -x

-d表示目录, -x表示同时删除忽略列表中的目录(如bin和build),这是我大多数时候需要的, -f用于确认您知道自己在做什么。


0

我在Mac上使用Git版本2.10.0,但不知何故无法使用

git clean -df

来删除未跟踪的文件,所以我改用了这个命令:

git checkout --

PS:

如果有人能在评论中解释为什么我不能使用

git clean -df

来删除文件,我将非常感激。谢谢。

警告:您还将失去已跟踪的文件 :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接