无法删除 .git 文件夹:目录非空

8

无法删除.git

我有一个名为Rift的git仓库,现在想要删除它。但是在运行rm -rf时,出现错误信息:rm: cannot remove 'Rift/.git/objects/pack': Directory not empty

当我浏览文件夹树的底部时,我发现一个隐藏文件,叫做.fuse_hidden,后面跟着一串数字和字母,可能是十六进制的。我可以手动删除这个文件,但只要我删除它,就会立即创建另一个文件,其中附加了不同的字符串。

我尝试过rm .git/objects/pack/* && rm -rf .gitsudo rm -rf .gitchmod -w .git/objects/pathkillall git,但都没有成功。

enter image description here


1
我猜你可能有一个除了git之外的进程正在访问这个git仓库。试着找出是什么在创建这些文件,然后杀掉或暂时禁用该进程。 - ewokx
@ewong,这就是我想做的事情,但我不知道有什么简单的方法可以做到这一点...实际上根本没有任何方法。 - Vendetta
1
FUSE是用户空间文件系统框架。这意味着您的Git存储库内部有一个挂载点。您需要撤消该挂载。 - torek
1
FUSE是一个框架,但在Linux上,您不需要将设备挂载为文件系统。 mount命令将显示现有的挂载点。(也许您的存储库位于FUSE挂载下,而不是包含一个?也许相关的用户空间文件系统行为不当?) - torek
1
@DeathWaltz:如果你重命名.git会发生什么?新文件是否仍会神秘地自动出现在那里? - user1934428
显示剩余3条评论
3个回答

7
你可以使用 fuser 命令。 fuser 命令是一个命令行实用程序,旨在基于文件、目录或某个进程正在访问的套接字定位进程。它可帮助系统用户识别使用文件或套接字的进程。
使用 fuser 命令在 .git 目录上查找所有正在访问该目录的进程 ID。 fuser .git 随后,您可以使用 -k 参数杀死进程,然后应能够删除目录。 fuser -k .git

您是指 fuser --kill <文件名> 吗? - Vendetta
你可以执行操作,或者你可以先使用冗长的 -v 参数进行调查,然后再决定。 - Shaqil Ismail
1
栈溢出的意义不仅在于帮助当前提问者解决问题,还在于帮助未来遇到相同问题的用户。因此,如果您能在回答中提供这些细节,不仅可以帮助我,也可以帮助未来有类似问题的人。 - Vendetta
这似乎已经解决了,但我不是完全确定。如果问题仍然存在并且这个方法不起作用,我会再回来的。 - Vendetta
2
关闭终端对我很有效。它杀死了一直在写入fuse_hidden文件的进程,我能够成功地执行rm -rf .git命令。 - chris

1

我最近发现的另一个解决方案是使用lsof命令,将受影响的文件名作为参数。例如:

#This will give you information about what process has the file open
[root@host]$ lsof .git/objects/pack/.fuse_hidden000000000f1f
#This will kill the process locking the file
[root@host]$ kill -s 9 $(lsof -t .git/objects/pack/.fuse_hidden000000000f1f)
< p > -t开关告诉lsof使用“简洁”模式,仅返回PID。然后将此PID传递给kill,使用-s 9标志,表示发送信号“SIGKILL”,而不是默认的更礼貌的请求“SIGTERM”或潜在的“SIGHUP”


0

了解导致此特定错误(gitstatusd)的原因,

您可以执行以下操作:

killall -15 gitstatusd-linux-x86_64

这通常是由大多数zsh主题使用的gitstatusd引起的问题。

关闭终端也可以解决问题,因为zsh是终端的子进程,而gitstatusd是zsh的子进程。


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