Git
English ▾ 主題 ▾ 最新版本 ▾ gitrepository-layout 最後更新於 2.45.0

名稱

gitrepository-layout - Git 儲存庫佈局

概要

$GIT_DIR/*

描述

Git 儲存庫有兩種不同的形式

  • 一個位於工作樹根目錄的 .git 目錄;

  • 一個 <專案>.git 目錄,它是一個儲存庫(即沒有自己的工作樹),通常用於透過推送和提取與其他人交換歷史記錄。

注意:您也可以在工作樹的根目錄擁有一個純文字檔 .git,其中包含 gitdir: <路徑> 以指向實際擁有儲存庫的目錄。此機制稱為gitfile,通常透過 git submodulegit worktree 命令進行管理。它通常用於子模組簽出的工作樹,以便讓您在包含的父專案中 git checkout 不包含子模組的分支。checkout 必須移除整個子模組工作樹,而不會遺失子模組儲存庫。

這些內容可能存在於 Git 儲存庫中。

objects

與此儲存庫關聯的物件儲存區。通常,物件儲存區是自給自足的(即,在其中找到的物件引用的所有物件也都可以在其中找到),但有一些方法可以違反此規定。

  1. 您可以透過建立淺層複製來擁有一個不完整但可本地使用的儲存庫。請參閱 git-clone[1]

  2. 您可以使用 objects/info/alternates$GIT_ALTERNATE_OBJECT_DIRECTORIES 機制從其他物件儲存區借用物件。具有此種不完整物件儲存區的儲存庫不適合發佈以用於笨拙的傳輸,但只要 objects/info/alternates 指向它借用的物件儲存區,其他情況下都可以使用。

    如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,改為使用 "$GIT_COMMON_DIR/objects"。

objects/[0-9a-f][0-9a-f]

新建立的物件會儲存在自己的檔案中。物件會分散到 256 個子目錄中,使用 sha1 物件名稱的前兩個字元,以保持 objects 本身的目錄條目數量在可管理的範圍內。在此處找到的物件通常稱為未封裝(或鬆散)物件。

objects/pack

在此目錄中找到壓縮形式儲存多個物件的封裝(檔案),以及允許隨機存取的索引檔案。

objects/info

關於物件儲存區的其他資訊會記錄在此目錄中。

objects/info/packs

此檔案旨在協助笨拙的傳輸發現此物件儲存區中可用的封裝。每當新增或移除封裝時,如果儲存庫發佈以用於笨拙的傳輸,則應執行 git update-server-info 以使此檔案保持最新。git repack 預設會執行此操作。

objects/info/alternates

此檔案記錄此物件儲存區借用物件的替代物件儲存區的路徑,每行一個路徑名稱。請注意,不僅原生 Git 工具會在本地使用它,而且 HTTP 提取器也會嘗試在遠端使用它;如果您在 alternates 檔案中使用相對路徑(相對於物件資料庫,而不是儲存庫!),這通常會有效,但如果您使用絕對路徑,則除非檔案系統和網址中的絕對路徑相同,否則不會有效。另請參閱 objects/info/http-alternates

objects/info/http-alternates

此檔案記錄此物件儲存區借用物件的替代物件儲存區的 URL,以在透過 HTTP 提取儲存庫時使用。

refs

參考儲存在此目錄的子目錄中。git prune 命令知道要保留可從此目錄及其子目錄中找到的 refs 存取的物件。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄(refs/bisect、refs/rewritten 和 refs/worktree 除外),改為使用 "$GIT_COMMON_DIR/refs"。

refs/heads/name

記錄分支 name 的樹尖端提交物件

refs/tags/name

記錄任何物件名稱(不一定是提交物件,或指向提交物件的標籤物件)。

refs/remotes/name

記錄從遠端儲存庫複製的分支的樹尖端提交物件。

refs/replace/<obj-sha1>

記錄取代 <obj-sha1> 的物件的 SHA-1。這類似於 info/grafts,並且由 git-replace[1] 在內部使用和維護。此類 refs 可以在儲存庫之間交換,而 grafts 不能。

packed-refs

以更有效的方式記錄與 refs/heads/、refs/tags/ 和其他類似項目相同的資訊。請參閱 git-pack-refs[1]。如果設定了 $GIT_COMMON_DIR,則會忽略此檔案,改為使用 "$GIT_COMMON_DIR/packed-refs"。

HEAD

一個指向 refs/heads/ 命名空間的符號參考(請參閱詞彙表),描述目前活動的分支。如果儲存庫未與任何工作樹關聯(即儲存庫),則它沒有太大意義,但是有效的 Git 儲存庫必須具有 HEAD 檔案;某些瓷器可能使用它來猜測儲存庫的指定「預設」分支(通常是master)。如果指定的名稱為 name 的分支(尚未)存在,這是合法的。在某些舊版設定中,它是一個符號連結,而不是指向目前分支的符號參考。

HEAD 也可以直接記錄特定的提交,而不是作為指向目前分支的符號參考。這種狀態通常稱為分離的 HEAD。有關詳細資訊,請參閱 git-checkout[1]

config

儲存庫特定組態檔案。如果設定了 $GIT_COMMON_DIR,則會忽略此檔案,改為使用 "$GIT_COMMON_DIR/config"。

config.worktree

多個工作目錄設定中主要工作目錄的特定組態檔案(請參閱 git-worktree[1])。

branches

一種稍微過時的方式來儲存用於指定 git fetchgit pullgit push 的 URL 的縮寫。可以將檔案儲存為 branches/<name>,然後可以將 name 提供給這些命令,以取代 repository 引數。有關詳細資訊,請參閱 git-fetch[1] 中的 REMOTES 部分。此機制已過時,在現代儲存庫中不太可能找到。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,改為使用 "$GIT_COMMON_DIR/branches"。

hooks

Hook 是由各種 Git 指令使用的自訂腳本。當執行 git init 時,會安裝一些範例 hook,但預設情況下全部都會停用。要啟用,必須重新命名檔案,移除 .sample 後綴。請閱讀 githooks[5] 以了解每個 hook 的更多詳細資訊。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,並改用 "$GIT_COMMON_DIR/hooks"。

common

當使用多個工作樹時,$GIT_DIR 中的大多數檔案都是每個工作樹獨有的,只有少數已知的例外。然而,common 底下的所有檔案將會在所有工作樹之間共享。

index

儲存庫目前的索引檔案。通常在裸儲存庫中找不到。

sharedindex.<SHA-1>

共享索引部分,供 $GIT_DIR/index 和其他臨時索引檔案參考。僅在分割索引模式下有效。

info

有關儲存庫的其他資訊會記錄在此目錄中。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,並改用 "$GIT_COMMON_DIR/info"。

info/refs

此檔案可協助「dumb transports」發現此儲存庫中可用的 ref。如果儲存庫是發布給「dumb transports」的,則每次建立或修改標籤或分支時,都應該由 git update-server-info 重新產生此檔案。這通常是從 hooks/update hook 完成的,當您使用 git push 推送至儲存庫時,該 hook 會由 git-receive-pack 指令執行。

info/grafts

此檔案會記錄偽造的 commit 祖先資訊,以模擬 commit 的父系集合與實際建立 commit 的方式不同。每行記錄描述一個 commit 及其偽造的父系,列出以空格分隔並以換行符號終止的 40 位元組十六進位物件名稱。

請注意,grafts 機制已過時,並且可能會導致在儲存庫之間傳輸物件時發生問題;請參閱 git-replace[1],它提供了更彈性且強大的系統來執行相同的操作。

info/exclude

此檔案,按照 Porcelains 的慣例,會儲存排除模式清單。.gitignore 是每個目錄的忽略檔案。git statusgit addgit rmgit clean 會查看它,但核心 Git 指令不會查看它。另請參閱:gitignore[5]

info/attributes

定義要指派給路徑的屬性,類似於每個目錄的 .gitattributes 檔案。另請參閱:gitattributes[5]

info/sparse-checkout

此檔案儲存稀疏檢出的模式。另請參閱:git-read-tree[1]

remotes

儲存 URL 的簡寫和預設的 refname,以便在使用 git fetchgit pullgit push 指令與遠端儲存庫互動時使用。有關詳細資訊,請參閱 git-fetch[1] 中的 REMOTES 章節。此機制已過時,不太可能在現代儲存庫中找到。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,並改用 "$GIT_COMMON_DIR/remotes"。

logs

對 ref 所做變更的記錄會儲存在此目錄中。有關詳細資訊,請參閱 git-update-ref[1]。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄(logs/HEAD 除外),並改用 "$GIT_COMMON_DIR/logs"。

logs/refs/heads/name

記錄對名為 name 的分支頂端所做的所有變更。

logs/refs/tags/name

記錄對名為 name 的標籤所做的所有變更。

shallow

這與 info/grafts 類似,但由淺層複製機制在內部使用和維護。請參閱 git-clone[1]git-fetch[1]--depth 選項。如果設定了 $GIT_COMMON_DIR,則會忽略此檔案,並改用 "$GIT_COMMON_DIR/shallow"。

commondir

如果此檔案存在,則 $GIT_COMMON_DIR(請參閱 git[1])會設定為此檔案中指定的路徑,如果未明確設定。如果指定的路徑是相對路徑,則相對於 $GIT_DIR。具有 commondir 的儲存庫,如果沒有 "commondir" 所指向的儲存庫,則是不完整的。

modules

包含子模組的 git 儲存庫。

worktrees

包含連結工作樹的管理資料。每個子目錄都包含連結工作樹的與工作樹相關的部分。如果設定了 $GIT_COMMON_DIR,則會忽略此目錄,並改用 "$GIT_COMMON_DIR/worktrees"。

worktrees/<id>/gitdir

一個文字檔案,其中包含指向此處的 .git 檔案的絕對路徑。這用於檢查連結的儲存庫是否已手動移除,並且不再需要保留此目錄。每次存取連結的儲存庫時,都應更新此檔案的 mtime。

worktrees/<id>/locked

如果此檔案存在,則連結的工作樹可能位於可攜式裝置上且不可用。此檔案的存在會阻止 worktrees/<id> 被自動或由 git worktree prune 手動修剪。該檔案可能包含一個字串,說明儲存庫為何被鎖定。

worktrees/<id>/config.worktree

工作目錄特定的組態檔案。

Git 儲存庫格式版本

每個 git 儲存庫都會在其 config 檔案的 core.repositoryformatversion 鍵中標記一個數值版本。此版本指定了在磁碟儲存庫資料上操作的規則。不理解磁碟儲存庫宣告的特定版本的 git 實作「不得」在該儲存庫上操作;這樣做不僅有產生錯誤結果的風險,而且實際上會遺失資料。

由於此規則,版本更新應保持在絕對最小值。相反,我們通常偏好以下策略

  • 更新個別資料檔案 (例如,索引、packfile 等) 的格式版本號碼。這會將不相容性限制在這些檔案中。

  • 引入當由舊用戶端使用時會優雅降級的新資料 (例如,pack bitmap 檔案會被舊用戶端忽略,而舊用戶端只是不利用它們提供的最佳化)。

整個儲存庫的格式版本更新,應該只是無法獨立版本化的變更的一部分。例如,如果要變更物件的可到達性規則或鎖定 ref 的規則,則需要更新儲存庫格式版本。

請注意,這僅適用於直接存取儲存庫的磁碟內容。僅理解格式 0 的舊用戶端仍然可以透過 git:// 連線至使用格式 1 的儲存庫,只要伺服器進程理解格式 1

推出版本更新 (無論是整個儲存庫還是單一檔案) 的首選策略是教導 git 讀取新格式,並允許使用組態開關或命令列選項寫入新格式 (用於實驗或那些不在意與舊版 git 向後相容的人)。然後,在經過一段長時間以允許讀取功能變得普及之後,我們可能會預設切換為寫入新格式。

目前定義的格式版本是

版本 0

這是由 git 的初始版本定義的格式,包括但不限於儲存庫目錄、儲存庫組態檔案以及物件和 ref 儲存的格式。指定 git 的完整行為超出本文件的範圍。

版本 1

此格式與版本 0 相同,但有以下例外

  1. 當讀取 core.repositoryformatversion 變數時,支援版本 1 的 git 實作「也必須」讀取組態檔案 extensions 區段中找到的任何組態鍵。

  2. 如果版本 1 儲存庫指定執行中 git 尚未實作的任何 extensions.* 鍵,則操作「不得」繼續。同樣地,如果實作不理解任何已知鍵的值,則操作「不得」繼續。

請注意,如果組態檔案中未指定任何擴充功能,則 core.repositoryformatversion 「應該」設定為 0 (將其設定為 1 沒有任何好處,並且會使儲存庫與舊版 git 的實作不相容)。

本文件將作為擴充功能的主要清單。任何希望定義新擴充功能的實作都應該在此處記錄下來,以便宣告該名稱。

定義的擴充功能是

noop

此擴充功能完全不會變更 git 的行為。它僅適用於測試格式 1 的相容性。

preciousObjects

當組態鍵 extensions.preciousObjects 設定為 true 時,儲存庫中的物件「不得」刪除 (例如,由 git-prunegit repack -d 刪除)。

partialClone

當設定組態鍵 extensions.partialClone 時,表示儲存庫是使用部分複製 (或稍後執行部分擷取) 建立的,並且遠端可能省略傳送某些不需要的物件。此類遠端稱為「promisor remote」,它保證所有此類省略的物件都可以在未來從它擷取。

此鍵的值是 promisor 遠端的名稱。

worktreeConfig

如果設定,則預設情況下「git config」會依序從 GIT_DIR 的 "config" 和 "config.worktree" 檔案讀取。在多個工作目錄模式下,"config" 檔案是共享的,而 "config.worktree" 是每個工作目錄獨有的 (也就是說,它位於 GIT_COMMON_DIR/worktrees/<id>/config.worktree 中)

refStorage

指定 ref 資料庫的檔案格式。有效值為 files (具有 packed-refs 檔案的鬆散參考) 和 reftable (請參閱 Documentation/technical/reftable.txt)。

GIT

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

scroll-to-top