😧

Gitで使えない文字列を調べてみた

2020/11/09に公開

概要

ドキュメントを確認してgitで使えない文字列を調べまとめた。

調査方法

公式のドキュメントを確認した。

以下コマンドでドキュメントを参照できる。

git help check-ref-format

以下にドキュメントがある。

file:///C:/Program%20Files/Git/mingw64/share/doc/git-doc/git-check-ref-format.html

参照は、Git でブランチやタグを指定するために使われます。ブランチの先頭は refs/heads 階層に、タグは ref 名前空間の refs/tags 階層に格納されます (通常は $GIT_DIR/refs/heads や $GIT_DIR/refs/tags ディレクトリに格納されます。)

Gitをふんわり使っていたので、実際にGit管理されているリポジトリを確認してみたら理解ができた。

Gitのブランチやタグの実態は階層構造で管理されていて、以下をたどるとrefsフォルダがある。

タグ:/.git/refs/tags

リモートブランチ:/.git/refs/remotes/origin

HEADS:/.git/refs/heads/

結論

ドット.、クエスチョンマーク?、スラッシュ/、アットマーク@、バックスラッシュ\の使用には注意が必要。

Git は、参照の名前の付け方について次のようなルールを課しています。

ドットの使用には注意

  • 始端終端はドットにできない

階層的な(ディレクトリの)グループ化のためにスラッシュ / を含めることができますが、スラッシュで区切られたコンポーネントは、ドット .で始まったり、.lock で終わったりすることはできない。

これにより、head/tags/などのカテゴリの存在が強制されますが、実際の名前は制限されません。もし --allow-onelevel オプションが使われている場合、この規則は放棄される。

  • 2つの連続したドットを持つことはできない

それらは、ASCII制御文字(すなわち、値が\040, または\177 DELより小さいバイト)、スペース、チルダ、キャレット^、またはコロン : をどこにも持つことはできない。

  • ドットで終わることはできない

クエスチョンマークの使用には注意

  • クエスチョンマーク ? この規則の例外については、以下の --refspec-pattern オプションを参照すべし。

スラッシュの使い方には注意

  • スラッシュ / で始まったり終わったり、複数の連続したスラッシュを含むことはできない

アットマークの使用

  • シーケンス @{ を含むことはできない。
  • @を一文字にはできない。

バックスラッシュの使用

  • バックスラッシュ\を含めることはできない。

ブランチ名のチェック

以下のコマンドで妥当なブランチ名なのかチェックができる。

git check-ref-format --branch <ブランチ名>

例:

$ git check-ref-format --branch //next
fatal: '/next' is not a valid branch name

終わりに

今回、Gitが内部的にどう動いているか意識するきっかけになった。

内部的なことを知らなくてもググればわかりやすい資料やら記事が出てくるけど、ドキュメントを読むと読み解くために必要な用語を調べなきゃいけなかったりするので世界が広がってよいなあと思った。

知れば知るほどGit難しい。

Headやブランチについては今後調べて理解を深めていきたい所存、、!

この方の記事とか参考になりそう。

GitのHEADとは何者なのか - Qiita

Discussion