我正在尝试使用jGit来获取存储库中的所有提交,不仅是我可以通过head或tag到达的提交,而且还包括所有尚未进行垃圾收集的提交。有没有办法用jGit有效地做到这一点?
更新以更好地描述实际用例
我正在基于FUSE的文件系统上工作,该文件系统提供了Git历史记录的文件系统视图,有关第一个版本,请参见https://github.com/centic9/JGitFS/(仅Linux / Mac)。
这样,我为提交提供“虚拟”子目录,即,我正在创建如下目录结构
/commit
00
abcd..
bcde..
ae
bdas..
在提交ID之下,虚拟文件系统提供了“按原样”提交的源文件。
引用/标记作为符号链接提供,用于实际提交该引用/标记的HEAD:
/branch
master -> ../commit/00/abcd...
bugfix -> ../commit/ae/bdas...
/tag
version_1 -> ../commit/00/bcde...
为了使该文件系统快速运行,我需要一种快速迭代存储库中所有提交的方法。像现在一样,分别查看每个标记和ref是次优的,因为如果ref共享相同的历史记录,则我多次查看同一提交(它们几乎总是这样做!)。
最好是,我希望获得一个仍然可用的所有提交的简单列表,而不仅仅是分支中的一部分,这样,您甚至可以查看引用/标记不再可以访问的版本。
最佳答案
如果找到通过reflog引用的提交就足够了,请使用ReflogCommand
(我建议使用JGit 3.0,一旦发布,应在2013-06-26上使用)。
如果您还想查找reflog不再引用的提交,则需要类似git fsck
的内容。 JGit尚未实现。它确实具有git gc
的实现,该实现还必须查找未引用的对象。
请参见JGit存储库中的GC.java源代码。您可以做的是调用GC#repack()
,此后所有引用的对象都应放在打包文件中。然后,您可以执行类似于GC#prune
的操作,找到未引用的松散对象。请注意,GC
当前是内部的(不是API),所以不要依赖它。
关于java - 如何使用jgit查找所有提交,而不仅仅是引用提交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17178432/