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

16

编辑 问题归结为“git rebase是否可以指示重建标签?”但回答原始问题也会有所帮助。


在询问如何将过去添加到git存储库中?后,我按照这些指示进行了操作。<编辑> 然后我执行了重新基础操作以包括仅在快照中的文件,请参见此处。</编辑> 因为历史记录被重写(由git filter-branchgit rebase或两者都有?),所有标记仍然在原始时间轴上*,而我希望将它们移动到新的时间轴上。我认为我使用标记制作了所有提交消息,因此我可以尝试编写一个使用它们的脚本,但是一个更通用的git move-tags <from> <to>命令会更好。

那么,有没有一种方法来解决“在新时间轴上距离第N个提交的提交是已标记的,以便在旧时间轴上的第N个提交也被标记”这个问题?除了显而易见的手动重新打标签外,任何其他解决方案都非常好。

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

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


2
标题是“rebase”,但正文谈论的是“filter-branch”,你两者都做了吗(如此处所示)?通过使用--tag-name-filter,filter-branch可以重写标签,但如果涉及到后续的rebase,则无济于事。 - Chris Johnsen
1
@Chris 抱歉,我已经修复了。是的,在嫁接+过滤分支之后,我使用了 git rebase。后者之后标签没问题,我应该记得重新基于一个分离的分支,保留原始标签。所以基本问题是“能否指示 git rebase 也重新基于标签?” - Tobias Kienzler
5个回答

10
我已经写了一个脚本来实现这个功能。
$ 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 的优势很有帮助 :) - Tobias Kienzler
脚本是否还会转移注释旧标签的消息? - imz -- Ivan Zakharyaschev

3

有一种方法可以使用--tag-name-filter选项自动更新修改过的标签,使git filter-branch更加智能化,具体方法请参见此答案


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
根据http://git.661346.n2.nabble.com/Rebase-with-tags-td5582971.html上的Thomas Rast所说:

Leonid Podolny写道:

是否可能至少接收一组(旧提交,新提交)对,以便我编写一个小脚本来为我完成这项工作?

后重写钩子会收到此列表,因此如果您愿意,可以使用它。


有趣,下次尝试这样的rebase时我会试一试。谢谢! - Tobias Kienzler

2
我已经编写了自己的Python实现,名为git rebasetags
如果重新设置基础是交互式的,会出现一个Bash shell,您可以在其中进行更改。退出该shell后,标签将被恢复。

enter image description here

这篇帖子中:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接