Git clean无法清除未跟踪的文件

21

我遇到了 "切换分支会覆盖以下未在追踪中的工作区文件...请在切换分支之前移动或删除它们" 的错误。

常见解决方法似乎是使用 git clean 命令。

我输入该命令时没有出现任何错误,但也没有发生任何事情。当我尝试切换到另一个分支时,我仍然会收到上面提到的相同错误。

请问为什么 git clean 会完全没有反应呢?

更新:

更多信息:使用 git -ngit -f 命令结果完全相同,都没有任何反应。


If the Git configuration variable clean.requireForce is not set to false, git clean will refuse to delete files or directories unless given -f, -n or -i - William Pursell
1
@WilliamPursell 谢谢。我更新了我的问题。可惜,-f-n也没有任何作用。 - DA.
1
git status显示了什么? - Spacemoose
3
你正在运行 git clean 的目录是哪个?它只会清理当前工作目录及其子目录。 - William Pursell
@WilliamPursell 项目的根目录。最终我通过强制检出 (git checkout ... -f) 成功检出了 -- 但仍然好奇为什么 git clean 没有起作用。 - DA.
4
这些文件被忽略了吗?你试过加上“-x”吗? - William Pursell
7个回答

31

如果您想清除未跟踪的文件,请使用下面的命令。但是,在运行此命令之前,请注意,它将擦除您的工作区、索引和 HEAD。

git reset --hard

我认为您的工作区存在未被跟踪的目录或在gitignore中被忽略的文件(构建文件)。您可以通过以下命令将其删除。

git clean -dfx

-d

除了未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会将其删除。如果确实要删除此类目录,请使用-f选项两次。

-f --force

如果Git配置变量clean.requireForce未设置为false,则git clean将拒绝删除文件或目录,除非给出-f、-n或-i。除非给出第二个-f,否则Git将拒绝删除具有.git子目录或文件的目录。

-x

不使用从.gitignore(每个目录)和$GIT_DIR/info/exclude读取的标准忽略规则,但仍然使用使用-e选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。这可以与git reset一起使用(可能)来创建一个原始的工作目录,以测试一个干净的构建版本。

更多信息请参见git clean


1
我错过了那个X... 它没有清理 =( - Daniel N.
所有这些都没有帮助。 - Alexy Khilaev

13

像其他评论指出的那样,您确实需要添加 -f 标志。

但是您可能遇到问题不是因为没有指定 --force,而是因为您在不同的子目录中。

例如,如果我有一个存储在 /myrepo/.git 中的git仓库

并且未跟踪的文件在子目录 /myrepo/untracked/file.txt 中,

但我的终端当前工作目录是 /myrepo/src/。

git clean -fd 将无法工作。您需要在运行命令之前 cd 到项目根目录。

简而言之:git clean -fd 显然只会清理您终端当前工作目录下以及其以下的未跟踪文件和目录。


1
谢谢!这是我的问题(在使用 yarn workspace mono repo 时工作时)。 - Norfeldt

3

这可能不是OP遇到的情况。但我也遇到了同样的问题。在我的情况下,没有被清理的目录是我添加的子模块,但后来我对其进行了git重置。我必须从.gitmodules.git/config.git/modules/子模块路径中删除所有痕迹,即使git status识别它为未跟踪,git clean才能将其删除。


1
我无法运行git clean(可能是由于git模块问题); 最终我做了以下操作:“rm -rf <包含文件的文件夹>; git reset --hard” - Qiang Li
在我的情况下,我使用 git mv 移动了一些子模块。我在 .gitmodules.git 中找不到任何看起来应该被删除的内容,所以我只能手动删除那些目录。非常烦人。 - Max

2
尝试使用。
git clean -fd

尝试隐藏更改,
git stash

如果您想回滚所有更改,请使用以下方法:

git stash apply

2

我经常使用git clean -df -fgit clean -dfx -f(如果我想要删除被忽略的文件),因为这是Git官方文档中所说的:

-f
--force
If the Git configuration variable clean.requireForce is not set to  
false, git clean will refuse to delete files or directories unless  
given -f or -i. Git will refuse to modify untracked nested git  
repositories (directories with a .git subdirectory) unless a second - 
f is given.  


1

我觉得您需要指定-n或-f。从man手册中可以看到:

OPTIONS

   -f, --force
       If the Git configuration variable clean.requireForce is not set to false, git clean will refuse to delete files or
       directories unless given -f, -n or -i. Git will refuse to delete directories with .git sub directory or file unless a second
       -f is given.

1
我更新了我的问题。哎呀,-f-n 也没有产生任何作用。 - DA.
谢谢分享。在我的情况下,我必须添加两个“-f”参数才能删除所有被忽略的文件和目录。 - firebush

1
我猜这是因为git clear -f不会递归到未跟踪的目录中,即使文档中写道:

从当前目录开始,通过递归删除未受版本控制的文件来清理工作树。

...

-d文档澄清了混淆:

通常情况下,如果没有指定<path>,git clean将不会递归到未跟踪的目录中,以避免删除过多。指定-d将使其递归到这些目录中。

...


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