Com base em algumas das outras respostas a esta pergunta, eu vim com um script Ruby que lida com a realocação de git-svn. Você pode encontrá-lo em https://gist.github.com/henderea/6e779b66be3580c9a584 .
Ele lida com a realocação sem fazer check-out de outra cópia, e ainda lida com o caso em que há alterações não enviadas em um ou mais branches (já que isso quebra a lógica regular). Ele usa coisas da resposta do git filter-branch (para a lógica principal) e a resposta sobre a cópia de branches de uma instância do repo para outra (para copiar branches com alterações não enviadas).
Tenho usado isso para realocar um monte de repositórios git-svn que tenho para trabalhar, e esta versão do script (já passei por inúmeras iterações) parece funcionar para mim. Não é muito rápido, mas parece lidar com todos os casos que encontrei e resultar em um repositório totalmente realocado.
O script oferece a opção de criar uma cópia do repo antes de fazer qualquer alteração, portanto, você pode usar essa opção para criar um backup. A criação de uma cópia é necessária se você tiver alterações não enviadas em qualquer branch.
O script não usa gemas ou outras bibliotecas não incluídas na instalação normal do MRI Ruby. Ele usa as bibliotecas readline e fileutils incluídas no MRI.
Espero que meu script seja útil para outra pessoa. Sinta-se à vontade para fazer alterações no script.
NOTA: Eu apenas testei este script com git 2.3.0 / 2.3.1 e Ruby 2.2.0 no OS X 10.10 Yosemite (já que é o ambiente que uso), mas espero que funcione em outros ambientes também. Não há garantias sobre o Windows, no entanto.