gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:20:28 25 4
gpt4 key购买 nike

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

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

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

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

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

在提交 ID 下,虚拟文件​​系统提供提交的“原样”源文件。

引用/标签作为符号链接(symbolic link)提供到实际提交的引用/标签的 HEAD:

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

为了使这个文件系统更快,我需要一种方法来非常快速地迭代存储库中的所有提交。像我现在一样单独查看每个标签和引用并不是最优的,因为如果引用共享共同的历史记录(它们几乎总是这样做!),这样我就会多次查看相同的提交。

我希望获得一个仍然可用的所有提交的简单列表,而不仅仅是属于分支的一部分,这样您甚至可以查看引用/标签无法再访问的版本。

最佳答案

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

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

查看GC.java的源代码在 JGit 存储库中。您可以做的是调用 GC#repack(),之后所有引用的对象都应该位于包文件中。然后您可以执行类似于 GC#prune 的操作,查找未引用的松散对象。请注意,GC 目前是内部的(不是 API),因此不要依赖它保持这样的状态。

关于java - 如何使用 jgit 查找所有提交,而不仅仅是可引用的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17178432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com