北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

git-svn で branch -r -d してしまった

git-svn (git version 1.6.1)でプロジェクトを引っ張って来たらなんかブランチが大量に作られたので、ついカッとなって

git branch -r -d my_svn_branch

とかしてしまったら、元に戻せなくなった人のメモです。


CAUTION: 以下、他に正しい方法があるかもしれないので、試す人は自己責任で!*1

下準備

  • 消してしまったブランチ名を控える
  • 消してしまったブランチを作ったSVNのリビジョンを控える

復旧作業

  1. 「.git/svn/"ブランチ名"」のディレクトリを削除*2
  2. 「git svn fetch -r "SVN上でブランチを作ったリビジョン"」を実行(ブランチが再作成される)
  3. 「git svn rebase --all」を実行*3(最新状態になる)

簡単な説明

git-svnは .git/svn/ 以下に各ブランチとSVN上のリビジョンの対応を持ってるようです。よって、そのままでは再フェッチはできません。こいつを消せばリビジョンを再フェッチしてくれて、git上のブランチも再作成してくれるという原理です。

ただし、このディレクトリの構成はバージョンアップに伴って変わってるようなので、注意が必要です。

おまけ

git-svnってPerlで書かれてるんですね。まさかソース読む羽目になるとは。

*1:正しい方法知ってる方教えて下さい。。。

*2:バックアップを取ることをおすすめします

*3:checkoutして普通にrebaseでももちろんOK