使用File delete()方法无法删除来自git仓库的.pack文件

7

我正在编写的方法是使用jgit库克隆git仓库,然后对这些文件进行一些操作,最后想要删除该仓库。 我遇到的问题是,当我调用.delete()方法来删除一个.pack文件(位于.git\objects\pack目录下)时,它无法被删除。虽然其他文件都可以被删除。为什么会出现这种情况呢?


没事了,我在这里找到了解决方案:http://dev.eclipse.org/mhonarc/lists/jgit-dev/msg01961.html - slyslayer223
JGit在4.0.1版本之前存在已知的bug,请参见https://dev59.com/YFwZ5IYBdhLWcg3wLdoF#31764312?noredirect=1#comment51471054_31764312以获取更多讨论。 - centic
2个回答

11

我刚找到了一个干净的方法来做到这一点: 在对您的仓库进行操作后,以以下方式关闭您的git对象:

Git git;
...
git.getRepository().close();
//then delete files

1
对于像我犯同样错误的人:git.close()git.getRepository().close()不是相同的!Javadoc似乎暗示git.close()也会关闭底层存储库,但这并非总是如此,因此最好明确关闭它。 - hopper

4
你可以看到,基于JGit的Java应用程序通常默认禁用ddd。
例如,请参阅配置文件Gitblit
# When true, JGit will use mmap() rather than malloc()+read() to load data from
# pack files. The use of mmap can be problematic on some JVMs as the garbage
# collector must deduce that a memory mapped segment is no longer in use before
# a call to munmap() can be made by the JVM native code.
#
# In server applications (such as Gitblit) that need to access many pack files,
# setting this to true risks artificially running out of virtual address space,
# as the garbage collector cannot reclaim unused mapped spaces fast enough.
#
# Default on JGit is false. Although potentially slower, it yields much more
# predictable behavior.
# Documentation courtesy of the Gerrit project.
#
# SINCE 1.0.0
# RESTART REQUIRED
git.packedGitMmap = false

这与您找到的JGit thread一致:
引用: 我遇到了另一种无法在Windows中删除克隆存储库的情况。 这个问题似乎与使用“PackedGitMMAP”有关。 尝试使用虚拟内存映射存在已知问题吗?
是这样的。 问题是JVM在Java GC回收内存映射之前不会释放它。 这可能在未来的任何时候发生,如果没有足够的内存压力来强制GC寻找垃圾并重新获取,则可能永远不会发生。 这就是为什么我们默认禁用此功能的原因,我们无法预测JVM何时会最终释放文件。
引用: 在这个测试案例中,如果我将“setPackedGitMMAP=false”,那么存储库就可以成功删除。
是的。这就是为什么这是默认设置。

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