directory search
Guides gitattributes giteveryday gitglossary gitignore gitmodules gitrevisions gittutorial gitworkflows Administration git archive git bundle git clean git filter-branch git fsck git gc git instaweb git reflog Basic Snapshotting git add git commit git diff git mv git reset git rm git status Branching and Merging git branch git checkout git log git merge git mergetool git stash git tag Debugging git bisect git blame git grep Email git am git format-patch git request-pull git send-email External Systems git fast-import git svn Getting and Creating Projects git clone git init Git git annotate git archimport git bisect-lk2009 git check-attr git check-mailmap git check-ref-format git checkout-index git cherry git citool git column git credential git credential-cache git credential-store git cvsexportcommit git cvsimport git cvsserver git diff-files git diff-tree git difftool git fast-export git fetch-pack git fmt-merge-msg git get-tar-commit-id git gui git http-backend git http-fetch git http-push git imap-send git index-pack git interpret-trailers git ls-remote git ls-tree git mailinfo git mailsplit git merge-file git merge-index git merge-one-file git merge-tree git mktag git mktree git name-rev git notes git p4 git pack-objects git pack-redundant git pack-refs git parse-remote git patch-id git prune git prune-packed git quiltimport git receive-pack git remote-ext git remote-fd git remote-testgit git repack git replace git rerere git send-pack git sh-i18n git sh-setup git shell git show-branch git show-index git stripspace git unpack-file git unpack-objects git upload-archive git upload-pack git var git verify-commit git verify-tag git whatchanged git worktree Inspection and Comparison git describe git shortlog git show Miscellaneous api credentials api index gitcli gitcore tutorial gitcredentials gitcvs migration gitdiffcore githooks gitk gitnamespaces gitremote helpers gitrepository layout gitsubmodules gittutorial 2 gitweb gitweb.conf pack format User Manual Patching git apply git cherry-pick git rebase git revert Plumbing Commands git cat-file git check-ignore git commit-tree git count-objects git diff-index git for-each-ref git hash-object git ls-files git merge-base git read-tree git rev-list git rev-parse git show-ref git symbolic-ref git update-index git update-ref git verify-pack git write-tree Server Admin git daemon git update-server-info Setup and Config git git config git help Sharing and Updating Projects git fetch git pull git push git remote git submodule
characters

命名

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

Previous article: Next article: