【问题标题】:Can tags be automatically moved after a git filter-branch and rebase?标签可以在 git filter-branch 和 rebase 之后自动移动吗?
【发布时间】:2011-03-10 04:55:01
【问题描述】:

edit 问题归结为“是否也可以指示git rebase 重新设置标签?”但对原始问题的回答也会有所帮助。


How to prepend the past to a git repository? 我关注了these instructions。 编辑>然后我重新定位以包含仅在快照中的文件,请参阅here。/edit> 因为历史被重写(git filter-branchgit rebase 或两者兼而有之?)所有标签仍在原始时间线上*,我想以某种方式将它们移至新的。我想我使所有带有标签的提交消息都是唯一的,因此我可以尝试编写一个使用它们的脚本,但更通用的git move-tags <from> <to> 会更好。

那么,有没有办法解决“在新时间线上的 N 次提交之后的提交,以便标记旧时间线上的第 N 次提交”?除了明显的手动重新标记之外的任何其他解决方案也很好。

(请随意将那个可怕的长句子改成简单的英语......)

*) 嘿,git 解决了祖父悖论!

【问题讨论】:

  • 标题上写着“rebase”,但是正文却谈到了“filter-branch”,你两个都做了吗(如here暗示的那样)?使用--tag-name-filter,filter-branch 可以重写标签,但是如果涉及到后续的 rebase,这将无济于事。
  • @Chris 抱歉,我解决了这个问题。是的,我在graft+filter-branch 之后使用了git rebase。后者之后的标签很好,我应该记得变基创建一个单独的分支,使原始标签保持不变。所以基本问题是“可以指示git rebase 也重新设置标签吗?”

标签: git history tags git-rebase git-filter-branch


【解决方案1】:

我已经整理了我自己的 python 实现,git rebasetags

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

来自this post

【讨论】:

    【解决方案2】:

    我已经写了一个脚本来做这个。

    $ git-rebase-tags master
    Rebasing 107 tags onto 'master'
    Can't rebase tag 'staging-deploy-01' because there are no identical commits on 'master'
    Pointed tag 'v0.0.11' at commit 81e16f2ca1bc7802547bf19c1dba1a68212eafff
    Pointed tag 'v0.0.12' at commit 17051cc28084dd56ae56e96767bceee46217c02d
    Pointed tag 'v0.0.13' at commit 5d795076ba4b33f81d327dcf9bff727cef7771a2
    [...]
    

    gist.github.com/908381

    但更好的是,使用 git-filter-branch(1) 中内置的 --tag-name-filter 选项。

    【讨论】:

    • +1 谢谢,这个脚本很适合我了解 ruby​​ 的优点 :)
    • 脚本是否也会传输注释旧标签的消息?
    【解决方案3】:

    有一种方法可以使git filter-branch 使用--tag-name-filter 选项自动更新修改后的标签,如in this answer 所述。

    【讨论】:

      【解决方案4】:

      没有内置的方法可以使用 git 做你想做的事。 'git rebase --tags' 可能很有趣,但它不存在。

      如果提交消息和你说的一样,那么你可以遍历 refs/tags 中的每个标签,这样做:

      'git log -1 --pretty=oneline <tagname>'
      

      将提交消息与完整列表进行比较:

      'git log --pretty=oneline <newbranches>'
      

      如果您找到匹配项(并且 SHA1 哈希值不同),则执行以下操作:

      'git tag --force <tagname> <new SHA1>'
      

      【讨论】:

        【解决方案5】:

        http://git.661346.n2.nabble.com/Rebase-with-tags-td5582971.html 的 Thomas Rast 说:

        Leonid Podolny 写道:

        是否有可能,至少,接收一组(旧提交,新提交) 对,这样我就可以写一个小脚本来为我做这件事?

        重写后挂钩获取此列表,因此您可以根据需要使用它 到。

        【讨论】:

        • 有趣,下次我尝试这样的变基时,我会试一试。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-26
        • 2016-01-07
        • 1970-01-01
        • 2018-10-18
        • 2011-12-01
        • 2017-12-05
        • 2014-08-18
        相关资源
        最近更新 更多