我有一些历史重写要做,我想暂时保持我原来的树完好无损。然而,重写的树也应该复制以前使用的标签。有没有比在分支名称前添加标签名称更少的手动选项?
问问题
4453 次
2 回答
18
不,在 git 中没有像 per-branch 标签这样的东西。所有的分支和标签都只是 Git 中的一种 refs;ref 只是一个名称,它指向修订历史中的特定修订。例如,如果您有devel
andmaster
分支和v1.0
andv2.0
标记,则引用将如下所示:
refs/heads/devel -> * / \ * * <- refs/heads/master | | * * \ / * <- refs/tags/v2.0 | * | * <- refs/tags/v1.0 | *
如您所见,没有任何东西将这些标签绑定到任何分支。事实上,所有这些标签都包含在master
和devel
分支中。通过查看您的.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 回答