2011-04-18 152 views

回答

14

不,没有什么像git中的每分支标记。所有分支和标签都只是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内的单独文件)。

所以,如果你想重写历史,并保留旧的标签,你将不得不重写你的标签名称。正如sehe指出的,这是通过使用git filter-branch --tag-name-filter完成的。

+2

......然后将其用'git filter-branch ..... --tag-name-filter cat'完成# – sehe 2011-04-18 14:41:45

+0

@sehe:谢谢,这让我想起改进[这个脚本](http://stackoverflow.com/questions/4278264/git -split-历史的几家,文件,到-A-独立的分支/ 4283970#4283970) – 2011-04-18 14:55:45

1

您可以命名空间的标签变成你想要的标签(种)的分支命名的目录属于,而且不必进行手动:

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