我正在尝试执行 git pull 并收到以下错误:
文件“lib/xxx.jar”的取消链接失败。我应该再试一次吗?(是/否)
无论我选择 y 还是 n 都无法达到可以拉或推的状态。
这通常意味着一个进程仍在使用该特定文件(仍然有一个句柄)
(在 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 .idx
and .pack
failed (The only processowned handle to this file is git.exe
) ”
这是 Windows 特定的答案,所以我知道它与您无关......我只是为了将来的搜索者的利益而将其包括在内。
就我而言,这是因为我从非提升的命令行运行 Git。“以管理员身份运行”为我修复了它。
对我来说,这是因为 Visual Studio 试图从 pull 中重新加载所有更改的文件。刷新 Visual Studio,然后运行git gc
.
在使用 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 解决了这个问题。
尝试重新启动您的 Apache 或其他 Web 服务器,因为它可能已锁定您的某些文件。
关闭 Visual Studio 和 Rubymine 并没有再次收到错误。其中之一是罪魁祸首。
关闭您的 IDE,然后执行git pull
. 它会起作用的。
在我的案例中,这是由 LESS 编译器 SimplLESS 引起的。您必须在系统托盘中关闭它。
我也遇到了这个问题,但是我发现是UltraEdit碍事,因为我用UE组织和编辑我的eclipse工作区~~
可能是因为 UE 对特定文件的旧版本有句柄,Git 无法取消链接。
在我关闭 UltraEdit 之后,问题就再也没有发生过。
以上答案都不适用于我,但我运行带有 force 选项的 git gc 命令,它解决了我的情况。
'git gc --force'
[Windows 7,以管理员身份运行 => 命令提示符]
问题是因为您有一些处理这些文件的程序。我有一个建议,您应该使用 Unlocker 来查找正在处理它的程序:
我在 Windows XP 上遇到过这种情况,消息都卡在一个循环中,并且可以通过回复来清除。
通过关闭 Git-GUI 清除了卡在循环中的发生。(我在 bash shell 中运行 git merge -i 。)
其他情况可能是由于我的存储库中的大量文件而发生的。它主要发生在 .cod 文件中,我后来将其从版本控制中排除。(我确实有理由最初跟踪它们。)我相信原因可能与 Git 使用文件句柄的速率有关。
我想知道通过回复可以清除问题是否与Windows相关,因为之前的两个海报都提到了Windows,并且没有人说他们与其他操作系统有问题。
我打开了 PHPStorm,关闭了它,一切都很好。
我遇到了同样的问题,我从窗口任务管理器中关闭了所有相关程序。但是,它仍然无法正常工作。有趣的部分是我运行了“Git rebase”而不是“Git pull”并且它成功了!
尝试在管理模式下运行命令行编辑器并运行命令。它帮助并解决问题。:)
我在 Windows 上遇到了同样的问题。我试图在我的 Ubuntu VM 上访问文件时在 Windows 上运行 gc。Ubuntu 上的封闭终结者和文件资源管理器对我有用。
就我而言,我有一种修剪导致问题的标签的旧方法。我通过取消原始设置来解决它:
git config --global --unset remote.origin.fetch '\+refs/tags/\*:refs/tags/\*'
然后将其添加到修剪服务器上已删除的分支:
git config --global fetch.pruneTags true
我遇到了同样的错误,并通过关闭 eclipse 并在使用文件时再次拉取来解决它。