我正在尝试执行 git pull 并收到以下错误:
文件“lib/xxx.jar”的取消链接失败。我应该再试一次吗?(是/否)
无论我选择 y 还是 n 都无法达到可以拉或推的状态。
这通常意味着一个进程仍在使用该特定文件(仍然有一个句柄) (在 Windows 上,ProcessExplorer擅长跟踪那种进程)
ProcessExplorer
尝试关闭您的其他程序,然后重试您的git pull.
git pull
请注意,您可以使用GIT_ASK_YESNO变量
GIT_ASK_YESNO
2019 年 1 月更新:
使用 Git 2.21(2019 年第一季度),这应该更加固定,因为“ git gc”和“ git repack”在删除之前没有关闭他们发现不需要的打开的包文件,这在无法删除打开的文件的平台上不起作用。 这已得到纠正。
git gc
git repack
请参阅Johannes Schindelin ( ) 的提交 5bdece0(2018 年 12 月 15 日)。(由Junio C Hamano 合并 – --在提交 5104f8f中,2019 年 1 月 18 日)dscho gitster
dscho
gitster
gc/ repack: 需要时发布包 在 Windows 上,如果进程仍持有句柄,则无法删除或重命名文件。 为了解决这个问题,我们引入了该close_all_packs()功能。 早些时候,我们确保在生成包之前释放包git gc,以防gc想要删除不再需要的包。 但是这个开发者忘记了它gc自己也需要放弃包,例如当通过--aggressive选项合并所有包时。 同样,git repack -d想要删除过时的包,因此也需要关闭所有包句柄。
gc
repack
在 Windows 上,如果进程仍持有句柄,则无法删除或重命名文件。 为了解决这个问题,我们引入了该close_all_packs()功能。
close_all_packs()
早些时候,我们确保在生成包之前释放包git gc,以防gc想要删除不再需要的包。
但是这个开发者忘记了它gc自己也需要放弃包,例如当通过--aggressive选项合并所有包时。
--aggressive
同样,git repack -d想要删除过时的包,因此也需要关闭所有包句柄。
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在退出之前运行“”的代码路径保持包文件的映射并将文件描述符留给它们打开,这对无法删除打开的文件的系统不友好。 他们现在在这样做之前关闭包装。
fetch
在自动 gc’ing 之前,我们需要确保打包文件被释放,以防它们需要重新打包和垃圾收集。
许多gc --auto在退出之前运行“”的代码路径保持包文件的映射并将文件描述符留给它们打开,这对无法删除打开的文件的系统不友好。 他们现在在这样做之前关闭包装。
gc --auto
这解决了git-for-widows问题 500。
git-for-widows
查看用于验证该新方法的测试,一种可能的解决方法(因为 Git 2.8 尚未推出)将是人工提高gc.autoPackLimit.
gc.autoPackLimit
git config gc.autoPackLimit 10000 git fetch git config gc.autoPackLimit 50 # default value
git 2.8.4(2016 年 6 月)确实提到了问题 755,这也应该可以缓解这个问题(提交 2db0641):
确保临时文件句柄不被子进程继承