edit The question boils down to "Can git rebase
be instructed to rebase tags, too?" But an answer to the original question would also help.
Asking How to prepend the past to a git repository? I followed these instructions. <edit>Then I rebased to include a file that was only in the snapshots, see here.</edit> Since history was rewritten (by git filter-branch
or git rebase
or both?) all tags are still on the original time line* and I'd somehow like to move them to the new one. I think I made all commit-messages with tags unique so I could try writing a script that uses them, but a more general git move-tags <from> <to>
would be better.
So, is there a way to address "the commit which is N commits after on the new timeline such that the Nth commit after on the old timeline is tagged "? Any other solution except the obvious manual retagging would also be great.
(please feel free to correct that horribly long sentence into plain English...)
*) hey, git solved the grandfather-paradox!
I’ve written a script that does this.
$ 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
[...]
See gist.github.com/908381.
But even better, use the --tag-name-filter
option built into git-filter-branch(1).
There is no built in way to do what you want using git. 'git rebase --tags' might be interesting but it does not exist.
If the commit messages are identical as you say then you could go through each tag in refs/tags, do:
'git log -1 --pretty=oneline <tagname>'
Compare the commit message to the full list:
'git log --pretty=oneline <newbranches>'
If you find a match (and the SHA1 hash is different) then do:
'git tag --force <tagname> <new SHA1>'
According to Thomas Rast at http://git.661346.n2.nabble.com/Rebase-with-tags-td5582971.html:
Leonid Podolny wrote:
Is it possible, at least, to receive a set of (old commit, new commit)
pairs, so that I will write a little script that will do that for me?
The post-rewrite hook gets this list, so you can use that if you want
to.
There is a way to make git filter-branch
automatically update modified tags using the --tag-name-filter
option, as described in this answer.
I have put together my own python implementation, git rebasetags
In case the rebase is interactive, you will be presented with a bash shell where you can make the changes. Upon exiting that shell, the tags will be restored.
From this post