簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-repack 最後更新於 2.51.0

名稱

git-repack - 打包倉庫中未打包的物件

概要

git repack [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [-m]
	[--window=<n>] [--depth=<n>] [--threads=<n>] [--keep-pack=<pack-name>]
	[--write-midx] [--name-hash-version=<n>] [--path-walk]

描述

此命令用於將當前不在“pack”中的所有物件合併到一個 pack 中。它還可以用於將現有的 pack 重新組織成一個更高效的 pack。

Pack 是一個物件集合,每個物件都經過單獨壓縮,並應用了增量壓縮,儲存在一個檔案中,並帶有一個關聯的索引檔案。

Pack 用於減輕映象系統、備份引擎、磁碟儲存等的負載。

選項

-a

不增量打包未打包的物件,而是將所有引用的物件打包到一個 pack 中。當打包用於私有開發的倉庫時特別有用。與 -d 配合使用。這將清理 git prune 留下的物件,但 git fsck --full --dangling 顯示為懸空的物件。

請注意,透過 dumb 協議獲取的使用者必須獲取整個新 pack 才能獲得其中包含的任何物件,無論他們本地已經擁有多少其他物件。

Promisor packfiles 被單獨 repacked:如果存在具有關聯 ".promisor" 檔案的 packfiles,這些 packfiles 將被 repacked 到另一個單獨的 pack 中,並會寫入一個與新單獨 pack 對應的空 ".promisor" 檔案。

-A

-a 相同,除非使用了 -d。在這種情況下,前一個 pack 中任何無法訪問的物件將變為鬆散的、未打包的物件,而不是保留在舊 pack 中。無法訪問的物件永遠不會被有意新增到 pack 中,即使在 repacking 時也是如此。此選項可防止無法訪問的物件透過保留在舊 pack 中然後被刪除的方式立即刪除。相反,鬆散的無法訪問的物件將根據下次 *git gc* 呼叫中的正常過期規則進行修剪。請參閱 git-gc[1]

-d

打包後,如果新建立的 pack 使某些現有 pack 變得多餘,則刪除多餘的 pack。還執行 *git prune-packed* 以刪除多餘的鬆散物件檔案。

--cruft

-a 相同,除非使用了 -d。在這種情況下,任何無法訪問的物件將被打包到一個單獨的 cruft pack 中。下次呼叫 git gc 時(請參閱 git-gc[1]),可以使用正常的過期規則修剪無法訪問的物件。與 -k 不相容。

--cruft-expiration=<approxidate>

立即過期早於 <approxidate> 的無法訪問的物件,而不是等待下次呼叫 git gc。僅與 --cruft -d 一起使用時有用。

--max-cruft-size=<n>

覆蓋 cruft pack 的 --max-pack-size。預設繼承 --max-pack-size 的值(如果指定)。有關更多詳細資訊,請參閱 --max-pack-size 的文件。

--combine-cruft-below-size=<n>

生成 cruft pack 而不進行修剪時,僅重新打包大小嚴格小於 <n> 的現有 cruft pack,其中 <n> 表示位元組數,可以可選地附加“k”、“m”或“g”。大小大於或等於 <n> 的 cruft pack 將保持不變,不被重新打包。當您希望避免在有許多大型或非常大的無法訪問物件的倉庫中重新打包大型 cruft pack 時非常有用。

--expire-to=<dir>

將包含修剪後物件的 cruft pack(如果有)寫入目錄 <dir>。此選項對於將任何修剪後的物件副本保留在單獨的目錄中作為備份非常有用。僅與 --cruft -d 一起使用時有用。

-l

--local 選項傳遞給 *git pack-objects*。請參閱 git-pack-objects[1]

-f

--no-reuse-delta 選項傳遞給 git-pack-objects,請參閱 git-pack-objects[1]

-F

--no-reuse-object 選項傳遞給 git-pack-objects,請參閱 git-pack-objects[1]

-q
--quiet

不在標準錯誤流上顯示進度,並將 -q 選項傳遞給 *git pack-objects*。請參閱 git-pack-objects[1]

-n

不使用 *git update-server-info* 更新伺服器資訊。此選項會跳過更新用於透過 HTTP 或 FTP 釋出此倉庫(或其直接副本)所需的本地目錄檔案。請參閱 git-update-server-info[1]

--window=<n>
--depth=<n>

這兩個選項影響 pack 中包含的物件如何使用增量壓縮排行儲存。物件首先按型別、大小以及可選的名稱進行內部排序,並與 --window 內的其他物件進行比較,以檢視使用增量壓縮是否可以節省空間。--depth 限制了最大的增量深度;過深的 delta 會影響解包程式的效能,因為需要應用這麼多次 delta 資料才能獲得所需的物件。

--window 的預設值為 10,--depth 的預設值為 50。最大深度為 4095。

--threads=<n>

此選項將被傳遞給 git pack-objects

--window-memory=<n>

此選項在 --window 之上提供了一個額外的限制;視窗大小將動態縮放,以不超過 *<n>* 位元組的記憶體使用量。這對於包含混合大小物件的倉庫非常有用,可以避免因大視窗而耗盡記憶體,同時仍然可以利用大視窗處理小物件。大小可以附加“k”、“m”或“g”。--window-memory=0 使記憶體使用無限制。預設值來自 pack.windowMemory 配置變數。請注意,實際記憶體使用量將是限制乘以 git-pack-objects[1] 使用的執行緒數。

--max-pack-size=<n>

每個輸出 pack 檔案的最大大小。大小可以附加“k”、“m”或“g”。允許的最小大小限制為 1 MiB。如果指定,可能會建立多個 packfile,這也會阻止建立點陣圖索引。預設情況下是無限制的,除非設定了配置變數 pack.packSizeLimit。請注意,此選項可能會導致倉庫更大且速度變慢;請參閱 pack.packSizeLimit 中的討論。

--filter=<filter-spec>

從生成的 packfile 中刪除匹配過濾器規範的物件,並將它們放入單獨的 packfile 中。請注意,工作目錄中使用的物件不會被過濾掉。因此,為了使拆分完全生效,最好在裸倉庫中執行此操作,並與此選項一起使用 -a-d 選項。此外,還應使用 --no-write-bitmap-index(或將 repack.writeBitmaps 配置選項設定為 false),否則寫入點陣圖索引會失敗,因為它假設只有一個 packfile 包含所有物件。請參閱 git-rev-list[1] 檢視有效的 <filter-spec> 形式。

--filter-to=<dir>

將包含過濾掉物件的 pack 寫入目錄 <dir>。僅與 --filter 一起使用時有用。這可用於將 pack 放在透過 Git 備用機制訪問的單獨物件目錄中。警告: 如果包含過濾掉物件的 packfile 不可訪問,倉庫可能會損壞,因為它可能無法訪問該 packfile 中的物件。請參閱 gitrepository-layout[5] 中的 objectsobjects/info/alternates 部分。

-b
--write-bitmap-index

在 repack 中寫入可達性點陣圖索引。這僅在與 -a-A-m 一起使用時才有意義,因為點陣圖必須能夠引用所有可達物件。此選項會覆蓋 repack.writeBitmaps 的設定。如果建立了多個 packfile,此選項將無效,除非寫入 MIDX(在這種情況下,會建立多 pack 點陣圖)。

--pack-kept-objects

在 repacking 時包含 .keep 檔案中的物件。請注意,在 pack-objects 完成後,我們仍然不會刪除 .keep pack。這意味著我們可能會複製物件,但這使得在併發推送或獲取時該選項是安全的。此選項通常僅在您使用 -brepack.writeBitmaps 寫入點陣圖時才有用,因為它確保了點陣圖 packfile 包含必需的物件。

--keep-pack=<pack-name>

從 repacking 中排除指定的 pack。這相當於在 pack 上有一個 .keep 檔案。<pack-name> 是 pack 檔名,不包含前導目錄(例如 pack-123.pack)。該選項可以指定多次以保留多個 pack。

--unpack-unreachable=<when>

在鬆開無法訪問的物件時,不要鬆開早於 <when> 的任何物件。這可以用於最佳化掉任何將在後續 git prune 中立即被修剪的物件。

-k
--keep-unreachable

-ad 一起使用時,現有 pack 中的任何無法訪問的物件將被追加到 packfile 的末尾,而不是被刪除。此外,任何無法訪問的鬆散物件將被打包(並刪除其鬆散的對應物)。

-i
--delta-islands

--delta-islands 選項傳遞給 git-pack-objects,請參閱 git-pack-objects[1]

-g<factor>
--geometric=<factor>

排列生成的 pack 結構,使得每個連續的 pack 包含的物件數量至少是下一個最大 pack 的 <factor> 倍。

git repack 透過確定需要打包到一起的 packfile 的“切片”來確保這一點,以確保幾何級數的增長。它選擇最小的 packfile 集,以便儘可能多的較大的 packfile(按包含物件數量排序)可以保持不變。

與其他 repack 模式不同,要打包的物件集由需要組合起來以恢復幾何級數的 pack 集唯一確定。

鬆散物件隱式包含在此“捲起”中,無論其可達性如何。這在未來可能會發生變化。

在寫入多 pack 點陣圖時,git repack 會選擇最大的結果 pack 作為 MIDX 的物件選擇首選 pack(請參閱 git-multi-pack-index[1])。

-m
--write-midx

寫入一個包含非冗餘 pack 的多 pack 索引(請參閱 git-multi-pack-index[1])。

--name-hash-version=<n>

將此引數傳遞給底層 git pack-objects 程序。請參閱 git-pack-objects[1] 以獲取完整詳細資訊。

--path-walk

--path-walk 選項傳遞給底層 git pack-objects 程序。請參閱 git-pack-objects[1] 以獲取完整詳細資訊。

配置

各種配置變數會影響打包,請參閱 git-config[1](搜尋“pack”和“delta”)。

預設情況下,該命令將 --delta-base-offset 選項傳遞給 *git pack-objects*;這通常會產生稍小的 pack,但生成的 pack 與 1.4.4 版本以下的 Git 版本不相容。如果您需要與如此古老的 Git 版本共享您的倉庫,無論是直接還是透過 dumb http 協議,則需要將配置變數 repack.UseDeltaBaseOffset 設定為“false”並重新打包。在這種情況下,從舊 Git 版本透過本機協議訪問不受此選項的影響,因為轉換是按需進行的。

增量壓縮不用於大於 core.bigFileThreshold 配置變數的物件,以及屬性設定為 false 的檔案(delta)。

GIT

Git[1] 套件的一部分