簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-update-ref 最後更新於 2.50.0

名稱

git-update-ref - 安全地更新引用中儲存的物件名稱

概要

git update-ref [-m <reason>] [--no-deref] -d <ref> [<old-oid>]
git update-ref [-m <reason>] [--no-deref] [--create-reflog] <ref> <new-oid> [<old-oid>]
git update-ref [-m <reason>] [--no-deref] --stdin [-z] [--batch-updates]

描述

給定兩個引數時,將 <new-oid> 儲存在 <ref> 中,可能會解引用符號引用。例如,git update-ref HEAD <new-oid> 會將當前分支頭更新為新的物件。

給定三個引數時,在驗證 <ref> 的當前值與 <old-oid> 匹配後,將 <new-oid> 儲存在 <ref> 中,可能會解引用符號引用。例如,git update-ref refs/heads/master <new-oid> <old-oid> 僅當 master 分支頭的當前值為 <old-oid> 時,才將其更新為 <new-oid>。您可以將 40 個“0”或空字串指定為 <old-oid>,以確保您要建立的引用不存在。

最後的引數是物件名稱;此命令在不帶任何選項的情況下不支援更新符號引用以指向另一個引用(參見 git-symbolic-ref[1])。但 git update-ref --stdin 確實包含 symref-* 命令,因此常規引用和符號引用可以在同一事務中提交。

如果指定了 --no-deref,則 <ref> 本身將被覆蓋,而不是跟隨符號指標的結果。

使用 -d,它會在驗證指定 <ref> 仍包含 <old-oid> 後將其刪除。

使用 --stdin,update-ref 從標準輸入讀取指令並一起執行所有修改。按以下形式指定命令:

update SP <ref> SP <new-oid> [SP <old-oid>] LF
create SP <ref> SP <new-oid> LF
delete SP <ref> [SP <old-oid>] LF
verify SP <ref> [SP <old-oid>] LF
symref-update SP <ref> SP <new-target> [SP (ref SP <old-target> | oid SP <old-oid>)] LF
symref-create SP <ref> SP <new-target> LF
symref-delete SP <ref> [SP <old-target>] LF
symref-verify SP <ref> [SP <old-target>] LF
option SP <opt> LF
start LF
prepare LF
commit LF
abort LF

使用 --create-reflog,update-ref 將為每個引用建立 reflog,即使通常不會建立。

使用 --batch-updates,update-ref 批次執行更新,但允許由於無效或不正確的使用者輸入導致單個更新失敗,僅應用成功的更新。但是,系統相關錯誤(例如 I/O 故障或記憶體問題)將導致所有批次更新完全失敗。任何失敗的更新將按以下格式報告:

rejected SP (<old-oid> | <old-target>) SP (<new-oid> | <new-target>) SP <rejection-reason> LF

對包含空格的欄位進行引用,就像它們是 C 原始碼中的字串一樣;即,用雙引號括起來並使用反斜槓轉義。使用 40 個“0”或空字串來指定零值。要指定缺失值,請完全省略該值及其前面的 SP。

或者,使用 -z 以 NUL 終止格式指定,無需引用

update SP <ref> NUL <new-oid> NUL [<old-oid>] NUL
create SP <ref> NUL <new-oid> NUL
delete SP <ref> NUL [<old-oid>] NUL
verify SP <ref> NUL [<old-oid>] NUL
symref-update SP <ref> NUL <new-target> [NUL (ref NUL <old-target> | oid NUL <old-oid>)] NUL
symref-create SP <ref> NUL <new-target> NUL
symref-delete SP <ref> [NUL <old-target>] NUL
symref-verify SP <ref> [NUL <old-target>] NUL
option SP <opt> NUL
start NUL
prepare NUL
commit NUL
abort NUL

在此格式中,使用 40 個“0”指定零值,並使用空字串指定缺失值。

在任一格式中,值都可以以 Git 識別為物件名稱的任何形式指定。任何其他格式的命令或重複的 <ref> 都會產生錯誤。命令含義如下:

update

如果給定 <old-oid>,則在驗證其後將 <ref> 設定為 <new-oid>。指定零 <new-oid> 可確保更新後引用不存在,和/或指定零 <old-oid> 可確保更新前引用不存在。

create

建立 <ref> 並使用 <new-oid>,前提是驗證它不存在。給定的 <new-oid> 不得為零。

delete

如果給定 <old-oid>,則在驗證 <ref> 存在且包含 <old-oid> 後將其刪除。如果給定,<old-oid> 不得為零。

symref-update

如果給定 <old-target> 或 <old-oid>,則在驗證其後將 <ref> 設定為 <new-target>。指定零 <old-oid> 可確保在更新前引用不存在。

verify

根據 <old-oid> 驗證 <ref>,但不更改它。如果 <old-oid> 為零或缺失,則引用不得存在。

symref-create: 建立符號引用 <ref> 並使用 <new-target>,前提是驗證它不存在。

symref-delete

如果給定 <old-target>,則在驗證 <ref> 存在且包含 <old-target> 後將其刪除。

symref-verify

根據 <old-target> 驗證符號 <ref>,但不更改它。如果 <old-target> 缺失,則引用不得存在。只能在 no-deref 模式下使用。

option

修改下一個命名 <ref> 的命令的行為。唯一有效的選項是 no-deref,用於避免解引用符號引用。

start

開始一個事務。與非事務性會話不同,如果會話在沒有顯式提交的情況下結束,事務將自動中止。噹噹前事務已提交或已中止時,此命令可能會建立一個新的空事務。

prepare

準備提交事務。這將為所有排隊的引用更新建立鎖定檔案。如果某個引用無法鎖定,事務將中止。

commit

提交為該事務排隊的所有引用更新,結束事務。

abort

中止事務,如果事務處於準備狀態,則釋放所有鎖。

如果所有 <ref> 都能同時與匹配的 <old-oid> 鎖定,則執行所有修改。否則,不執行任何修改。請注意,雖然每個單獨的 <ref> 都是原子地更新或刪除,但併發讀取器仍可能看到修改的子集。

更新日誌

如果配置引數“core.logAllRefUpdates”為 true,且引用位於“refs/heads/”、“refs/remotes/”、“refs/notes/”之下,或是一個像 HEAD 或 ORIG_HEAD 這樣的偽引用;或者檔案“$GIT_DIR/logs/<ref>”存在,則 git update-ref 將在日誌檔案“$GIT_DIR/logs/<ref>”中追加一行(在建立日誌名稱之前解引用所有符號引用),描述引用值的更改。日誌行的格式如下:

oldsha1 SP newsha1 SP committer LF

其中“oldsha1”是先前儲存在 <ref> 中的 40 個字元的十六進位制值,“newsha1”是 <new-oid> 的 40 個字元的十六進位制值,“committer”是提交者的姓名、電子郵件地址和日期,採用標準的 Git 提交者身份格式。

可選地帶上 -m

oldsha1 SP newsha1 SP committer TAB message LF

其中所有欄位如上所述,“message”是提供給 -m 選項的值。

如果當前使用者無法建立新的日誌檔案、追加到現有日誌檔案或沒有可用的提交者資訊,則更新將失敗(不更改 <ref>)。

注意事項

符號引用最初是使用符號連結實現的。由於並非所有檔案系統都支援符號連結,因此現在已棄用此方法。

此命令僅在符號連結以“refs/”開頭時才跟隨真正的符號連結:否則它只會嘗試將它們作為常規檔案讀取和更新(即,它將允許檔案系統跟隨它們,但會將此類指向其他位置的符號連結覆蓋為常規檔名)。

另請參閱

GIT

Git[1] 套件的一部分

scroll-to-top