JGit RevWalk.parseTag不会释放包文件上的锁定

时间:2014-05-21 18:35:03

标签: java git jgit

我正在使用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进程,我可以删除存储库而不会出现任何错误。

我做错了拿标签吗?

1 个答案:

答案 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() );
}