簡體   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