Subversionからgitに移行したときにやったことを書いてみます。ってもやったの2年くらい前なので、ちょっとあいまいな部分もあるかもしれませんが。

併用して試す


まず、gitの使い方が解っていないと話にならないので、gitを使用したことがある人がいない人はgit-svnで現在運用している実際のSubversionのリポジトリを使ってgitの操作を覚えます。私は4~5か月くらい併用してました。また、移行前に使えるようになっている人が何人かいると楽になる気もします。当時のチームは少人数だったので私一人のみ学習した段階で移行しました。また、4~5か月かけてますが、これは移行するタイミング(口実)がなかったのと、どちらかというと運用フローを決める方に時間が掛かっていました。

運用を考える


gitはSubversionほど運用が容易ではないので、どうやって運用するのか考えます。まあ、GitHub系のホスティングサービスを使用しない場合は大体はgit-flowがベースになるのではないかとおもいます。GitHub系のホスティングサービスを使用する場合でもしない場合でも、GitHubのOSSの運用の仕方は参考になるので、いろいろなリポジトリを見ながらブランチの切り方、マージの仕方等々を考えます。実際にやらないとわからない部分も出てくると思いますが、ある程度は決めておいた方がよいかと思います。実際の現在の現場の問題も絡んで簡単には運用フローが決まらないかもしれませんが、GitHubのリポジトリとかをみて根気よく頑張りましょう。

ちなみに、git-flowでそのまま運用しているところはたぶん無いような気がします。

移行するために段階的に準備する


実際に移行するときに下記はやっておいた方がよいかな?というものを書きます。
下記の作業はそれなりの労力を有するので時間をかけて実際に運用しているリポジトリで徐々に行います。チームメンバーが多いといろいろ難しいかもしれません。また作業時はメンバーへの周知徹底とバックアップは忘れずに。

不要ファイルを取り除く

gitで不要なファイルを履歴ごと取り除くのは容易ではありません。ので、Subversionの時点で取り除くようにしましょう。
svndumpfilterで除外したいファイルを除いた「dumpファイル」を出力します。基本はexportもとを指定し、どのファイルを除外していくかつらつら記述します。この時に使用したコマンドはやらかしたときのために残しておくことを進めます。

1
2
//いらないファイルをスペースで区切って記述します。下記だと「hoge.pdb」と「hoo.xls」
svnadmin dump リポジトリのパス | svndumpfilter exclude src/hoge.pdb document/hoo.xls > 出力先パス

オプションで下記のようなものが使えたりします。コミットログの状況とかを加味して使いましょう。

  • --drop-empty-revs : 空になったリビジョンを取り除く
  • --renumber-revs : 空になったリビジョンに番号を振りなおす

また、Exportもとでごちゃごちゃブランチとかきってた場合エラーがでて失敗するかもしれません。当時の開発では不要なブランチだったので削除したら上手くいったような気がします…だいぶ昔のことなので覚えてないです…

繰り返す

大体、不要なファイルが山ほどあると一回で取り除ききれないと思います。従って、loadとexportをひたすら繰り返して不要ファイルを取り除いていきます。

1
svnadmin load インポート先のリポジトリパス < dumpファイルのパス

新旧のリポジトリを入れ替えます。このときにhooks等の入替もわすれてはいけません。
これでキレイになるまで繰り返します。

コミットログをキレイにする

gitのGUIクライアントはコメントの1行目しか表示されないケースがおおいので、それにあわせたコミットコメントに修正します。この辺のコミットログもGitHubの有名OSSとかを参考にします(っても英語が多いですが)
Subversion側でTortoiseSVNであたりでやったほうが楽なのでgitの移行前にやったほうがいいでしょう。gitでコミットログを書き換えるのはファイルを履歴ごと削除するよりさらに困難です。後悔の無いように修正しましょう。

私はコミットログは大体、1行目にできるだけ詳細な内容を書いて書ききれないものは改行して記述するようにしています。

検証する


何事もそうですけど、いきなりエイやっでやってしまうのではなくて、本番でやってしまう前に一度確認しましょう。
おおよそ、RedmineなどのITSと連携しているのではないかと思いますので、gitに移行したものでも正常に使用できるかを確認します。なお、2年くらい前のgit 1.9.5の時はマルチバイト文字の扱いがイマイチで日本語を含むファイルもしくはディレクトリがあるとRedmineで上手く閲覧できないという問題がありました。この辺は今は解決されているのではないかと思います。ちなみに、当時は日本語のディレクトリはgit --filter-branchで全て履歴ごと置き換えて、日本語のファイルは全てExcelだったため、そのままあきらめました。

実際に移行する


後はgit-svnで移行して、各種連携しているアプリケーションの設定を変更すれば終わりです。
お疲れさまでした。