git-svnから持ってきたリポジトリのタグをふつうのブランチにする

追記^2 : Pro Gitではファイルをコピーする手順を挙げている
http://progit.org/book/ch8-2.html
追記 : 下の手順よりも、ちゃんとgit branchの出力から生成したほうが確実なようだ。

  1. (git svnしてくる)
  2. git branch -rv --no-abbrev > tmp
  3. awk '{ system("git branch " $1 " " $2) }' tmp

勘所としては、

  • gitはgcとかその他明示的な削除操作を行わない限りはリポジトリに入れた内容を忘れることはない
  • しかし、ブランチとして見えている変更から到達可能でない変更は消えてしまうかも知れない。一般的な感覚のGCと同様に、gitにはオブジェクトの到達可能性の概念が有る。
  • ブランチとかタグは、単にコミットに名前を付けただけ。git branch -vとかで出てくる数値の羅列(= オブジェクト)が本名であり、それを使ってcheckoutしたり、そこを起点にbranchしたりすることもできる。

以前の内容

git svnを使うと、SVNリポジトリをgitリポジトリに変換することができる。しかし、そのままではブランチやタグ類がリモートブランチなので、他のサイトやcgitのようなツールと連携するにはちょっとした不便がある。
というわけで、(git branch -rで見える)リモートブランチを全部(git branchで見える)ふつうのブランチに変換したくなる。これを効率よく行う正当な方法は無いように思えるが、無理矢理実現することは一応できる。

  1. (git svnリポジトリを作る)
  2. for remote in `git branch -r `; do git branch --track $remote; done *1
  3. cd .git/refs
  4. rm -rf heads
  5. cp -r remotes heads

これで、ローカルのブランチがすべて削除されてリモートブランチがローカルブランチになる。あとはtrunkをcheckoutしてmasterブランチを適当に作る。

もっと健全な方法が有るかもしれない。