我正在尝试使用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/

10-17 01:49