## 名称

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

## 概要

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

## 描述

检查给定`refname`是否可接受，如果不是，则退出非零状态。

Git 使用引用来指定分支和标签。分支头存储在`refs/heads`层次结构中，而标记存储在`refs/tags`ref命名空间的层次结构中（通常位于`$GIT_DIR/refs/heads`和`$GIT_DIR/refs/tags`目录中，或者作为`$GIT_DIR/packed-refs`文件中的条目，如果引用被`git gc`打包）。

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. 腭化符号`~`字符和补注号`^`字符被用于引入后缀`nth parent`和`peel onion`操作。

3. 冒号`:`被用来在`srcref:dstref`中表示“ 在 srccref 的值中使用 srcref的值并将其存储在 dstref 中”在读取和推送操作中。它也可以用来选择一个特定的对象，比如 'git cat-file'：“git cat-file blob v1.3.3：refs.c”。

4. at-open-brace `@{`被用作访问 reflog 条目的符号。

通过`--branch`选项，它可以扩展“以前的分支语法” `@{-n}`。例如，`@{-1}`是一种引用最后一个分支的方法。这个选项应该被porcelains用来在任何需要分支名称的地方接受这个语法，所以他们可以像你输入分支名称一样行事。

## 选项

--no-allow-onelevel

控制是否接受单层refnames（即不包含多个`/`分离组件的refnames ）。默认是`--no-allow-onelevel`。

--refspec-pattern

将<refname>解释为refspec的参考名称模式（与远程存储库一起使用）。如果这个选项被激活，<refname>允许含有单个`*`中操作的Refspec（例如，`foo/bar*/baz`或`foo/bar*baz/`而不是`foo/bar*/baz*`）。

--normalize

`refname`通过删除任何前导斜杠（`/`）字符并将名称组件之间相邻斜线的运行折叠为单斜杠来标准化。如果标准化的 refname 有效，那么将其输出到标准输出并以状态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 ; }