我可以/应该如何处理这个 git gc 错误? (rm:无法取消链接包权限被拒绝)

Posted

技术标签:

【中文标题】我可以/应该如何处理这个 git gc 错误? (rm:无法取消链接包权限被拒绝)【英文标题】:What can/should I do about this git gc error? (rm: cannot unlink pack Permission denied) 【发布时间】:2012-05-14 18:25:45 【问题描述】:

运行 git gc 时,我一直看到这个错误:

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

我可以/应该如何处理这个错误?

更新

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

我只注意到这个问题,因为当我打开 Git Gui 时,它会不时提示我压缩数据库。我最终注意到,在打开 Git Gui 几次之后,它一直在提示我,即使我点击了是,它又回来了“成功”。

然后我尝试使用 Git EXT 的设置 - Git 维护 - 压缩 git 数据库命令来运行它。这个命令告诉我有一个错误(Git EXT 中的红灯,而 Git Gui 中的绿灯)。

然而,我在上面发布的错误是直接从 git bash 运行 git gc 造成的。

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

【问题讨论】:

检查权限,如果它们看起来正常,请备份并检查您的文件系统。 这是在 Windows 7 上。我应该检查 .git 文件夹的权限吗? git 是否作为我的用户帐户运行?我是管理员,该组对 .git 文件夹具有完全控制权。 对不起,假设是Linux。我从不了解 Windows 权限的确切细节。但你不应该首先使用管理员帐户进行开发。 您尝试过重启吗?某些进程可能正在使用该文件,从而阻止它被删除。 我已经更新了我的问题,抱歉,我应该从一开始就提供更多信息。 【参考方案1】:

Windows 上的“权限被拒绝”通常是由正在运行的进程锁定引起的。很可能是有一个停滞的 Git EXT 线程打开了包文件。

尝试在安全模式下执行git gc

另一种选择是将存储库克隆到新位置并删除旧位置。

【讨论】:

谢谢,我希望避免重新克隆,所以希望安全模式可以工作。将在下次重新启动时尝试。 甚至不需要安全模式。我在正常启动后首先运行了 git gc ,并且没有权限被拒绝错误。谢谢。 在我的情况下,它是 devenv.exe(Visual Studio 中的一些 Git 插件)锁定了文件。 LockHunter 是查找这些文件的好工具,您可以从命令行编写脚本以强制解锁文件:"%PROGRAMFILES%\LockHunter\LockHunter.exe" /unlock "%CD%\.git\objects\pack" /silent && git gc 啊,我忘记了可能使用 git 的各种插件/扩展。在我的情况下,在运行 git gc 之前关闭 Eclipse 就可以了。 在我的情况下,锁定文件的是 Eclipse(安装了 EGit 插件)。虽然Unlocker 无法将Eclipse 检测为锁定应用程序,但LockHunter 可以。感谢@RichardDingwall 的提示!【参考方案2】:

就我而言,它是 TortoiseGit。为了解决这个问题,我打开了 TortoiseGit Settings->Icon Overlays 并将状态缓存设置为“None”。 现在 TGitCache 进程结束了,所有对象都“空闲”了,可以被 git gc 处理。

【讨论】:

【参考方案3】:

您需要关闭发生锁定命令的命令的控制台。这可能是锁定文件的 VI 或任何被杀死的命令。最简单的解决方案是关闭所有内容并重新打开。您应该能够毫无问题地执行命令。

【讨论】:

【参考方案4】:

Git 2.23(2019 年第三季度)应避免在 gc 期间出现权限被拒绝问题,因为提交图 (introduced in Git 2.18) 会预先计算并将祖先遍历所需的信息存储在单独的文件中以优化图遍历。

在 Git 2.23 中,提交图文件是运行时“文件”的一部分 可能会保持打开的文件描述符,所有这些都需要 完成对象存储后关闭”,文件描述符为 一个现有的提交图文件现在被关闭之前“gc”完成一个 替换它的新实例。

参见Derrick Stolee (derrickstolee) 的commit 2d511cf、commit 5472c32、commit c3a3a96(2019 年 5 月 17 日)。(由 Junio C Hamano -- gitster -- 合并于 commit 5cb7c73,2019 年 7 月 9 日)

packfile:关闭close_all_packs 中的提交图

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

提交图也执行重命名,因此很容易出现这个问题。 在写入之前,我们会小心关闭提交图,但是当“git fetch”(或类似)进程运行可能会写入提交图的“git gc --auto”时,这不起作用。

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

【讨论】:

以上是关于我可以/应该如何处理这个 git gc 错误? (rm:无法取消链接包权限被拒绝)的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何处理“TypeError:store.addListener 不是函数”错误

GC时如何处理对象引用

nginx 错误调试应该如何处理?

我应该如何处理“'someFunction' 不是从 'namespace:somePackage' 导出的对象”错误? [关闭]

twitter 错误 401 - 我应该如何处理感叹号?

如何处理 std::vector 的错误?