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

时间:2015-08-01 17:29:26

标签: java jgit filehandle

我正在使用jGit克隆远程现有仓库,遵循指南:

https://github.com/centic9/jgit-cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/CloneRemoteRepository.java

我正在使用CFML作为我的例子:

temp\.git\objects\pack

克隆工作得很好,但是在我停止Java进程之前,.close()内的“pack”文件上没有发布文件锁。

然后我也注意到API文档似乎对结果的AutoCloseable方法的行为有点过于谨慎。 http://download.eclipse.org/jgit/site/4.0.1.201506240215-r/apidocs/org/eclipse/jgit/lib/Repository.html#close()

  

减少使用次数,并可能关闭资源。

也许?那是什么意思?在.close()方法帮助实现的org.eclipse.jgit.api.Git接口中指定的“放弃任何底层资源”需要做什么?

在SO上有几个类似的问题,但没有一个涉及在.close()上使用静态方法来克隆新的repo。

2 个答案:

答案 0 :(得分:7)

因此,经过几天的戳戳后,我点击了提交,我偶然发现了我认为的答案。

cookbook示例仅针对cloneRepository()的{​​{1}}方法(A call()实例)的结果调用Git方法。 API文档声明该方法还应调用基础.close实例的Repository方法:

http://download.eclipse.org/jgit/site/4.0.1.201506240215-r/apidocs/org/eclipse/jgit/api/Git.html#close()

  

如果存储库是由此类中的静态工厂方法打开的,则此方法将在底层存储库实例上调用Repository.close()。

但是,我发现如果我自己获取Repository实例并调用其.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();

答案 1 :(得分:0)

我也为此苦苦挣扎。这是我解决这个问题的方法。

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();