git update-ref

优质
小牛编辑
162浏览
2023-12-01

命名

git-update-ref - 安全地更新存储在ref中的对象名称

概要

git update-ref [-m <reason>] (-d <ref> [<oldvalue>] | [--no-deref] [--create-reflog] <ref> <newvalue> [<oldvalue>] | --stdin [-z])

描述

给定两个参数,将<newvalue>存储在<ref>中,可能会取消引用符号引用。例如,git update-ref HEAD <newvalue>将当前分支头更新为新对象。

给定三个参数,在验证<ref>的当前值匹配<oldvalue>之后,将<newvalue>存储在<ref>中,可能会解引用符号引用。例如git update-ref refs/heads/master <newvalue> <oldvalue>,只有当它的当前值是<oldvalue>时,才将主分支头更新为<newvalue>。您可以指定40“0”或空字符串作为<oldvalue>以确保您创建的引用不存在。

它还允许“ref”文件通过从“ref:”的四字节标题序列开始,成为另一个ref文件的符号指针。

更重要的是,它允许ref文件的更新遵循这些符号指针,无论它们是符号链接还是这些“常规文件符号引用”。它仅在以“refs /”开头时遵循真正的符号链接:否则它只会尝试读取它们并将它们更新为常规文件(即,它将允许文件系统跟随它们,但会覆盖此类符号链接到其他位置一个普通的文件名)。

如果给出--no-deref,则<ref>本身被覆盖,而不是遵循符号指针的结果。

一般来说,使用

git update-ref HEAD "$head"

应该lot比做更安全

echo "$head" > "$GIT_DIR/HEAD"

从符号链接错误检查的角度来看都是如此。符号链接的“refs /”规则意味着指向树“外部”的符号链接是安全的:它们将被读取而不是写入(因此,我们将永远不会通过ref符号链接写入其他树,如果您通过创建符号链接树来复制整个存档)。

使用-d标志,它会在验证它仍包含<oldvalue>后删除指定的<ref>。

With --stdin,update-ref从标准输入读取指令并一起执行所有修改。指定表单的命令:

update SP <ref> SP <newvalue> [SP <oldvalue>] LF
create SP <ref> SP <newvalue> LFdelete SP <ref> [SP <oldvalue>] LF
verify SP <ref> [SP <oldvalue>] LF
option SP <opt> LF

与此同时--create-reflog,即使通常不会创建一个ref,update-ref也会为每个ref创建一个reflog。

引用包含空白的字段,就好像它们是C源代码中的字符串一样; 即由双引号和反斜杠转义字符包围。使用40个“0”字符或空字符串指定一个零值。要指定缺失值,请完全省略该值及其前面的SP。

或者,使用-z以NUL终止的格式指定,不用引用:

update SP <ref> NUL <newvalue> NUL [<oldvalue>] NUL
create SP <ref> NUL <newvalue> NULdelete SP <ref> NUL [<oldvalue>] NUL
verify SP <ref> NUL [<oldvalue>] NUL
option SP <opt> NUL

在这种格式中,使用40“0”来指定零值,并使用空字符串指定缺失值。

无论哪种格式,值都可以以Git认为是对象名称的任何形式指定。任何其他格式的命令或重复的<ref>都会产生错误。命令的含义是:

更新

如果给定,在验证<oldvalue>之后将<ref>设置为<newvalue>。指定一个零<newvalue>以确保ref在更新后不存在和/或一个零<oldvalue>以确保ref在更新之前不存在。

create

验证它不存在后,用<newvalue>创建<ref>。给定的<newvalue>可能不是零。

delete

如果给定,在验证它存在<oldvalue>之后删除<ref>。如果给出,<oldvalue>可能不是零。

verify

验证<ref>与<oldvalue>,但不要更改它。如果<oldvalue>零或丢失,则ref不能存在。

option

修改命名<ref>的下一个命令的行为。唯一有效的选择是no-deref避免取消引用符号引用。

如果所有<ref> s可以同时与匹配的<oldvalue>锁定,则会执行所有修改。否则,不会执行修改。请注意,虽然每个单独的<ref>以原子方式更新或删除,但并发读者仍可能看到修改的子集。

记录更新

如果配置参数“core.logAllRefUpdates”为true并且ref为“refs / heads /”,“refs / remotes /”,“refs / notes /”下的符号,或者符号ref HEAD; 或者存在“$ GIT_DIR / logs / <ref>”文件,则会在日志文件“$ GIT_DIR / logs / <ref>”后git update-ref添加一行(在创建日志名称前解除所有符号引用),描述ref值的变化。日志行格式为:

  1. oldsha1 SP newsha1 SP提交者LF其中“oldsha1”是先前存储在<ref>中的40个字符的十六进制值,“newsha1”是<newvalue>的40个字符的十六进制值,“committer”是提交者的姓名,电子邮件地址和日期标准的Git提交者ident格式。可选用-m:
  1. oldsha1 SP newsha1 SP 提交者 TAB 消息 LF

其中所有字段均如上所述,“消息”是提供给 -m 选项的值。

如果当前用户无法创建新的日志文件,追加到现有的日志文件或没有可用的提交者信息,则更新将失败(不会更改<ref>)。