使用git clean时,有没有不加 -f 参数的情况?

3
据我所知,git clean 的目的是删除未被跟踪的文件。但是如果没有指定 -f 标志,默认情况下它不会执行。我可以理解对于那些不仅仅是删除东西的命令,使用 -f 标志的原因,因为我可能会运行它们来完成某个任务,而没有意识到它也会作为副作用删除文件。但是,如果我运行 git clean,我就知道我将要删除文件。

这只是一种安全机制,就像一个“确定要执行吗”的弹出窗口吗?还是说,git clean 除了 -f 标志之外还能做其他事情吗?


2
@YesThatIsMyName 我真的看不出这与什么有关... - Jack M
1
@YesThatIsMyName 这个答案解释了 -f 的作用,但没有解释它为什么存在。 - melpomene
你可能接受其中一个答案吗?还是有什么不清楚的地方吗? - YesThatIsMyName
4个回答

1
但是默认情况下,它不会运行而不加-f标志。
实际上,git clean将拒绝执行任何操作,除非您指定-f、-i或-n。您需要至少指定其中一个。
-n用于“干跑”(显示将要删除文件的内容而不实际删除)。另外两个则像rm命令一样运行。“强制”(静默删除所有匹配项)或“交互式”(显式询问每个匹配文件)。
这只是一个安全机制,就像一个“你确定”的弹出窗口吗?
在我看来,这确实是引入该功能的有效方式。
make clean实际上非常危险,因为它看起来像一个常见的命令,但实际上会删除所有未存储的东西,这使它成为可能实际上没有希望恢复数据的罕见命令之一。考虑到大多数初学者已经急于使用“git checkout -f”和“git reset --hard”,我们很容易理解这样一个安全步骤并不无用。
特别是,"git clean -f"会删除尚未添加的新文件!例如,这可能是您为正在工作的项目编写整天的全新模块。

此外,当使用git来处理软件开发项目(即最常见的用例)时,人们可能会认为"git clean"的工作方式与"make clean"相同,这是一个大错误。后者是为了清理自己的垃圾并且知道要查找什么。Git则相反。

SCM的正常工作方式是从未触及未明确跟踪的内容。 git clean基本上是为了将现有存储库的初始状态恢复到避免必须放弃并重新克隆它的状态,或在开始共享之前实际清除完成大任务后无用的所有内容。

如果我是系统管理员并且这是可能的话,我会将git clean的默认行为配置为-i,而不仅仅是像大多数发行版上的rm一样提示用户可用选项。这将显示一个消息,告诉用户当前正在执行的操作,并给那些不知道自己在做什么的人一个停止操作的机会。只是被提示选择使用“-f”、“-i”或“-n”是用户默认选择“-f”的风险。

“一个很少有的命令,如果没有恢复,就会丢失数据” - 我觉得这并不罕见。rm - Kellen Stuart
@Kolob Canyon:我指的是“罕见的git命令之一”。实际上,使用git会有很多丢失数据的方式,而git rm不是其中之一(前提是你已经提交了文件)。例如,git checkout在您尝试更改存储库中未提交的文件的分支时也不会覆盖您的文件,除非您明确使用-f,这正如上面所解释的大多数初学者所做的那样。但是,可以出于善意调用make clean,并且绝对需要这些安全机制。 - Obsidian

0
如果我是系统管理员,而且这是可能的话,我会将git clean的默认行为配置为-i
这将更安全,因为在Git 2.27(2020年第二季度)中,来自各种代码路径的交互式输入被合并,并且我们在读取之前刷新了任何可能发出的提示。

请查看 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


0

如果你运行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,这告诉你将要删除哪些被忽略的文件。

我同意这是一种安全机制。但正如你所看到的,它并不总是必要的。


0
这是包含了-f选项的提交:

https://github.com/git/git/commit/2122591b3b5c6d93d3052a3151afcfa3146ede84#diff-3099dbcff3411d798a74588a2638748e

这段文字是关于编程的:

添加 clean.requireForce 选项,并在 git-clean 中添加 -f 选项以覆盖它

添加一个新的配置选项 clean.requireForce。如果设置了该选项,则 git-clean 将拒绝运行,除非强制使用新的 -f 选项,或者由于 -n 而不执行。

后来进行修复:https://github.com/git/git/commit/89c38500192e00988966246420902dc946e4f4ef#diff-3099dbcff3411d798a74588a2638748e

git-clean: 修复默认行为的描述
目前,当没有使用 -n 和 -f 参数调用 git clean 时,它会发出以下致命错误:
fatal: clean.requireForce not set and -n or -f not given; refusing to clean
这让用户不明白为什么需要强制清理,而 requireForce 没有设置。在 git-clean(1) 中查找也没有帮助,因为其描述是错误的。
修改为 git clean 在此情况下会发出以下致命错误:
fatal: clean.requireForce 默认为 true,且未给出 -n 或 -f;拒绝清理
(当其被设置为 true 时,会显示“...set to true...”),这使得未设置配置意味着 true,并调整文档。

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