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

How do I release file system locks after cloning repo via JGit

我正在尝试按照此处的指南使用 jGit 克隆远程现有存储库:

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

我在示例中使用 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() 方法的行为似乎有点含糊不清。: http://download.eclipse.org/jgit/site/4.0.1.201506240215-r/apidocs/org/eclipse/jgit/lib/Repository.html#close()

Decrement the use count, and maybe close resources.

也许吧?那是什么意思? .close() 方法帮助实现的 AutoCloseable 接口中指定的 "relinquishing any underlying resources" 我需要做什么?

SO 上有几个类似的问题,但其中 none 涉及使用 org.eclipse.jgit.api.Git 上的静态方法克隆新的存储库。

经过几天的探索,当我点击提交时,我偶然发现了我认为是答案的东西。

食谱示例仅在 cloneRepository()call() 方法(一个 Git 实例)的结果上调用 .close() 方法。 API 文档声明该方法还应调用底层 Repository 实例的 .close 方法:

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

If the repository was opened by a static factory method in this class, then this method calls Repository.close() on the underlying repository instance.

但是,我发现如果我自己获取Repository实例并调用它的.close()方法,所有的文件系统锁都会被释放。我认为这是我正在关注的 JGit 食谱参考中的遗漏,并将提交 issue/pull.

这是有效的 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();