Git

名稱

git-pack-refs - 打包 head 和 tag 以便有效率地存取儲存庫

概要

git pack-refs [--all] [--no-prune] [--auto] [--include <pattern>] [--exclude <pattern>]

描述

傳統上,分支和標籤的頂端(統稱為refs)會以每個 ref 一個檔案的形式儲存在 $GIT_DIR/refs 目錄下的(子)目錄中。雖然許多分支頂端往往會經常更新,但大多數標籤和一些分支頂端永遠不會更新。當儲存庫有數百或數千個標籤時,這種每個 ref 一個檔案的格式既浪費儲存空間又會影響效能。

此命令用於解決儲存和效能問題,方法是將 ref 儲存在單個檔案 $GIT_DIR/packed-refs 中。當在傳統的 $GIT_DIR/refs 目錄階層中找不到 ref 時,會在該檔案中查找,如果找到則使用它。

後續對分支的更新始終會在 $GIT_DIR/refs 目錄階層下建立新檔案。

處理有太多 ref 的儲存庫的建議做法是使用 --all 一次打包其 ref,然後偶爾執行 git pack-refs。標籤在定義上是靜態的,不希望發生變更。分支 head 將與初始的 pack-refs --all 一起打包,但只有目前活動的分支 head 會被解包,下一個 pack-refs(不使用 --all)會讓它們保持解包狀態。

選項

--all

預設情況下,該命令會打包所有已打包的標籤和 ref,並將其他 ref 保持原樣。這是因為預期分支會被積極開發,打包其頂端無助於效能。此選項會導致所有 ref 也被打包,但隱藏的 ref、損壞的 ref 和符號 ref 除外。適用於具有許多歷史感興趣分支的儲存庫。

--no-prune

該命令通常會在打包後刪除 $GIT_DIR/refs 階層下的鬆散 ref。此選項會指示它不要這樣做。

--auto

根據 ref 資料庫的目前狀態,根據需要打包 ref。行為取決於儲存庫使用的 ref 格式,並且未來可能會變更。

  • "files":尚未實作 --auto 的特殊處理。

  • "reftable":表格會經過壓縮,使其形成幾何序列。對於兩個表格 N 和 N+1(其中 N+1 較新),這會保持 N 至少是 N+1 兩倍大的屬性。只有違反此屬性的表格才會被壓縮。

--include <pattern>

根據 glob(7) 模式打包 ref。重複使用此選項會累積包含模式。如果 ref 同時包含在 --include--exclude 中,則 --exclude 優先。使用 --include 會排除預設包含的所有標籤。符號 ref 和損壞的 ref 永遠不會打包。與 --all 一起使用時,它將為空操作。使用 --no-include 來清除和重設模式清單。

--exclude <pattern>

不要打包符合給定 glob(7) 模式的 ref。重複使用此選項會累積排除模式。使用 --no-exclude 來清除和重設模式清單。如果 ref 已打包,則使用 --exclude 包含它不會解包它。

--all 一起使用時,僅打包不符合任何提供的 --exclude 模式的鬆散 ref。

--include 一起使用時,將會打包提供給 --include 的 ref,減去提供給 --exclude 的 ref。

錯誤

在引入 packed-refs 機制之前編寫的舊文件可能仍然會說「存在 .git/refs/heads/<branch> 檔案」,而它的意思是「存在分支 <branch>」。

GIT

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

scroll-to-top