文件取消关联失败。

175

我正在尝试进行git pull,但是出现以下错误:

文件“lib/xxx.jar”的取消链接失败。 我应该重试吗?(y / n)

无论我选择y还是n,都不可能使我达到可以pull或push的状态。


1
在所述文件上运行正确的 chmod 和/或 chown - Not_a_Golfer
只是一点小提示:我在尝试重置 --hard 时遇到了这个问题,后来发现在重置之前将文件添加并提交到本地仓库可以解决。 - PJT
我认为我遇到这个问题是因为我的分支名称中有尖括号。我已经向 GitHub 支持发送了邮件,以确定是否存在 bug。 - Zephyr was a Friend of Mine
这个问题可能有太多的潜在答案,尽管它对我有帮助,但我不得不投票关闭。 - Puppy
伙计们,在Windows上没有unlink或chmod命令。我想知道你们在说什么?Git无法读取用户的答案,这是没有借口的。我也遇到了同样的问题... - Martin Dobšík
显示剩余2条评论
18个回答

210
这通常意味着仍有一个进程在使用该特定文件(仍然持有句柄)
(在Windows上,ProcessExplorer 能够跟踪这种进程)
尝试关闭其他程序,再次尝试 git pull
请注意,您可以使用 GIT_ASK_YESNO 变量 的替代方法。

2019年1月更新:

随着Git 2.21(2019年第一季度)的发布,"git gc"和"git repack"在删除不需要的打包文件之前没有关闭它们发现的打包文件,这在无法删除打开文件的平台上无法正常工作。
这已得到纠正。

请参见commit 5bdece0(2018年12月15日),作者为Johannes Schindelin (dscho)
(由Junio C Hamano -- gitster --合并于commit 5104f8f,2019年1月18日)

gc/repack: 在需要时释放包

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

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

但是这位开发人员忘记了gc本身也需要释放包,例如通过--aggressive选项合并所有包时。

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


更新于2016年1月

这应该在Git 2.8中得到解决(即2016年3月)(请参见下文的Git 2.19,2018年第三季度)

查看commit d562102, commit dcacb1b, commit df617b5, commit 0898c96(2016年1月13日)由Johannes Schindelin (dscho)提交。
(由Junio C Hamano -- gitster --commit 3c80940中合并,2016年1月26日)

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

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

许多在退出前运行 "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月)提到了issue 755,这也应该可以缓解此问题(commit 2db0641):

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


实际上,上面提到的 git-for-windows问题500 已经在Git 2.19,2018年第三季度中得到解决。
请参见 "Git - Unlink of file .idx and .pack failed (The only process owned handle to this file is git.exe)"。

5
很可能有一个正在运行该jar文件的JVM。 - Thorbjørn Ravn Andersen
2
在我的情况下,是Skype。我之前把文件传给了其他人,有些人还没有接受或取消。 - Vivek Kodira
6
我发现Windows资源管理器是罪魁祸首。这很可能是由于TortoiseGit的图标叠加或TGitCache引起的。关闭所有打开的文件夹可以解决问题,但如果只有该项目文件夹处于打开状态,则仅需要关闭该文件夹即可。 - Allan Bogh
4
在我的情况下,由于与开放解决方案绑定,我使用的是VS2013。 - BrotherOdin
2
Explorer.exe 是我的问题 - 我没有 TortoiseGit。我从任务管理器中结束了 explorer.exe,并使用 CTRL-ALT-DELETE => 任务管理器 => 文件 => 运行新任务 => "explorer.exe"(不带引号)生成了一个新的 explorer.exe。 - joehanna
显示剩余4条评论

65

这是一个与Windows相关的答案,所以我知道它与您无关... 我只是包括它是为了未来搜索者的好处。

在我的情况下,原因是我从非提升的命令行中运行Git。 "以管理员身份运行"将其修复了。


4
当我在Windows 7上进行pull操作并且git自动打包时,遇到了一个问题。它抱怨"idx"文件。然后我以管理员身份打开控制台窗口,并运行了git gc,问题就解决了。所以这是一个好的解决方案。 - grahamesd
1
在Windows 7上,git gc为我解决了问题。这是因为我在执行WebStorm的push操作时,在cmder上执行了git pull操作。 - Alessandro
2
哇,谢谢NeilD。这也为我解决了问题。将GIT更好地移植到Windows上会很不错。 - Martin Dobšík
嗯...六年前可能需要。现在呢?谁知道呢?¯_(ツ)_/¯ - NeilD

31

我的问题是Visual Studio试图重新加载从pull中更改的所有文件。请让Visual Studio刷新,然后运行git gc


4
对我来说也是一样的。在运行git gc之前,需要关闭Eclipse。 - alfoks

5
在Windows上使用GitHub for Windows时,当运行git gc命令时,我在shell中遇到了类似的错误:
Unlink of file '.git/objects/pack/pack-0b40ae7eae9b83edac62e19c07ff7b4c175244f6.idx' failed. Should I try again? (y/n)

我是通过关闭 GitHub GUI 解决的。

2

以上答案对我都没有用,但我使用了带有force选项的git gc命令,解决了我的问题。

'git gc --force'

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


2
关闭了Visual Studio和Rubymine,再也没有出现错误。其中一个应用程序是罪魁祸首。

2

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


2
关闭你的IDE,然后执行git pull命令。这样就可以了。

1
这是由于LESS编译器SimpLESS引起的,我遇到了同样的问题。您需要在系统托盘中将其关闭。

1
我也遇到了这个问题,但后来发现是UltraEdit的原因,因为我使用UE来组织和编辑我的eclipse工作空间~~
可能是因为UE占用了特定文件的旧版本,Git无法解除链接。
当我关闭UltraEdit后,这个问题就再也没有出现过。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接