Skip to content

git-check-ref-format

命令名称 - 确保引用名称格式正确

概要

bash
[verse]
'git check-ref-format' [--normalize]
       [--[no-]allow-onelevel] [--refspec-pattern]
       <refname>
'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. 它们必须至少包含一个 /。这强制存在类似 heads/tags/ 等的类别,但实际名称不受限制。如果使用了 --allow-onelevel 选项,则放宽此规则。

  3. 它们不能在任何位置有两个连续的点 ..

  4. 它们不能在任何位置有 ASCII 控制字符(即值低于 \040 或 \177 DEL 的字节)、空格、波浪号 ~、插入符 ^ 或冒号 :

  5. 它们不能在任何位置有问号 ?、星号 * 或开括号 [。有关此规则的例外情况,请参阅下面的 --refspec-pattern 选项。

  6. 它们不能以斜杠 / 开头或结尾,也不能包含多个连续的斜杠(有关此规则的例外情况,请参阅下面的 --normalize 选项)。

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

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

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

  10. 它们不能包含 \

这些规则使得基于 shell 脚本的工具可以轻松解析引用名称,在引用名称被(错误地)未加引号使用时避免 shell 进行路径名扩展,还可以避免某些引用名称表达式中的歧义(参阅 gitrevisions(7)):

  1. 双点 .. 常用于 ref1..ref2,在某些上下文中此表示法意味着 ^ref1 ref2(即不在 ref1 中且在 ref2 中)。

  2. 波浪号 ~ 和插入符 ^ 用于引入后缀"第 n 个父级"和"剥离外层"操作。

  3. 冒号 : 用于 srcref:dstref 表示在 fetch 和 push 操作中"使用 srcref 的值并将其存储在 dstref 中"。它也可用于选择特定对象,如 'git cat-file' 中:"git cat-file blob v1.3.3:refs.c"。

  4. @{ 用作访问 reflog 条目的表示法。

使用 --branch 选项时,该命令接受一个名称并检查它是否可以用作有效的分支名称(例如创建新分支时)。但使用可能引用分离 HEAD 状态的先前检出语法时要小心。git check-ref-format --branch $name 实现的规则可能比 git check-ref-format refs/heads/$name 所说的更严格(例如,破折号可以出现在引用组件的开头,但在分支名称的开头是明确禁止的)。在仓库中使用 --branch 选项运行时,输入首先会针对"先前检出语法" @{-n} 进行展开。例如,@{-1} 是引用使用"git switch"或"git checkout"操作最后检出内容的一种方式。Porcelain 应在期望分支名称的任何地方使用此选项来接受此语法,以便它们可以表现得如同您输入了分支名称一样。作为例外,请注意,"先前检出操作"在最后第 N 次检出的内容不是分支时,可能产生提交对象名称。

选项

  • --allow-onelevel / --no-allow-onelevel - 控制是否接受单级引用名称(即不包含多个 / 分隔组件的引用名称)。默认为 --no-allow-onelevel

  • --refspec-pattern - 将 <refname> 解释为 refspec 的引用名称模式(与远程仓库一起使用时)。如果启用此选项,允许 <refname> 在 refspec 中包含单个 *(例如 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 "我们不喜欢 '$newbranch' 作为分支名称。" >&2 ; exit 1 ; }

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布