Git:是否有类似于每个分支标签的东西?

11

我需要进行一些历史重写,现在希望保留原始树。但是重写后的树应该复制之前使用的标签。除了在标签名前加上分支名称之外,是否有其他不那么手动的选项可供选择?

2个回答

20
不,Git中没有像分支标签那样的东西。所有的分支和标签都只是Git中的一种引用;引用只是指向修订历史中特定修订版本的名称。例如,如果你有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内的单独文件)。
因此,如果你想重写历史并保留旧标签,你将不得不重写标签名称。正如sehe所指出的那样,可以使用git filter-branch --tag-name-filter来完成这个任务。

@sehe:谢谢,这提醒我要改进这个脚本 - Tobias Kienzler

3

您可以将标签命名空间化为一个以您想要的分支命名的目录(有点像),而且这不必是手动的:

git-thisBranch() { git symbolic-ref --short HEAD; } 
git-localTag() { 
   local name="$1"; shift;
   git tag $(git-thisBranch)/"$name" "$@";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接