无法使用File delete()方法删除git repo中的.pack文件

时间:2013-10-04 22:24:31

标签: java git github jgit

对于这个方法我正在写,我正在使用jgit库克隆一个git repo,然后用这些文件做一些事情,最后我想删除repo。 我遇到的问题是当我在.pack文件(位于.git \ objects \ pack)上调用delete()方法时,它无法删除。但是可以删除所有其他文件。为什么会这样?

2 个答案:

答案 0 :(得分:5)

刚刚找到一个干净的方法: 在使用repo完成后,以这种方式关闭git对象:

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

答案 1 :(得分:1)

您可以看到,基于JGit的Java应用程序默认会出现ddd乱码的倾向 例如,请参阅config file 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”,则会成功删除存储库。

  
     

是。这就是默认情况。