我正在尝试使用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>
答案 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),所以请不要依赖它。