【问题标题】:Git - Unlink of file .idx and .pack failed (The only process owned handle to this file is git.exe)Git - 取消链接文件 .idx 和 .pack 失败(该文件的唯一进程拥有句柄是 git.exe)
【发布时间】:2015-04-01 14:26:10
【问题描述】:

请看这张照片! git会那么傻吗? Git 无法取消链接某些文件,但只有 git.exe 持有该文件的句柄。 (权限没问题 - 完全控制) 请问,这个问题有安全的解决方案吗? 我的 Git 版本是 1.9.5-preview20141217

【问题讨论】:

  • 可能有人弄乱了文件(或指向该文件的子目录)的权限,导致当前运行git的用户无权删除它...
  • 嗨,我检查了所有权限,并且管理员有“完全控制权”,我是这台机器上的管理员。
  • 嗨,有没有解决方案?我也有同样的问题。
  • 嗨,我现在有一台新电脑,没有这个问题。所以也许解决方案是将 git 存储库签出到新文件夹,或者更新版本的 git 修复它。
  • 在 Git 2.19(2018 年第三季度)中不应再出现这种情况。见my answer below

标签: git unlink


【解决方案1】:

Git 2.19(2018 年第三季度)改进了包文件的文件描述符管理,并避免了“Unlink of file... failed. Should I try again?”错误消息。

参见Kim Gybels (dscho)commit 12e73a3(2018 年 7 月 9 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 562413e,2018 年 8 月 2 日)

gc --auto: 自动打包前释放打包文件

git gc --auto”在生成“git repack/prune”之前打开包文件的文件描述符,这会扰乱不希望进程处理由另一个进程打开的文件的 Windows。

gc --auto 发布包文件自动打包存储库 以防止在删除它们时出现故障。

还教测试“使用 auto-gc 获取不会锁定”来抱怨 当它不再触发存储库的自动打包时。

这解决了Git for Windows issue "Unlink of file XXX failed. Should I try again?",与PR 1769


另一项改进:在 Git 2.34(2021 年第四季度)中,运行命令 API 已更新,因此调用者可以在生成可能触发 auto-gc 的命令之前轻松询问打开的文件描述符以关闭包文件。

参见commit c4dee2ccommit 5a22a33commit 28d04e1commit 3322a9d(2021 年 9 月 9 日)和commit 7e44ff7commit 957ba81(2021 年 9 月 8 日)Johannes Schindelin (dscho)
(由Junio C Hamano -- gitster -- 合并于commit c042ad5,2021 年 9 月 20 日)

c4dee2c085:在产生子进程的地方关闭对象存储

签字人:约翰内斯·辛德林

在许多情况下,当我们生成可能触发重新打包的子进程时,我们首先明确关闭对象存储(以便repack 进程可以删除.pack 文件,否则在 Windows 上是不可能的,因为只要文件仍在使用就无法删除)。

我们现在尽可能使用run_command() API 的新close_object_store 位,以进一步延迟关闭对象存储。
这使得代码更易于维护,因为现在更明显的是,我们只因为那些子进程而释放那些文件句柄。

【讨论】:

    【解决方案2】:

    我遇到了这个问题并通过命令解决了它:git gc 上面的命令删除临时和不必要的文件(垃圾收集器):https://stackoverflow.com/a/26229658/532575

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2018-05-10
      • 2021-04-10
      相关资源
      最近更新 更多