这个git gc错误该怎么办?(rm: 无法解除pack文件的链接 权限被拒绝)

34

在运行 git gc 时,我不断看到这个错误:

rm: cannot unlink 'pack-30b1ff2[reset of hash].pack': Permission denied

关于这个错误,我应该做些什么/可以做些什么?

更新

抱歉,我应该提供更多信息。是的,我已经尝试了重新启动。事实上,在之前重新启动过程中,曾经解决了我的gc问题。

我注意到这个问题,因为当我打开Git Gui时,它会不时提示我压缩数据库。最终我注意到,即使我点击了“是”,它还是一而再再而三地提示我,而且每次都返回“成功”。

然后,我尝试使用Git EXT的设置-Git维护-压缩git数据库命令进行运行。但是,这个命令告诉我出现了一个错误(在Git EXT中为红灯,而在Git Gui中为绿灯)。

然而,我上面发布的错误是直接从git bash中运行git gc时发生的。

我应该安排磁盘扫描吗?损坏的扇区可能会导致这种情况吗?我希望这能得到一个快速的答案 :(


1
检查权限,如果看起来正常,请备份并检查您的文件系统。 - Mat
这是在Windows 7上。我应该检查.git文件夹的权限吗?Git是否以我的用户帐户运行?我是管理员,该组对.git文件夹拥有完全控制权。 - danludwig
抱歉,我之前假定你在使用Linux。我从未完全了解Windows权限的详细信息。但是,你首先不应该使用管理员帐户进行开发。 - Mat
你尝试过重新启动吗?可能有一些进程正在使用该文件,阻止其删除。 - Pedro Rodrigues
我已经更新了我的问题,很抱歉,我应该从一开始就提供更多的信息。 - danludwig
4个回答

30
在Windows系统上,“Permission denied”错误通常是由运行中的进程锁定引起的。有可能是一个挂起的Git EXT线程打开了pack文件。
尝试在安全模式下执行git gc命令。
另一种选择是将存储库克隆到新位置,然后删除旧的存储库。

谢谢,我希望避免重新克隆,所以希望安全模式能够起作用。下次重启时会尝试。 - danludwig
1
甚至不需要安全模式。我在正常启动后首先运行了git gc命令,没有出现权限被拒绝的错误。感谢。 - danludwig
@danludwig 在正常启动后的第一件事对我也很有效!感谢你的提示! - cregox
1
在我的情况下,是devenv.exe(Visual Studio中的某个Git插件)锁定了文件。 [LockHunter](http://lockhunter.com)是一个很好的工具,可以找到这些文件,并且您可以从命令行脚本化它以强制解锁文件:"%PROGRAMFILES%\LockHunter\LockHunter.exe" /unlock "%CD%\.git\objects\pack" /silent && git gc - Richard Dingwall
4
啊,我忘记了可能会使用git的各种插件/扩展。在我的情况下,在运行git gc之前关闭Eclipse就可以解决问题了。 - jacobq
1
在我的情况下,锁定文件的是Eclipse(安装了EGit插件)。虽然Unlocker无法检测到Eclipse作为锁定应用程序,但LockHunter可以。感谢@RichardDingwall的提示! - sschuberth

18

在我的情况下,问题出在TortoiseGit上。为了解决这个问题,我打开了TortoiseGit设置 -> 图标覆盖,并将状态缓存设置为“无”。 现在进程TGitCache已结束,所以所有对象都可以被git gc处理。

输入图像描述


1
您需要关闭控制台,其中锁定命令的命令发生。这可能是锁定文件的VI或任何被终止的命令。最简单的解决方案是关闭所有内容并重新打开。您应该能够执行命令而没有问题。

1

Git 2.23(2019年第三季度)应避免由提交图引起的gc权限被拒绝问题(在Git 2.18中引入),该提交图会预计算并存储祖先遍历所需的信息,以优化图形遍历。

使用Git 2.23,提交图文件是“运行时可能保持打开文件描述符的文件之一,在完成对象存储后需要关闭所有文件描述符”,现在对现有提交图文件的文件描述符进行关闭,然后“gc”最终确定要替换它的新实例。

请查看 提交2d511cf, 提交5472c32, 提交c3a3a96 (2019年5月17日) 由Derrick Stolee (derrickstolee)完成。
(由Junio C Hamano -- gitster --提交5cb7c73中合并,于2019年7月9日)

packfile:在close_all_packs中关闭提交图

close_all_packs()方法用于在运行'git gc --auto'之前关闭所有打包文件和多个打包索引的读取句柄。
这在Windows平台上尤为重要,因为读取句柄会阻止对这些文件的任何写入。
在这种情况下,用rename()替换其中一个文件将失败。

提交图表也执行重命名,因此容易受到此问题的影响。
我们小心地在写入之前关闭提交图,但是当'git fetch'(或类似进程)运行'git gc --auto'时,可能会写入提交图。

在此,将提交图作为close_all_packs()的一部分关闭。


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