設定與配置
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.46.1 → 2.47.0 無變更
-
2.46.0
07/29/24
- 2.45.1 → 2.45.2 無變更
-
2.45.0
04/29/24
- 2.43.1 → 2.44.2 無變更
-
2.43.0
11/20/23
- 2.30.1 → 2.42.3 無變更
-
2.30.0
12/27/20
- 2.29.1 → 2.29.3 無變更
-
2.29.0
10/19/20
- 2.27.1 → 2.28.1 無變更
-
2.27.0
06/01/20
- 2.19.3 → 2.26.3 無變更
-
2.19.2
11/21/18
- 2.18.1 → 2.19.1 無變更
-
2.18.0
06/21/18
- 2.7.6 → 2.17.6 無變更
-
2.6.7
05/05/17
- 2.2.3 → 2.5.6 無變更
-
2.1.4
12/17/14
-
2.0.5
12/17/14
概要
git update-ref [-m <reason>] [--no-deref] (-d <ref> [<old-oid>] | [--create-reflog] <ref> <new-oid> [<old-oid>] | --stdin [-z])
描述
給定兩個參數,將 <new-oid> 儲存在 <ref> 中,可能會取消參照符號 refs。 例如,git update-ref HEAD <new-oid>
會將目前分支的 HEAD 更新為新的物件。
給定三個參數,將 <new-oid> 儲存在 <ref> 中,可能會取消參照符號 refs,並在驗證 <ref> 的目前值是否符合 <old-oid> 後進行。例如,git update-ref refs/heads/master <new-oid> <old-oid>
只會在 master 分支的目前值為 <old-oid> 時,將其 HEAD 更新為 <new-oid>。您可以將 40 個 "0" 或空字串指定為 <old-oid>,以確保您正在建立的 ref 不存在。
它還允許 "ref" 檔案成為指向另一個 ref 檔案的符號指標,方法是以 "ref:" 的四位元組標頭序列開頭。
更重要的是,它允許 ref 檔案的更新遵循這些符號指標,無論它們是符號連結還是這些「一般檔案符號 refs」。只有當它們以 "refs/" 開頭時,它才會追蹤真實的符號連結:否則,它只會嘗試讀取它們並將它們作為一般檔案更新(也就是說,它將允許檔案系統追蹤它們,但會將指向其他位置的此類符號連結覆寫為一般檔案名稱)。
如果指定 --no-deref,則會覆寫 <ref> 本身,而不是追蹤符號指標的結果。
一般來說,使用
git update-ref HEAD "$head"
應該比執行
echo "$head" > "$GIT_DIR/HEAD"
在符號連結追蹤的觀點和錯誤檢查的觀點上,都安全得多。符號連結的 "refs/" 規則表示指向樹狀結構「外部」的符號連結是安全的:它們將被追蹤以進行讀取,但不進行寫入(因此,如果您透過建立符號連結樹狀結構複製了整個封存,我們將永遠不會透過 ref 符號連結寫入到其他樹狀結構)。
使用 -d
旗標,它會在驗證名為 <ref> 的 ref 仍包含 <old-oid> 後刪除該 ref。
使用 --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
,即使通常不會建立 reflog,update-ref 也會為每個 ref 建立一個 reflog。
將包含空格的欄位引用,如同它們是 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> 以確保在更新後 ref 不存在,和/或指定零 <old-oid> 以確保在更新之前 ref 不存在。
- create
-
在驗證 <ref> 不存在後,使用 <new-oid> 建立 <ref>。給定的 <new-oid> 不得為零。
- delete
-
在驗證 <ref> 存在並具有 <old-oid>(如果已給定)後,刪除 <ref>。如果已給定,<old-oid> 不得為零。
- symref-update
-
在驗證 <old-target> 或 <old-oid>(如果已給定)後,將 <ref> 設定為 <new-target>。指定零 <old-oid> 以確保在更新之前 ref 不存在。
- verify
-
根據 <old-oid> 驗證 <ref>,但不變更它。如果 <old-oid> 為零或遺失,則 ref 必須不存在。
symref-create:在驗證符號 ref <ref> 不存在後,使用 <new-target> 建立該 ref。
- symref-delete
-
在驗證 <ref> 存在並具有 <old-target>(如果已給定)後,刪除 <ref>。
- symref-verify
-
根據 <old-target> 驗證符號 <ref>,但不變更它。如果 <old-target> 遺失,則 ref 必須不存在。只能在
no-deref
模式中使用。 - option
-
修改下一個命名 <ref> 的命令的行為。唯一有效的選項是
no-deref
,以避免取消參照符號 ref。 - start
-
開始一個交易。與非交易式工作階段相反,如果工作階段在沒有明確提交的情況下結束,則交易會自動中止。當目前的交易已經提交或中止時,此命令可能會建立一個新的空交易。
- prepare
-
準備提交交易。這會為所有已排隊的參考更新建立鎖定檔案。如果無法鎖定一個參考,則交易將會中止。
- commit
-
提交為交易排隊的所有參考更新,結束交易。
- abort
-
中止交易,如果交易處於已準備狀態,則釋放所有鎖定。
如果所有 <ref> 都可以同時以符合的 <old-oid> 鎖定,則會執行所有修改。否則,不會執行任何修改。請注意,雖然每個 <ref> 都會以原子方式更新或刪除,但並行讀取器仍然可能會看到一部分修改。
記錄更新
如果組態參數 "core.logAllRefUpdates" 為 true,且 ref 是 "refs/heads/"、"refs/remotes/"、"refs/notes/" 底下的 ref 之一,或是像 HEAD 或 ORIG_HEAD 這類的虛擬 ref;或者如果檔案 "$GIT_DIR/logs/<ref>" 存在,則 git update-ref
會將一行附加到記錄檔 "$GIT_DIR/logs/<ref>"(在建立記錄名稱之前取消參照所有符號 ref),描述 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>)。
GIT
屬於 git[1] 套件的一部分