Java JGit RevWalk.parseTag不会解除对包文件的锁定
我正在使用JGITAPI显示存储库的标记 下面是我创建的从Ref对象获取标记的方法Java JGit RevWalk.parseTag不会解除对包文件的锁定,java,git,jgit,Java,Git,Jgit,我正在使用JGITAPI显示存储库的标记 下面是我创建的从Ref对象获取标记的方法 private RevTag getTag(Git git, Ref ref) { RevWalk revWalk = new RevWalk(git.getRepository()); RevTag tag = null; ObjectId id = ref.getObjectId(); try { tag = revWa
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进程,我可以删除存储库而不会出现任何错误
我是否在获取标签时出错?很可能是因为存储库未关闭而锁定了文件。在尝试删除存储库之前,您的代码是否会调用
存储库#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() );
}
对在删除存储库之前,我尝试过使用Repository#close()和Git#close()。无论是否调用这些方法,它都会给出相同的错误。我在上面的答案中放了一个测试片段,它创建了一个带有标记的存储库,读取标记,然后关闭存储库。然后,测试将删除存储库目录。该代码在Windows上使用最新的JGit成功运行。能否确认此代码也在您的环境中运行?如果没有,您使用的是什么版本的JGit?我尝试调试/分析此文件,但通过repository.close()调用,文件已正确关闭。您是否可以提供更多的代码以使整个流程可见?理想情况下,减少一组最小的步骤,为您显示问题!