> *initial:*
> ```
> refs/tags/my-tag -> TagA -> TagB -> TagC -> GitObject (either a Blob, Tree or a Commit)
> ```
> *expected output:*
> ```
> refs/original/tags/my-tag -> TagC -> GitObject (either a Blob, Tree or a Commit)
> or
> refs/original/tags/my-tag -> TagA -> GitObject (either a Blob, Tree or a Commit)
> or
> refs/original/tags/my-tag -> GitObject (either a Blob, Tree or a Commit)
> ```

My gut feeling is that `refs/original/tags/my-tag` should now point to `refs/original/tags/TagA` – the tag-chain rewriting should act a lot more like the commit rewriting than it currently does. I'll add this case to the tests, but it may already work.

> *initial:*
> ```
> refs/tags/my-tag -> TagA (name: test) -> TagB (name: v0.0.1) -> TagC (name: another) -> GitObject (either a Blob, Tree or a Commit)
> ```
> *expected output:*
> ```
> refs/original/tags/my-tag -> TagA (name: test) -> TagB (name: v0.0.1rc) -> TagC (name: another) -> GitObject (either a Blob, Tree or a Commit)
> ```

This one probably already works. Whatever the result of the name callback, the code records the before and after states of every rewritten tag in `tagMap`. So when rewriting `TagA`, the code notices that it's pointing to a `TagAnnotation`. It tries to rewrite the target tag `TagB` first (using a cached result if that's already done), and creates a new `TagA` that points to `TagB`'s annotation.