繁体   English   中英

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

[英]How to find all commits using jgit, not just referenceable ones

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

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

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

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

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

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

Refs/Tags 作为符号链接提供给实际提交该 ref/tag 的 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),所以不要依赖它保持这种状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM