## 命名

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>）。