我正在使用JGit API来显示存储库的标签。
以下是我创建的从Ref对象获取标记的方法。
private RevTag getTag(Git git, Ref ref) {
RevWalk revWalk = new RevWalk(git.getRepository());
RevTag tag = null;
ObjectId id = ref.getObjectId();
try {
tag = revWalk.parseTag(id);
}
catch (Exception e) {
e.printStackTrace();
return null;
}
revWalk.release();
return tag;
}
此函数成功返回标记的RevTag对象,但它将某些包文件锁定在.git / objects目录中,并且不释放锁定。如果我尝试从Windows资源管理器中删除存储库,则会收到错误消息,指出正在使用该资源。如果我杀死调用此方法的java进程,我可以删除存储库而不会出现任何错误。
我做错了拿标签吗?
答案 0 :(得分:0)
文件很可能被锁定,因为存储库未关闭。在您尝试删除存储库之前,您的代码是否会调用Repository#close()
?
下面是一个使用RevWalk解析标记而不泄漏资源的示例:
@Rule
public final TemporaryFolder tempFolder = new TemporaryFolder();
@Test
public void testRevWalkDoesNotLeakResources() throws Exception {
Git git = Git.init().setDirectory( tempFolder.getRoot() ).call();
git.commit().setMessage( "First commit" ).call();
git.tag().setName( "First-Tag" ).call();
Ref tagRef = git.getRepository().getRef( "refs/tags/First-Tag" );
RevWalk revWalk = new RevWalk( git.getRepository() );
RevTag tag = revWalk.parseTag( tagRef.getObjectId() );
revWalk.release();
git.getRepository().close();
tempFolder.delete();
assertNotNull( tag );
assertFalse( tempFolder.getRoot().exists() );
}