git clean
的目的是删除未被跟踪的文件。但是如果没有指定 -f
标志,默认情况下它不会执行。我可以理解对于那些不仅仅是删除东西的命令,使用 -f
标志的原因,因为我可能会运行它们来完成某个任务,而没有意识到它也会作为副作用删除文件。但是,如果我运行 git clean
,我就知道我将要删除文件。
这只是一种安全机制,就像一个“确定要执行吗”的弹出窗口吗?还是说,git clean
除了 -f
标志之外还能做其他事情吗?
git clean
的目的是删除未被跟踪的文件。但是如果没有指定 -f
标志,默认情况下它不会执行。我可以理解对于那些不仅仅是删除东西的命令,使用 -f
标志的原因,因为我可能会运行它们来完成某个任务,而没有意识到它也会作为副作用删除文件。但是,如果我运行 git clean
,我就知道我将要删除文件。
这只是一种安全机制,就像一个“确定要执行吗”的弹出窗口吗?还是说,git clean
除了 -f
标志之外还能做其他事情吗?
git clean -f
"会删除尚未添加的新文件!例如,这可能是您为正在工作的项目编写整天的全新模块。
此外,当使用git来处理软件开发项目(即最常见的用例)时,人们可能会认为"git clean
"的工作方式与"make clean
"相同,这是一个大错误。后者是为了清理自己的垃圾并且知道要查找什么。Git则相反。
SCM的正常工作方式是从未触及未明确跟踪的内容。 git clean
基本上是为了将现有存储库的初始状态恢复到避免必须放弃并重新克隆它的状态,或在开始共享之前实际清除完成大任务后无用的所有内容。
git clean
的默认行为配置为-i
,而不仅仅是像大多数发行版上的rm
一样提示用户可用选项。这将显示一个消息,告诉用户当前正在执行的操作,并给那些不知道自己在做什么的人一个停止操作的机会。只是被提示选择使用“-f”、“-i”或“-n”是用户默认选择“-f”的风险。rm
? - Kellen Stuartgit rm
不是其中之一(前提是你已经提交了文件)。例如,git checkout
在您尝试更改存储库中未提交的文件的分支时也不会覆盖您的文件,除非您明确使用-f
,这正如上面所解释的大多数初学者所做的那样。但是,可以出于善意调用make clean
,并且绝对需要这些安全机制。 - Obsidian-i
。请查看 commit 1f09aed(2020年4月10日)由마누엘 (nalla
)提交。
请查看 commit 08d383f(2020年4月10日)由Johannes Schindelin (dscho
)提交。
(由Junio C Hamano -- gitster
--合并于commit 33feaca,2020年4月22日)
交互式
:在期望输入之前显式地fflush
标准输出流签名作者:마누엘
签名作者:Johannes Schindelin至少有一个交互式命令会将提示写入
stdout
,然后在stdin
上读取用户输入:git clean --interactive
。
如果提示留在缓冲区中,用户将意识不到程序正在等待他们的输入。因此,在读取用户输入之前,让我们刷新
stdout
。
如果你运行git clean
,会出现未跟踪的文件和目录,它将打印fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
。
所以没有-f
,你可以做一些像这样的事情:
git -c clean.requireForce=false clean -d
,这与git clean -df
相同;
git clean -dn
,这将进行干运行,并告诉你将要删除什么而不实际删除任何内容;
git clean -id
,这允许你交互式地删除未跟踪的文件和目录;
git clean -nX
,这告诉你将要删除哪些被忽略的文件。
我同意这是一种安全机制。但正如你所看到的,它并不总是必要的。
-f
选项的提交:
这段文字是关于编程的:
git-clean: 修复默认行为的描述添加 clean.requireForce 选项,并在 git-clean 中添加 -f 选项以覆盖它
添加一个新的配置选项 clean.requireForce。如果设置了该选项,则 git-clean 将拒绝运行,除非强制使用新的 -f 选项,或者由于 -n 而不执行。
-f
的作用,但没有解释它为什么存在。 - melpomene