有没有理由在不使用-f的情况下使用git clean?

时间:2018-08-27 10:35:25

标签: git

据我了解,git clean的目的是删除未跟踪的文件。但是(默认情况下)没有-f标志不会运行。我可以理解-f标记了执行某些操作的命令,这些命令删除了东西,因为我可能会运行它们来做一件事,而没有意识到它也会删除文件,这是一个副作用。但是如果我运行git clean,我知道我将删除文件。

这是否只是一种安全机制,例如“您确定”弹出窗口?还是实际上git clean可以在没有-f标志的情况下做其他事情?

4 个答案:

答案 0 :(得分: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,告诉您将删除哪些忽略的文件。

我同意这是一种安全机制。但是如您所见,它并不总是必要的。

答案 1 :(得分: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问题

     

致命的:clean.requireForce没有设置并且-n或-f没有给出;拒绝   干净

     

让用户想知道为什么在什么时候需要用力   未设置requireForce。在git-clean(1)中查找无济于事   因为它的描述是错误的。

     

更改它,以便git clean问题

     

致命的:clean.requireForce默认为true,并且-n或-f未给出;   拒绝清洁

     

在这种情况下(设置时为“ ...设置为真...”)使得   显然,未设置的配置在这里是true,然后调整   文档。

答案 2 :(得分:0)

  

但是(默认情况下)如果没有-f标志,它将不会运行。

实际上,除非您指定git clean-f-i,否则-n将拒绝执行任何操作。您需要至少指定其中之一。

-n用于“空运行”(显示在不实际删除文件的情况下将执行的操作)。另外两个人的行为就像rm命令一样。 “强制”(悄悄删除所有匹配的文件)或“互动”(明确要求用户提供每个匹配的文件)。

  

这只是一种安全机制,例如“您确定”弹出窗口吗?

在我看来,这确实是介绍事物的有效方法。

进行清理实际上非常危险,因为它看起来像一个普通命令,但实际上会删除所有尚未存储的内容,这将使其成为实际上可能丢失数据的罕见命令之一没有恢复的希望。知道大多数初学者已经急于进入“ 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”的风险。

答案 3 :(得分:0)

如果我是系统管理员,并且有可能,我可以将git clean的默认行为配置为-i

使用Git 2.27(2020年第二季度)会更安全:整合来自各种代码路径的交互式输入,并且在我们阅读之前,fflush()会更早发出任何提示。

请参见commit 1f09aed마누엘 (nalla)(2020年4月10日)。
请参见commit 08d383fJohannes Schindelin (dscho)(2020年4月10日)。
(由Junio C Hamano -- gitster --commit 33feaca中合并,2020年4月22日)

interactive:在期望输入之前明确显示fflush stdout

签名人:마누엘
签名人:Johannes Schindelin

至少有一个交互式命令将提示写入stdout,然后在stdin上读取用户输入:git clean --interactive
如果提示保留在缓冲区中,则用户将不会意识到程序正在等待他们的输入。

因此,在读取用户输入之前,先刷新stdout