9

我有一些历史重写要做,我想暂时保持我原来的树完好无损。然而,重写的树也应该复制以前使用的标签。有没有比在分支名称前添加标签名称更少的手动选项?

4

2 回答 2

18

不,在 git 中没有像 per-branch 标签这样的东西。所有的分支和标签都只是 Git 中的一种 refs;ref 只是一个名称,它指向修订历史中的特定修订。例如,如果您有develandmaster分支和v1.0andv2.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)。

因此,如果您想重写历史记录并保留旧标签,您将不得不重写您的标签名称。正如 sehe 指出的那样,这是使用git filter-branch --tag-name-filter.

于 2011-04-18T14:37:59.853 回答
2

您可以将标签命名到以您希望标签(种类)所属的分支命名的目录中,并且它不必是手动的:

git-thisBranch() { git symbolic-ref --short HEAD; } 
git-localTag() { 
   local name="$1"; shift;
   git tag $(git-thisBranch)/"$name" "$@";
}
于 2015-11-08T16:39:55.120 回答