代码之家  ›  专栏  ›  技术社区  ›  Ionuț G. Stan

Git,重写主分支和相关标记的历史记录

  •  5
  • Ionuț G. Stan  · 技术社区  · 17 年前

    我刚刚有了重写其中一个repo历史的第一次经验(使用git过滤器分支)。问题是,回购协议有几个标签,重写后,这些标签似乎与结果历史完全断开了连接。我认为这是因为与标签相关联的历史记录没有被重写,所以它们必须指向旧的提交。所以,我可以做些什么来“应用”新历史上的标签。一点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 回复  |  直到 9 年前
        1
  •  5
  •   VonC    17 年前

    看起来像是最后一步 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 重写所有分支和标记。

    它可能在新的历史上保持了标签的位置(但我还没有测试过它)。

        2
  •  3
  •   Community Mohan Dere    9 年前

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

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

        3
  •  1
  •   nachoparker    9 年前

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

    但是,如果您想进行交互式重新平衡,您还需要一些其他的东西。

    这两件事都可以用 git rebasetags

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

    enter image description here

    this post

    推荐文章