我有一個包含 git packfile 的包。
從我現在可以找到的內容來看,我初始化了一個空的 git repo 并將該包檔案復制到 .git/objects 檔案夾中。
之后,我執行了 git unpack-objects 來提取包檔案的內容。
現在的問題是如何獲得該包檔案中的提交總數?我嘗試使用像 git-sizer 這樣的工具,我得到以下輸出
.git % git-sizer -v
Processing blobs: 8
Processing trees: 3
Processing commits: 1
Matching commits to trees: 1
Processing annotated tags: 0
Processing references: 1
| Name | Value | Level of concern |
| ---------------------------- | --------- | ------------------------------ |
| Overall repository size | | |
| * Commits | | |
| * Count | 1 | |
| * Total size | 177 B | |
| * Trees | | |
| * Count | 3 | |
| * Total size | 567 B | |
| * Total tree entries | 11 | |
| * Blobs | | |
| * Count | 8 | |
| * Total size | 69.3 MiB | |
| * Annotated tags | | |
| * Count | 0 | |
| * References | | |
| * Count | 1 | |
| * Branches | 1 | |
| | | |
| Biggest objects | | |
| * Commits | | |
| * Maximum size [1] | 177 B | |
| * Maximum parents [1] | 0 | |
| * Trees | | |
| * Maximum entries [2] | 5 | |
| * Blobs | | |
| * Maximum size [3] | 52.5 MiB | ***** |
| | | |
| History structure | | |
| * Maximum history depth | 1 | |
| * Maximum tag depth | 0 | |
| | | |
| Biggest checkouts | | |
| * Number of directories [2] | 3 | |
| * Maximum path depth [2] | 3 | |
| * Maximum path length [2] | 65 B | |
| * Number of files [2] | 9 | |
| * Total size of files [2] | 69.3 MiB | |
| * Number of symlinks | 0 | |
| * Number of submodules | 0 | |
[1] 73d9a3662c9e52c39e8efbfa40a48e39f143d72e (refs/heads/master)
[2] 7a244cc36e07929f2714296021c7605daaf28542 (refs/heads/master^{tree})
[3] 6cbe51484efd47cd119ba9d54bc87061cc140b63 (refs/heads/master:objects/pack/pack-c1117410d7ff71062c25e2e4f3dd86ebffca897b.pack)
并且正在顯示的一個提交是我所做的那個,但應該還有更多..有沒有辦法獲得總提交數?
uj5u.com熱心網友回復:
Git 包檔案包含物件,但物件本身沒有用。
一個 Git存盤庫包含兩個資料庫(加上輔助檔案,以及其他選項,但是這兩個資料庫是這里的關鍵):
一個資料庫保存所有物件。這些可以在單個包檔案中,在多個包檔案中,和/或作為“松散”物件存在。如果沒有其他資料庫,它們就沒有用!
另一個資料庫包含名稱。這些名稱參考物件。對于某些名稱型別,參考的物件可能是四種型別中的任何一種,但對于分支和遠程跟蹤名稱,參考的物件必須是commits。
對提交的參考使該提交“可訪問”。可以找到一個可達的提交。
提交本身包含兩件事:
直接,提交包含元資料。此元資料參考單個
tree物件,并具有parent物件參考串列(通常長一個條目,但它可以是零個條目長,或多于一個條目長)。間接地,通過
tree物件,提交包含檔案:這是提交的快照。
因為提交可以并且通常確實參考其他一些先前的(“父”)提交,所以可訪問的提交使得被參考的提交也可以訪問。也就是說,如果名稱master定位 commit a123456...,并且 commita123456說它的父是b789abc...,那么至少有兩個提交是可達的。
現在的問題是如何獲得該包檔案中的提交總數?
包檔案中的提交數量并不是很有趣:只有可達提交的數量才是有趣的。因此,沒有簡單的方法來計算特定的提交物件。但是,如果您真的想這樣做,您可以使用git unpack-objects. 這里有一些限制,因此您希望通過解包到一個新的空存盤庫中來做到這一點,將包中的每個物件都變成一個松散的物件。現在很容易找到每個物件(find .git/objects -type f -print并處理時髦的名稱組織),然后使用git cat-file -t或類似方法來查找每個此類物件的型別(為了提高效率,使用git cat-file --batch-check)。這將允許您將總計數分成單獨的物件型別計數。
您也可以git fsck --unreachable在此處使用,這不需要先解包物件。將包檔案復制到這個臨時的空 Git 存盤庫后,所有提交都將無法訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/515659.html
標籤:混帐
