git gc / git gui:取消链接文件<i​​nternal pack =“”file =“”name =“”>失败</internal>

时间:2014-08-05 12:33:48

标签: eclipse windows git egit

运行1.9.4.msysgit.0的版本git,我几乎每次在命令行上运行git gc或通过git gui时都会收到上述错误它促使我“压缩松散的物体”:

Counting objects: 1110956, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (269562/269562), done.
Writing objects: 100% (1110956/1110956), done.
Total 1110956 (delta 636114), reused 1110956 (delta 636114)
Unlink of file '.git/objects/pack/pack-207f1feb5376880778637c ... 8371cea62.pack'
    failed. Should I try again? (y/n) n
Checking connectivity: 1110956, done.

唯一的解决方案似乎是针对每个锁定文件点击 n - 正如this thread所建议的那样:

  

简短回答:点击'n'以完成所有这些操作,然后手动完成   运行“git gc”。

线程还暗示......

  

问题是文件由正在尝试执行gc的父git.exe保持打开。

......在查看流程树时,这完全合情合理:

git process tree

我的问题是,我能做些什么来防止这种情况发生?每天多次这样做真的很烦人......为什么会这样?它只是一个git / w32错误吗?


更新1:澄清一下 - 按照描述的几次点击 n 后,git gc完成,本地存储库“干净”,即重新运行git gc不会再导致文件锁定问题 - 但这只是一段时间。在repo上工作了一段时间 - 有时在几分钟之后,有时在几小时之后 - 存储库再次“脏”并且所描述的问题占上风。根据{{​​3}}的建议,在git gc内而不是git-bash内运行cmd无效。他进一步建议其他非git软件可能会持有相关锁。我对此持怀疑态度,尤其是由于上面链接的线程中的注释 - 我认为父git进程正在持有锁 - 但我仍然必须验证该声明。

更新2:事实证明jsexpert一直都是正确的 - 至少在我的情况下确实是IDE锁定了这些文件......所以这是{的一个问题{3}}用于Eclipse,而不是git本身。

enter image description here

更新3:要查找锁定的文件,您可以使用以下免费工具之一:

在这两个中,使用 CTRL F 打开“查找句柄”对话框。

2 个答案:

答案 0 :(得分:0)

检查另一个进程是否没有锁定文件。就我而言,我只需要关闭一个 Eclipse 实例,该实例从运行“git gc”的 git 存储库中打开了一个项目。

答案 1 :(得分:-1)

我建议您使用git中的git-bash(即%GIT_HOME%\bin\bash.exe),而不是cmd。 切换到git-bash后,您不应该期望遇到此问题,因为cmd是一个可能会锁定文件的Windows命令,而git-bash就像一个不会锁定文件的UNIX模拟器(即使它实际上在你的Windows文件夹上查找。)