git:是否有像分支标签这样的东西?

Tob*_*ler 8 tags git git-rebase tagname git-tag

我有一些历史改写要做,我现在想保持原始树完好无损.然而,重写的树应该复制先前使用的标签.是否有比使用分支名称添加标签名称更少的手动选项?

Bri*_*ell 16

不,没有像git中的per-branch标签.所有分支和标签都只是Git中的各种引用; ref只是一个指向修订历史记录中特定修订版的名称.举例来说,如果你有develmaster分支机构,并v1.0v2.0标签,引用会是这个样子:

refs/heads/devel ->  *
                    / \
                   *   * <- refs/heads/master
                   |   |
                   *   *
                    \ /
                     * <- refs/tags/v2.0
                     |
                     *
                     |
                     * <- refs/tags/v1.0
                     |
                     *

正如你所看到的,没有任何东西将这些标签绑在任何分支上; 事实上,所有这些标签都包含在masterdevel分支中.通过查看您的.git仓库内部,您可以看到标签上的结构实际上没有那个; 它只是一个包含引用提交的SHA-1的文件.git/refs,或者是一行.git/packed-refs(标签经常出现,packed-refs因为它们不经常更改,而分支通常是单独的文件git/refs).

因此,如果要重写历史记录并保留旧标记,则必须重写标记名称.正如指出的那样,这是使用完成的git filter-branch --tag-name-filter.

  • ...然后用`git filter-branch ..... --tag-name-filter cat`完成 (2认同)