Java 如何在通过JGit克隆repo后释放文件系统锁
我正在尝试使用jGit克隆远程现有回购协议,如下指南所示: 我使用CFML作为示例: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
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”作为附加参数传递,以使关闭工作如广告所示,另请参见,在该方法中获取和签出期间出错将导致存储库对象未关闭…感谢您签出。我在这里投了张票: