如何创建名称中带有正斜杠的标签

How to create tag with forward slash in its name

当我已经有了类似的标签时,有什么方法可以创建名称中带有正斜杠的 git 标签吗?

假设我有“1.16.0”标签并且我想创建“1.16.0/1.0.0”标签:

$ git tag "1.16.0/1.0.0"
error: 'refs/tags/1.16.0' exists; cannot create 'refs/tags/1.16.0/1.0.0'
fatal: refs/tags/1.16.0/1.0.0: cannot lock the ref

这不可能。看,标签的名称(实际上是任何引用;分支也是如此)被视为文件系统对象的名称,在存储库的 $GIT_DIR/refs 文件夹中创建。此对象存储标签附加到的哈希提交。

使用标签 foo,这很容易 - 文件 foo 是在 $GIT_DIR/refs 中创建的,没有什么特别值得怀疑的。

使用标签 foo/bar,但是,它有点复杂:现在创建了 文件夹 foo,只有一个文件 - bar(同样,使用哈希提交)。引用 the docs:

[reference names] can include slash / for hierarchical (directory) grouping

问题是,不可能有两个对象(文件和文件夹)同名。因此,如果您已经拥有 1.16.0 标签,您将无法使用 1.16.0/anything。一个明显的解决方案是将该初始标记转换为类似 1.16.0/0.0.1 的内容,然后继续您的原始意图。或者您可以将斜杠替换为 -_.