15

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


询问如何将过去添加到 git 存储库?我按照这些说明进行操作。<编辑>然后我重新定位以包含仅在快照中的文件,请参见此处。< /编辑> 由于历史被重写(由git filter-branchgit rebase两者?)所有标签仍然在原始时间线上*,我会以某种方式喜欢把他们搬到新的。我想我使所有带有标签的提交消息都是唯一的,所以我可以尝试编写一个使用它们的脚本,但更通用的git move-tags <from> <to>会更好。

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

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

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

4

5 回答 5

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

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

于 2011-04-07T18:33:31.093 回答
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>'
于 2010-07-01T13:10:31.163 回答
2

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

列昂尼德·波多尔尼写道:

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

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

于 2012-03-12T13:00:08.063 回答
2

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

于 2015-06-11T20:33:52.063 回答
2

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

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

在此处输入图像描述

这个帖子

于 2017-08-16T08:57:30.817 回答