如何使用jgit查找所有提交,而不仅仅是可引用的提交

时间:2013-06-18 20:36:27

标签: java jgit

我正在尝试使用jGit来获取存储库中的所有提交,而不仅仅是我可以通过头或标签访问的提交,而是所有尚未收集垃圾的提交。有没有办法以有效的方式使用jGit做到这一点?

更新以更好地描述实际用例

我正在开发一个基于FUSE的文件系统,它提供了Git历史记录的文件系统视图,请参阅https://github.com/centic9/JGitFS/获取第一个版本(仅限Linux / Mac)。

有了这个,我为提交提供了“虚拟”子目录,即我正在创建一个如下所示的目录结构

/commit
   00
     abcd..
     bcde..
   ae
     bdas..

在commit-id下面,虚拟文件​​系统提供了“as-of”提交的源文件。

参考/标签作为实际提交该参考/标签的HEAD的符号链接提供:

/branch
   master -> ../commit/00/abcd...
   bugfix -> ../commit/ae/bdas...
/tag
   version_1 -> ../commit/00/bcde...

为了使这个文件系统更快,我需要一种方法来非常快速地迭代存储库中的所有提交。像我现在一样分别查看每个标记和ref是次优的,因为如果refs共享一个共同的历史记录(他们几乎总是这样做的话),我会多次查看相同的提交。

我希望得到一个简单的列表,列出所有仍然可用的提交,而不仅仅是分支的一部分,这样你甚至可以查看refs / tags无法访问的版本。< / p>

1 个答案:

答案 0 :(得分:2)

如果查找通过reflog引用的提交就足够了,请使用ReflogCommand(我建议使用JGit 3.0一旦发布,应该在2013-06-26)。

如果您还要查找reflog未引用的提交,则需要git fsck之类的内容。 JGit还没有实现。它确实有一个git gc的实现,它也必须找到未引用的对象。

请参阅JGit存储库中GC.java的源代码。您可以做的是调用GC#repack(),之后所有引用的对象都应该在包文件中。然后你可以做类似于GC#prune的事情,它找到未引用的松散对象。请注意GC目前是内部的(不是API),所以请不要依赖它。