编辑问题归结为“也可以git rebase
指示重新标记代码吗?”但对原始问题的回答也会有所帮助。
问How to prepend the past to a git repository?我跟着these instructions。 < 编辑>然后我重新加入以包含仅在快照中的文件,请参阅here。< / edit >由于历史记录被重写(git filter-branch
或git rebase
或两者都有?)所有标签仍然在原始时间线上*我想以某种方式将它们移动到新的标签。我想我用标签制作了所有提交消息,所以我可以尝试编写一个使用它们的脚本,但更通用的git move-tags <from> <to>
会更好。
那么,有没有办法解决“在新时间轴之后N提交的提交,以便标记旧时间轴之后的第N次提交”?除了明显的手动重拍之外的任何其他解决方案也会很棒。
(请随意将这个可怕的长句纠正为简单的英语......)
*)嘿,git解决了祖父悖论!
答案 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
[...]
但更好的是,使用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后,将恢复标记。