174

我正在尝试执行 git pull 并收到以下错误:

文件“lib/xxx.jar”的取消链接失败。我应该再试一次吗?(是/否)

无论我选择 y 还是 n 都无法达到可以拉或推的状态。

4

18 回答 18

206

这通常意味着一个进程仍在使用该特定文件(仍然有一个句柄)
(在 Windows 上,ProcessExplorer擅长跟踪那种进程)

尝试关闭您的其他程序,然后重试您的git pull.

请注意,您可以使用GIT_ASK_YESNO变量.


2019 年 1 月更新:

使用 Git 2.21(2019 年第一季度),这应该更加固定,因为“ git gc”和“ git repack”在删除之前没有关闭他们发现不需要的打开的包文件,这在无法删除打开的文件的平台上不起作用。
这已得到纠正。

请参阅Johannes Schindelin ( ) 的提交 5bdece0(2018 年 12 月 15 日(由Junio C Hamano 合并 -- --提交 5104f8f中,2019 年 1 月 18 日)dscho
gitster

gc/ repack: 需要时发布包

在 Windows 上,如果进程仍持有句柄,则无法删除或重命名文件。
为了解决这个问题,我们引入了该close_all_packs()功能。

早些时候,我们确保在生成包之前释放包git gc,以防gc想要删除不再需要的包。

但是这个开发者忘记了它gc自己也需要放弃包,例如当通过--aggressive选项合并所有包时。

同样,git repack -d想要删除过时的包,因此也需要关闭所有包句柄。


2016 年 1 月更新

这应该在 Git 2.8(2016 年 3 月)中得到修复(参见下面的 Git 2.19,Q3 2018)

请参阅Johannes Schindelin ( )的提交 d562102提交 dcacb1b提交 df617b5提交 0898c96(2016 年 1 月 13 日) 。(由Junio C Hamano 合并——提交 3c80940中,2016 年 1 月 26 日)dscho
gitster

fetch: 在垃圾收集之前释放包文件

在自动 gc'ing 之前,我们需要确保打包文件被释放,以防它们需要重新打包和垃圾收集。

许多gc --auto在退出之前运行“”的代码路径保持包文件的映射并将文件描述符留给它们打开,这对无法删除打开的文件的系统不友好。
他们现在在这样做之前关闭包装。

这解决了git-for-widows问题 500

查看用于验证该新方法的测试,一种可能的解决方法(因为 Git 2.8 尚未推出)将是人工提高gc.autoPackLimit.

git config gc.autoPackLimit 10000
git fetch
git config gc.autoPackLimit 50 # default value

git 2.8.4(2016 年 6 月)确实提到了问题 755,这也应该可以缓解这个问题(提交 2db0641):

确保临时文件句柄不被子进程继承


实际上,上面提到的git-for-windows问题 500确实在 Git 2.19, Q3 2018 中得到了修复。
请参阅“ Git - Unlink of file .idxand .packfailed (The only processowned handle to this file is git.exe)

于 2012-04-16T21:27:40.193 回答
62

这是 Windows 特定的答案,所以我知道它与您无关......我只是为了将来的搜索者的利益而将其包括在内。

就我而言,这是因为我从非提升的命令行运行 Git。“以管理员身份运行”为我修复了它。

于 2012-09-05T11:06:27.457 回答
31

对我来说,这是因为 Visual Studio 试图从 pull 中重新加载所有更改的文件。刷新 Visual Studio,然后运行git gc​​.

于 2014-06-04T19:44:52.737 回答
5

在使用 GitHub for Windows 的 Windows 上,运行时我在 shell 中遇到了类似的错误git gc

Unlink of file '.git/objects/pack/pack-0b40ae7eae9b83edac62e19c07ff7b4c175244f6.idx' failed. Should I try again? (y/n)

我通过关闭 GitHub GUI 解决了这个问题。

于 2015-04-24T09:17:36.437 回答
2

尝试重新启动您的 Apache 或其他 Web 服务器,因为它可能已锁定您的某些文件。

于 2014-05-30T10:31:22.973 回答
2

关闭 Visual Studio 和 Rubymine 并没有再次收到错误。其中之一是罪魁祸首。

于 2015-04-30T15:55:45.950 回答
2

关闭您的 IDE,然后执行git pull. 它会起作用的。

于 2016-07-28T06:37:13.850 回答
1

在我的案例中,这是由 LESS 编译器 SimplLESS 引起的。您必须在系统托盘中关闭它。

于 2012-08-28T13:35:09.670 回答
1

我也遇到了这个问题,但是我发现是UltraEdit碍事,因为我用UE组织和编辑我的eclipse工作区~~

可能是因为 UE 对特定文件的旧版本有句柄,Git 无法取消链接。

在我关闭 UltraEdit 之后,问题就再也没有发生过。

于 2012-06-12T03:15:17.307 回答
1

以上答案都不适用于我,但我运行带有 force 选项的 git gc 命令,它解决了我的情况。

'git gc --force'

[Windows 7,以管理员身份运行 => 命令提示符]

于 2019-02-01T11:08:54.260 回答
0

问题是因为您有一些处理这些文件的程序。我有一个建议,您应该使用 Unlocker 来查找正在处理它的程序:

解锁器

于 2013-03-01T04:22:51.220 回答
0

我在 Windows XP 上遇到过这种情况,消息都卡在一个循环中,并且可以通过回复来清除。

通过关闭 Git-GUI 清除了卡在循环中的发生。(我在 bash shell 中运行 git merge -i 。)

其他情况可能是由于我的存储库中的大量文件而发生的。它主要发生在 .cod 文件中,我后来将其从版本控制中排除。(我确实有理由最初跟踪它们。)我相信原因可能与 Git 使用文件句柄的速率有关。

我想知道通过回复可以清除问题是否与Windows相关,因为之前的两个海报都提到了Windows,并且没有人说他们与其他操作系统有问题。

于 2013-12-05T14:03:11.887 回答
0

我打开了 PHPStorm,关闭了它,一切都很好。

于 2015-11-02T14:24:34.010 回答
0

我遇到了同样的问题,我从窗口任务管理器中关闭了所有相关程序。但是,它仍然无法正常工作。有趣的部分是我运行了“Git rebase”而不是“Git pull”并且它成功了!

于 2017-05-09T18:27:55.477 回答
0

尝试在管理模式下运行命令行编辑器并运行命令。它帮助并解决问题。:)

于 2019-10-16T13:34:42.407 回答
0

我在 Windows 上遇到了同样的问题。我试图在我的 Ubuntu VM 上访问文件时在 Windows 上运行 gc。Ubuntu 上的封闭终结者和文件资源管理器对我有用。

于 2022-02-28T10:44:27.417 回答
0

就我而言,我有一种修剪导致问题的标签的旧方法。我通过取消原始设置来解决它:

git config --global --unset remote.origin.fetch '\+refs/tags/\*:refs/tags/\*'

然后将其添加到修剪服务器上已删除的分支:

git config --global fetch.pruneTags true
于 2019-11-07T17:04:21.263 回答
0

我遇到了同样的错误,并通过关闭 eclipse 并在使用文件时再次拉取来解决它。

于 2020-01-03T03:44:32.993 回答