LoginSignup
7
8

More than 5 years have passed since last update.

git-svnで途中から繋ぎ直す

Last updated at Posted at 2015-04-27

git-svnを順調に使っていたけれど

  • 間違って手元のレポジトリ消しちゃった!
  • 別のマシンからもgit-svnしたい!

というような「remoteのgitレポジトリとsvnレポジトリは残っているが、手元のgitレポジトリとsvnレポジトリが紐付いてない」という状況がたまに発生します。

その場合、試行錯誤の上、以下の条件の場合には復帰できました。

  • remoteのgitレポジトリは残っている
  • --no-metadataせず、gitのコミットログにgit-svn-idが登録されている(必須ではないかも?)

方法は

  1. とりあえず、まずgit clone [remoteレポジトリ]で普通にremoteを取ってきます(originとします)。
  2. originに最後に残っているsvnのコミットリビジョンをgit-svn-idから確認します(r1234とします)。このgitコミットのSHA-1ハッシュはabcdefとします。
  3. .git/configを適当なテキストエディタで直接編集して、svnを追加します(※1)。
  4. とりあえず適当なリビジョンをsvn fetchします。git svn fetch -r1234:1234
  5. remotes/git-svnがブランチに追加されていますが、このままだとツリー上は既存のもの(master)とは別と解釈されてしまいます。そこで、.git/refs/remotes/svnを直接編集して、無理やり2で確認したmasterの最終コミット(abcdef)に変更します。
  6. .git/svnを無理やり消してしまって、先のgit svn fetchをなかったことにします。
  7. 今度はHEADまで再度git svn fetch -r1235:HEADすると、r1234の次のr1235からHEADまでのsvnコミットが、masterの後ろにフェッチできます。
  8. git reset --hard git-svnすれば、あとは普通にgit-svn出来る環境になります。

※1は例えばこんな感じです

[svn-remote "svn"]
    url = https://example.com/svn/trunk
    fetch = :refs/remotes/git-svn

// [余談] ↑みたいな複数行は脚注にもできないんですね・・・なんとかならないもんでしょうか(パーサーの問題だと思うけど)

また相変わらず無理矢理感ありますが、他にいい方法ご存知のかた教えて下さい。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8