如何在通过 JGit 克隆 repo 后释放文件系统锁
How do I release file system locks after cloning repo via JGit
我正在尝试按照此处的指南使用 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()
方法的行为似乎有点含糊不清。:
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
方法:
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();
我正在尝试按照此处的指南使用 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()
方法的行为似乎有点含糊不清。:
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
方法:
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();