Git
英文 ▾ 主題 ▾ 最新版本 ▾ git-repack 最後更新於 2.43.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]

描述

此命令用於將目前不在「pack」中的所有物件合併到一個 pack 中。它也可以用來將現有的 pack 重新組織成一個更有效率的 pack。

pack 是一組物件的集合,個別壓縮,套用差異壓縮,儲存在單一檔案中,並附帶一個關聯的索引檔案。

Pack 用於減少鏡像系統、備份引擎、磁碟儲存等方面的負載。

選項

-a

不要逐步封裝未封裝的物件,而是將所有參考的物件封裝到單一 pack 中。在封裝用於私人開發的儲存庫時特別有用。與 -d 一起使用。這將清除 git prune 留下的物件,但 git fsck --full --dangling 顯示為懸空物件。

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

Promisor packfile 會分別重新封裝:如果有與之關聯的 ".promisor" 檔案的 packfile,這些 packfile 將會重新封裝到另一個單獨的 pack 中,並將寫入與新單獨 pack 對應的空 ".promisor" 檔案。

-A

-a 相同,除非使用了 -d。然後,先前 pack 中任何無法存取的物件都會變成鬆散、未封裝的物件,而不是留在舊的 pack 中。無法存取的物件永遠不會有意新增到 pack 中,即使在重新封裝時也是如此。此選項會防止無法存取的物件因為留在舊的 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>

在建立新的 pack 之前,將 cruft 物件重新封裝到大小為 <n> 位元組的 pack 中。只要有足夠多的 cruft pack 小於 <n>,重新封裝就會導致建立新的 cruft pack,其中包含來自任何合併的 cruft pack 的物件,以及任何新的無法存取物件。大於 <n> 的 cruft pack 將不會被修改。當新的 cruft pack 大於 <n> 位元組時,它將被分割成多個 pack,所有這些 pack 都保證大小最多為 <n> 位元組。僅適用於 --cruft -d

--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 限制最大差異深度;深度過深會影響解壓器端的效能,因為需要多次套用差異資料才能取得必要的物件。

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

從產生的封裝檔中移除符合篩選條件的物件,並將它們放入一個獨立的封裝檔。請注意,工作目錄中使用的物件不會被篩選掉。因此,為了使分割完全生效,最好在裸儲存庫中執行,並同時使用 -a-d 選項。此外,應該使用 --no-write-bitmap-index(或將 repack.writebitmaps 組態選項設定為 false),否則寫入點陣圖索引將會失敗,因為它假設一個包含所有物件的單一封裝檔。關於有效的 <filter-spec> 格式,請參閱 git-rev-list[1]

--filter-to=<dir>

將包含篩選出的物件的封裝檔寫入 <dir> 目錄。僅在搭配 --filter 時有用。這可以用於將封裝檔放置在透過 Git alternates 機制存取的獨立物件目錄中。警告:如果包含篩選出的物件的封裝檔無法存取,儲存庫可能會損壞,因為可能無法存取該封裝檔中的物件。請參閱 gitrepository-layout[5]objectsobjects/info/alternates 區段。

-b
--write-bitmap-index

將可達性點陣圖索引作為重新封裝的一部分寫入。這僅在與 -a-A-m 一起使用時才有意義,因為點陣圖必須能夠參考所有可達物件。此選項會覆寫 repack.writeBitmaps 的設定。如果建立多個封裝檔,此選項不起作用,除非寫入 MIDX(在這種情況下,會建立多封裝點陣圖)。

--pack-kept-objects

重新封裝時,包含 .keep 檔案中的物件。請注意,在 pack-objects 完成後,我們仍然不會刪除 .keep 封裝。這表示我們可能會複製物件,但這使得該選項在有並行推送或提取時可以安全使用。此選項通常僅在您使用 -brepack.writeBitmaps 寫入點陣圖時才有用,因為它可以確保點陣圖封裝檔具有必要的物件。

--keep-pack=<pack-name>

排除指定的封裝檔不進行重新封裝。這相當於在封裝檔上具有 .keep 檔案。<pack-name> 是不含前導目錄的封裝檔名稱(例如,pack-123.pack)。可以多次指定此選項以保留多個封裝。

--unpack-unreachable=<when>

在鬆散不可達物件時,請勿鬆散任何比 <when> 更舊的物件。這可以用於最佳化任何會被後續 git prune 立即修剪的物件的寫入。

-k
--keep-unreachable

-ad 一起使用時,現有封裝中的任何不可達物件都將附加到封裝檔的末尾,而不是被移除。此外,任何不可達的鬆散物件都將被封裝(並移除其鬆散的副本)。

-i
--delta-islands

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

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

安排產生的封裝結構,使每個連續的封裝包含至少 <factor> 倍於下一個最大封裝的物件數量。

git repack 藉由確定需要重新封裝為一個封裝檔的封裝檔的「切割」,以確保幾何級數。它會選擇最小的封裝檔集合,以便盡可能保留較大的封裝檔(依該封裝中包含的物件計數)。

與其他重新封裝模式不同,要封裝的物件集合完全由正在「捲動」的封裝集合決定;換句話說,為了恢復幾何級數,需要合併的封裝。

鬆散物件會隱含地包含在此「捲動」中,而不考慮其可達性。未來可能會變更。

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

-m
--write-midx

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

組態

各種組態變數會影響封裝,請參閱 git-config[1](搜尋「pack」和「delta」)。

依預設,此命令會將 --delta-base-offset 選項傳遞給 git pack-objects;這通常會產生稍小的封裝,但產生的封裝與舊於 1.4.4 版本的 Git 不相容。如果您需要直接或透過啞 HTTP 協定與此類舊版 Git 共用您的儲存庫,則需要將組態變數 repack.UseDeltaBaseOffset 設定為「false」並重新封裝。舊版 Git 透過原生協定的存取不受此選項影響,因為在該情況下會根據需要在執行時執行轉換。

不會對大於 core.bigFileThreshold 組態變數的物件以及具有 delta 屬性設定為 false 的檔案使用差異壓縮。

GIT

屬於 git[1] 套件的一部分

scroll-to-top