git-svnを順調に使っていたけれど
- 間違って手元のレポジトリ消しちゃった!
- 別のマシンからもgit-svnしたい!
というような「remoteのgitレポジトリとsvnレポジトリは残っているが、手元のgitレポジトリとsvnレポジトリが紐付いてない」という状況がたまに発生します。
その場合、試行錯誤の上、以下の条件の場合には復帰できました。
- remoteのgitレポジトリは残っている
- --no-metadataせず、gitのコミットログにgit-svn-idが登録されている(必須ではないかも?)
方法は
- とりあえず、まず
git clone [remoteレポジトリ]
で普通にremoteを取ってきます(originとします)。 - originに最後に残っているsvnのコミットリビジョンをgit-svn-idから確認します(r1234とします)。このgitコミットのSHA-1ハッシュはabcdefとします。
- .git/configを適当なテキストエディタで直接編集して、svnを追加します(※1)。
- とりあえず適当なリビジョンをsvn fetchします。
git svn fetch -r1234:1234
- remotes/git-svnがブランチに追加されていますが、このままだとツリー上は既存のもの(master)とは別と解釈されてしまいます。そこで、.git/refs/remotes/svnを直接編集して、無理やり2で確認したmasterの最終コミット(abcdef)に変更します。
- .git/svnを無理やり消してしまって、先のgit svn fetchをなかったことにします。
- 今度はHEADまで再度
git svn fetch -r1235:HEAD
すると、r1234の次のr1235からHEADまでのsvnコミットが、masterの後ろにフェッチできます。 -
git reset --hard git-svn
すれば、あとは普通にgit-svn出来る環境になります。
※1は例えばこんな感じです
[svn-remote "svn"]
url = https://example.com/svn/trunk
fetch = :refs/remotes/git-svn
// [余談] ↑みたいな複数行は脚注にもできないんですね・・・なんとかならないもんでしょうか(パーサーの問題だと思うけど)
また相変わらず無理矢理感ありますが、他にいい方法ご存知のかた教えて下さい。