git svn switch --relocate 的なことをする (patch利用)
http://d.hatena.ne.jp/do_aki/20110530/1306751266
↑で紹介されているような .git/config を書き換える方法が使えない場合の話です。
(旧svnリポんジトリが時すでに削除済み とか)
新gitワーキングツリーに手動でブランチを移植する感じでがんばります。
全体の流れ
- 旧gitワーキングツリーで対象ブランチのパッチ作成
- 新gitワーキングツリーで対応するブランチ作成
- 新gitワーキングツリーのブランチでパッチ適用
旧gitワーキングツリーで対象ブランチのパッチ作成
こんな感じの状態だとします
$ tree . |-- patch #パッチ置き場 |-- new_gitrepo #新git-svnワーキングツリー `-- old_gitrepo #旧git-svnワーキングツリー
旧リポジトリで移植したいブランチを確認します。
ブランチの派生元となるmasterのコミット
と
移植したいブランチの最新コミット
を確認。
$ cd ~/old_gitrepo $ git log --oneline --decorate --all --graph * d456789 (br2) 修正bar | * c345678 (br1) 修正foo |/ * b234567 (HEAD, git-svn, master) 修正fuga * a123456 修正hoge ・・・
パッチを生成します
git format-patch 取得範囲自..取得範囲至 -o パッチ保存ディレクトリ
$ git format-patch b234567..c345678 -o ~/patches/br1 $ git format-patch b234567..d456789 -o ~/patches/br2
新gitワーキングツリーにブランチを作ってパッチ適用
ブランチ作成してパッチ適用
$ cd ~/new_gitrepo $ git checkout -b br1 $ git apply ~/patches/br1/* $ git ci -m "修正foo"
もう一つのブランチも同様に
masterからブランチ作る
$ git checkout master $ git checkout -b br2 $ git apply ~/patches/br2/* $ git ci -m "修正bar"
以上。
パッチのメッセージがメール用にエンコードされたままっぽかったので、git am とせずに apply でコミットメッセージを改めて設定しています。
というか旧ワーキングツリーのブランチの個々のコミットの情報は失われてひとまとめになっちゃいますね。