可以在git filter-branch和rebase之后自动移动标签吗?

时间:2010-06-30 15:22:01

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

编辑问题归结为“也可以git rebase指示重新标记代码吗?”但对原始问题的回答也会有所帮助。


How to prepend the past to a git repository?我跟着these instructions。 &lt; 编辑&gt;然后我重新加入以包含仅在快照中的文件,请参阅here。&lt; / edit &gt;由于历史记录被重写(git filter-branchgit rebase或两者都有?)所有标签仍然在原始时间线上*我想以某种方式将它们移动到新的标签。我想我用标签制作了所有提交消息,所以我可以尝试编写一个使用它们的脚本,但更通用的git move-tags <from> <to>会更好。

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

(请随意将这个可怕的长句纠正为简单的英语......)

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

5 个答案:

答案 0 :(得分:9)

我写了一个执行此操作的脚本。

$ 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 :(得分:3)

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

如果提交的消息与您说的相同,那么您可以浏览refs / tags中的每个标记,执行:

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

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

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

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

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

答案 2 :(得分:2)

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

  

Leonid Podolny写道:

     
    

至少可以接收一组(旧提交,新提交)     对,所以我会写一个小脚本,为我做那个?

  
     

post-rewrite hook获取此列表,因此您可以根据需要使用它   到。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

我已将自己的python实现放在一起,git rebasetags

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

enter image description here

来自this post