Git

名称

git-check-ref-format - 确保引用名称的格式正确

概述

git check-ref-format [--normalize]
       [--[no-]allow-onelevel] [--refspec-pattern]
       <引用名>
git check-ref-format --branch <branchname-shorthand>

描述

检查给定的 ‘引用名’ 是否可接受,如果不可接受,则以非零状态退出。

在 Git 中,引用被用来指定分支和标签。 分支头存储在 refs/heads 层次结构中,而标签存储在引用命名空间的 refs/tags 层次结构中(通常在 $GIT_DIR/refs/heads$GIT_DIR/refs/tags 目录中,或者,如果引用是由 git gc 打包的,则作为文件 $GIT_DIR/packed-refs 的条目)。

Git 对引用的命名方式有以下规则:

  1. 它们可以包括斜线`/,用于分层(目录)分组,但任何斜线分隔的组件都不能以点.开头或以序列.lock`结尾。

  2. 它们可以包括斜线 /,用于分层(目录)分组,但任何斜线分隔的组件都不能以点 . 开头或以序列 .lock 结尾。

  3. 他们不能在任何地方有两个连续的点 ..

  4. 它们不能有 ASCII 控制字符(即数值低于 \040,或 177 DEL 的字节)、空格、斜体字 ~、省略号 ^,或冒号 : 的任何一个。

  5. 它们不能有问号 ?,星号 *,或大括号 [`的地方。 参见下面的 `--refspec-pattern 选项,以了解这一规则的例外情况。

  6. They cannot begin or end with a slash / or contain multiple consecutive slashes (see the --normalize option below for an exception to this rule).

  7. 它们不能以点 . 结尾。

  8. 它们不能包含一个序列 @{

  9. 它们不能是单个字符 @

  10. 它们不能包含一个 \

这些规则使基于 shell 脚本的工具很容易解析引用名,当引用名未加引号(错误地)使用时由 shell 进行路径名扩展,同时也避免了某些引用名表达的歧义(见 gitrevisions[7]):

  1. 双点 .. 经常被用作 ref1..ref2,在某些情况下,这个符号意味着 ^ref1 ref2(即不在 ref1ref2 中)。

  2. 省略号 ~^ 符号用于介绍后缀 ‘第 n 个父亲’ 和 ‘剥洋葱’ 操作。

  3. 冒号 : 在获取和推送操作中被用于 srcref:dstref,表示 `使用 srcref(源引用)的值并将其存储在 dstref(目标引用)中。 它也可以用来选择一个特定的对象,如 git cat-file: "git cat-file blob v1.3.3:refs.c"。

  4. @{ 被用来作为访问一个引用日志条目的符号。

With the --branch option, the command takes a name and checks if it can be used as a valid branch name (e.g. when creating a new branch). But be cautious when using the previous checkout syntax that may refer to a detached HEAD state. The rule git check-ref-format --branch $name implements may be stricter than what git check-ref-format refs/heads/$name says (e.g. a dash may appear at the beginning of a ref component, but it is explicitly forbidden at the beginning of a branch name). When run with the --branch option in a repository, the input is first expanded for the “previous checkout syntax” @{-n}. For example, @{-1} is a way to refer the last thing that was checked out using "git switch" or "git checkout" operation. This option should be used by porcelains to accept this syntax anywhere a branch name is expected, so they can act as if you typed the branch name. As an exception note that, the “previous checkout operation” might result in a commit object name when the N-th last thing checked out was not a branch.

选项

--[no-]allow-onelevel

控制是否接受单级参考名称(即不包含多个 / 分隔的参考名称)。 默认值是 --no-allow-onelevel

--refspec-pattern

将 <引用名> 解释为引用规范的参考名称模式(如用于远程仓库)。 如果这个选项被启用,<引用名> 允许在引用规范中包含一个 *(例如, foo/bar*/bazfoo/bar*baz/,但不允许 foo/bar*/baz*)。

--normalize

将 ‘引用名’ 规范化,去掉任何前导斜线(/)字符,并将名称成分之间的相邻斜线折叠成一个斜线。 如果规范化后的引用名有效,则将其打印到标准输出,并以 0 的状态退出,否则以非零状态退出。 (--print--normalize 的一种废弃的拼写方式。)

实例

  • 打印前一个检出的东西的名称:

    $ git check-ref-format --branch @{-1}
  • 确定新分支要使用的引用名称:

    $ ref=$(git check-ref-format --normalize "refs/heads/$newbranch")||
    { echo "we do not like '$newbranch' as a branch name." >&2 ; exit 1 ; }

GIT

属于 git[1] 文档

scroll-to-top