我有一些历史改写要做,我现在想保持原始树的原封不动。然而,重写的树应该复制先前使用的标签。手动选项是否比例如使用分支名称前缀标记名称?
答案 0 :(得分:16)
不,git中没有像per-branch标签那样的东西。所有分支和标签都只是Git中的各种引用; ref只是一个指向修订历史记录中特定修订版的名称。例如,如果您有devel
和master
分支以及v1.0
和v2.0
标记,则引用将如下所示:
refs/heads/devel -> * / \ * * <- refs/heads/master | | * * \ / * <- refs/tags/v2.0 | * | * <- refs/tags/v1.0 | *
正如你所看到的,没有任何东西可以将这些标签绑在任何分支上;实际上,所有这些标记都包含在master
和devel
分支中。通过查看您的.git
仓库内部,您可以看到标签上的结构实际上没有那个;它只是一个包含引用.git/refs
内的提交的SHA-1或.git/packed-refs
中的一行的文件(标记通常位于packed-refs
中,因为它们不会经常更改,而分支通常是git/refs
)内的单独文件。
因此,如果要重写历史记录并保留旧标记,则必须重写标记名称。正如指出的那样,这是使用git filter-branch --tag-name-filter
完成的。
答案 1 :(得分:2)
您可以将标记命名为以您希望标记所属的分支命名的目录(种类),并且它不必是手动的:
git-thisBranch() { git symbolic-ref --short HEAD; }
git-localTag() {
local name="$1"; shift;
git tag $(git-thisBranch)/"$name" "$@";
}