Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JGit RevWalk.parseTag不会解除对包文件的锁定_Java_Git_Jgit - Fatal编程技术网

Java JGit RevWalk.parseTag不会解除对包文件的锁定

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

我正在使用JGITAPI显示存储库的标记

下面是我创建的从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进程,我可以删除存储库而不会出现任何错误


我是否在获取标签时出错?

很可能是因为存储库未关闭而锁定了文件。在尝试删除存储库之前,您的代码是否会调用
存储库#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()调用,文件已正确关闭。您是否可以提供更多的代码以使整个流程可见?理想情况下,减少一组最小的步骤,为您显示问题!