代码之家  ›  专栏  ›  技术社区  ›  Ekatsim

如何删除Java平台锁定的文件?

  •  2
  • Ekatsim  · 技术社区  · 9 年前

    由于JGit,我目前正在开发一个克隆Git存储库的应用程序( http://wiki.eclipse.org/JGit/User_Guide )每次用户登录时。当用户想退出应用程序时,我想删除克隆。 问题是:在克隆存储库时,会创建一个.git文件夹,其中可以找到一个文件.pack(.git/objects/pack/sutpideFile.pack),并且无法删除,因为Java平台正在锁定它(当尝试手动删除它时,会出现错误“由于文件以Java(TM)Platform SE二进制文件打开,所以无法完成操作”)。

    这是Jgit的已知问题: .pack file from git repo can't be deleted using File delete() method . 因此,我使用了这里提出的解决方案: https://github.com/ajoberstar/grgit/issues/33 这是在我的删除方法之前添加这三行:
    WindowCacheConfig config=新建WindowCacheConfig();
    config.setPackedGitMMAP(true);
    WindowCache.install(配置);

    但真正困扰我的是,因为我不明白 这个解决方案只起一次作用 :我启动服务器(TomCat),连接,然后断开连接。在这里,整个文件夹被删除。然而,当我重新连接和断开连接(不重新启动服务器)时,文件会被破坏,在我关闭服务器之前,我不能再删除它了。

    有人知道它为什么会起作用,但只有一次吗?

    感谢您的帮助,

    编辑: 嗯,所以我只需要补充 git.getRepository().close(); 当我完成使用Git对象时。然后就可以删除了!

    1 回复  |  直到 8 年前
        1
  •  0
  •   Community CDub    8 年前

    这是一个 know bug in JGit ,请参阅 How do I release file system locks after cloning repo via JGit

    基本上,您当前需要添加对“Git.getRepository().close()”的调用,以便在发布新版本的JGit之前释放所有文件系统锁。

    result = Git.cloneRepository()
            .setURI( 'https://github.com/github/testrepo.git' )
            .setDirectory( localPath )
            .call();
    
    // this is currently necessary to free all file locks
    result.getRepository().close();
    
    result.close();
    

    JGit 4.1计划对此进行修复。