Git,重写master分支和相关标签的历史

时间:2009-07-16 17:06:13

标签: git tags history rewrite

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

原始回购:

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

历史记录重写后gitk --all报告的回购结构:

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

3 个答案:

答案 0 :(得分: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-filter-branch时,你是否使用了:

-- --all

  

将过滤器分支选项与修订选项分开的--,以及--all以重写所有分支和标签。

它可能已将标记保留在新历史记录中(我还没有测试过它)

答案 1 :(得分:2)

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

如果您有带注释的标签(重量级标签),您还必须使用--tag-name-filter选项,例如为--tag-name-filter cat。请注意,您无法重写签名标签!

答案 2 :(得分:1)

如果您要执行可以使用git filter-branch执行的更改,则可以使用--tag-name-filter,如上所述。

如果你想进行互动式变基,你还需要别的东西。

这两件事都可以通过git rebasetags

来完成

如果rebase是交互式的,您将看到一个bash shell,您可以在其中进行更改。退出该shell后,将恢复标记。

enter image description here

来自this post