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

时间:2011-04-18 12:58:28

标签: git tags git-rebase tagname git-tag

我有一些历史改写要做,我现在想保持原始树的原封不动。然而,重写的树应该复制先前使用的标签。手动选项是否比例如使用分支名称前缀标记名称?

2 个答案:

答案 0 :(得分: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仓库内部,您可以看到标签上的结构实际上没有那个;它只是一个包含引用.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" "$@";
}