2009-07-16 118 views
5

我刚刚第一次使用我的repos(使用git-filter-branch)重写历史记录。问题是,回购有几个标签,重写后似乎完全脱离了结果历史。我认为这是由于与标签相关的历史没有被重写,所以他们必须指向旧的提交。那么,我能做些什么来在新的历史上“应用”标签。小ASCII艺术,也许更容易理解我的问题:Git,重写主分支和相关标签的历史记录

原始回购:历史重写后gitk --all报道

+ HEAD 
| 
| 
+ TAG 0.2.0 
| 
| 
+ TAG 0.1.0 
| 
| 
+ Initial commit 

回购结构:

+ HEAD 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    + Initial commit 
+ HEAD 
| 
| 
+ TAG 0.2.0 
| 
| 
+ TAG 0.1.0 
| 
| 
+ Initial commit 

回答

5

样子最后一步procedure described here

$ git log --pretty=oneline origin/releases | 
    sed -n -e '/^\([0-9a-f]\{40\}\) Tag\(release\)\? \(.*\)/s--\3|\1|Tag release \3-p' 
    > ~/paludis-git-tags 

$ while read name msg head ; do 
    git tag -m "${msg}" ${name} ${head} ; 
    done < paludis-git-tags 

这个想法是从旧版本的存储库中读取标签,以便将它们重新应用于新的历史记录。


注意:您原来使用git的过滤分支的,你使用:

-- --all 

--将过滤分支选项与修订选项分开,并且--all重写所有分支和标记。

它可能保存在标签就位在新的历史记录(我没有测试它尚未虽然)

+0

感谢VonC,我错过了' - --all'一部分。幸运的是我有一个存储库的备份,并用'--all'选项再次尝试,它按我的意愿工作。 – 2009-07-16 18:10:10

3

首先,你必须重写标签太,例如(如VonC said)通过使用--all选项来重写所有引用。

如果您有带注释的标签(重磅标签),您还必须使用--tag-name-filter选项,例如,如--tag-name-filter cat。请注意,您不能重写已签名的标签!

+0

谢谢Jakub,我不知道有关带注释和签名的标签。有用的信息。再次感谢。 – 2009-07-16 20:56:46

1

如果您想执行可以使用git filter-branch完成的更改,那么您可以使用--tag-name-filter,如上所述。

如果你想做交互式重新装订,你需要别的东西。

东西都可以用git rebasetags

如果底垫是互动来完成,您将看到一个bash shell中,您可以进行更改呈现。退出该shell后,标签将被恢复。

enter image description here

this post

相关问题