Java 如何在通过JGit克隆repo后释放文件系统锁

Java 如何在通过JGit克隆repo后释放文件系统锁,java,jgit,filehandle,Java,Jgit,Filehandle,我正在尝试使用jGit克隆远程现有回购协议,如下指南所示: 我使用CFML作为示例: Git = createObject( 'java', 'org.eclipse.jgit.api.Git' ); localPath = createObject( 'java', 'java.io.File' ).init( expandPath( 'temp' ) ); result = Git.cloneRepository() .setURI( 'https://github.c

我正在尝试使用jGit克隆远程现有回购协议,如下指南所示:

我使用CFML作为示例:

Git = createObject( 'java', 'org.eclipse.jgit.api.Git' );

localPath = createObject( 'java', 'java.io.File' ).init( expandPath( 'temp' ) );

result = Git.cloneRepository()
        .setURI( 'https://github.com/github/testrepo.git' )
        .setDirectory( localPath )
        .call();

result.close();
克隆工作得很好,但是在我停止Java进程之前,
temp\.git\objects\pack
中的“pack”文件上不会释放文件锁

然后我还注意到API文档对于结果的
.close()
方法的行为似乎有点含糊不清

减少使用计数,可能会关闭资源

也许吧?那是什么意思?我需要做什么才能“放弃任何底层资源”,如
自动关闭
接口中指定的
.close()
方法帮助实现的那样


在这方面有几个类似的问题,但没有一个涉及到使用
org.eclipse.jgit.api.Git
上的静态方法来克隆新的回购协议

在戳了几天后,当我点击提交时,我无意中发现了我认为是答案的东西

cookbook示例仅对
cloneRepository()
call()
方法(一个
Git
实例)的结果调用
.close()
方法。API文档声明该方法还应调用基础
存储库
实例的
.close
方法:

如果存储库是由此类中的静态工厂方法打开的,则该方法将调用基础存储库实例上的repository.close()

但是,我发现如果我自己获得
存储库
实例并调用其
.close()
方法,所有文件系统锁都会被释放。我认为这是我所关注的JGit食谱参考中的一个遗漏,我将提交一个问题/拉

下面是正在工作的CFML代码。注意下面的两个
.close()
调用

Git = createObject( 'java', 'org.eclipse.jgit.api.Git' );

localPath = createObject( 'java', 'java.io.File' ).init( expandPath( 'temp' ) );

result = Git.cloneRepository()
        .setURI( 'https://github.com/github/testrepo.git' )
        .setDirectory( localPath )
        .call();

result.getRepository().close();
result.close();

我也为此挣扎。下面是我如何解决这个问题的

CloneCommand cloneCommand = Git.cloneRepository();
URIish urIish = new URIish(getVersionControlPath().toString());
cloneCommand.setURI(urIish.toString());
Date date = new Date();
String testgit = "testgit_" + date.getTime();
cloneCommand.setDirectory(getVersionControlPath().getParent().resolve(testgit).toFile());
Git call = cloneCommand.call();
call.close();

因此,它也可能是Git.close()方法或其javadoc中的一个bug,也许您也可以在那里提出一个问题来纠正/澄清它?我很乐意向jGit提出一个问题,如果这实际上是库中的一个bug(而不仅仅是一个不完整的示例)。今天晚些时候我会做一个记录。是的,我快速查看了一下,我认为CloneCommand.call()中有一个小错误,它应该在构建Git对象的实例时将“true”作为附加参数传递,以使关闭工作如广告所示,另请参见,在该方法中获取和签出期间出错将导致存储库对象未关闭…感谢您签出。我在这里投了张票: