1

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

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

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

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

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

在 commit-id 下方,虚拟文件​​系统提供了该提交的“原样”源文件。

Refs/Tags 以符号链接的形式提供,指向该 ref/tag 的实际提交 HEAD:

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

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

最好我想得到一个所有仍然可用的提交的简单列表,而不仅仅是那些属于分支的提交,这样你甚至可以查看 refs/tags 不再可以访问的版本。

4

1 回答 1

2

如果找到通过 reflog 引用的提交就足够了,请使用ReflogCommand(我建议在 JGit 3.0 发布后使用它,它应该在 2013 年 6 月 26 日发布)。

如果您还想查找 reflog 不再引用的提交,则需要类似git fsck. JGit 还没有实现。虽然它确实有一个实现,git gc但它也必须找到未引用的对象。

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

于 2013-06-22T17:39:19.607 回答