modified: 2016-03-10

ローカルのgit-svnからSVNリポジトリを復元する方法

SVNリポジトリを削除しちゃった/(x.x)\ナンテコッタ 以前のバックアップから復元はしたけどちょっと古い… そんなときに、git-svnでcloneしたローカルリポジトリがあればそこから復元できます。

参考) ローカルのgit-svnからSVNリポジトリを復元する方法 http://stackoverflow.com/questions/2710073/can-i-recover-lost-commits-in-a-svn-repository-using-a-local-tracking-git-svn-br

※注意 以前と同じコミットログで復元できるが、 コミッター、日時はすべて復元した時点のものにはなってしまう。

必要なもの

  • 復元した(とある時点の)SVNリポジトリ (/path/to/repos.svn)
  • 最新のソースがcommitされているgit-svn repo (/path/to/uptodate)

手順

  1. 復元した(古い)SVNリポジトリから適当な場所にcloneし直す

    $ pwd
    /home/hirose
    $ git svn clone -s --prefix svn/ /path/to/repos.svn recover
    $ cd recover
    $ git svn info | grep ^Revision
    Revision: 1246          ★r1246まで戻っている
    
  2. 作った新しいgit-svn repoに、今まで使用していた(最新のソースがcommitされている)git-svn repoを追加する

    $ git remote add -f uptodate /path/to/uptodate
    
  3. 元のgit-svn repoからmergeする

    A) merge する場合 ※この手順だと自分の場合コンフリクトが発生してよく分からなかったので未確認。

    $ git merge remotes/uptodate/master
    

    B) cherry-pick する場合

    $ git log --all
    ★復元の始点となるr1247のコミットハッシュを確認
    $ git cherry-pick d088555035adafe0546f7ab25d1d72543965cd5b^..remotes/uptodate/master
    

    cherry-pick のコミットハッシュの始点には「再適用する先頭のコミットハッシュ+^(ひとつ前)」を指定する。間違えると一部のコミットだけ復元できずに消える可能性があるので注意。

  4. SVNリポジトリにコミットする

    $ git svn dcommit
    

完了。

過去にcheckout済の作業フォルダはそのまま使えているようだ。 (checkoutし直した方が無難かも。)