LAN内のSubversionで管理されているソースをGitでなんとかしたい(その1)

ソース管理のためのSubversionのサーバーを自社内に持つクライアントと仕事をしたことがあります。SubversionのサーバーはLANにあるので社外からのアクセスは許されていません。この仕事は常駐ではなかったのでSubversionのサーバーに直接アクセスすることはできませんでした。

ソースコードを共有するために最初にこんなことを考えていました。

  • Dailyでソース一式をFTP共有する
  • Weeklyでソース一式をFTP共有する
  • Weeklyで訪問してソースをupdateする

これらの方法は面倒が多いし履歴や差分を見ることもできません。次のような方法を取ることにしました。

Bitbucketのプライベートリポジトリを使ってクライアントLAN外からアクセスできるようにする

前提ですが、CFlatではbitbucketでGitのプライベートリポジトリを使っています。というわけで、このプロジェクト用のプライベートリポジトリを1つ用意しました。

まず、クライアントのLAN内に常時稼働しているマシンを用意します。マシンAとしましょう。こいつが要です。

ところでGitにはSubversionと連携する機能があります。ソース管理のサーバーはSubversionでも、自分の手元ではGitリポジトリとしてcloneできます。これがめちゃくちゃ便利です。サーバーがダウンしていようが、外出先であろうが、ログや差分の閲覧・コミットまでできます。手元にあるのはGitだから当然です。

話をマシンAに戻します。マシンAでGitのSubversion連携を使ってプロジェクトのソースをGitとして取得してやります。こんな感じです。

$ git svn clone svn://repourl/trunk

プロジェクトの規模によっては時間がかかるかもしれません。なにせ全てのリビジョンを手元に持ってきているわけなので。
次にこのリポジトリにremoteを教えてあげます。こんな感じで、いつもの通りです。originだと意味が違う気がするのでonlineとでもしておきます。

$ git remote add online https://username@bitbucket.org/username/project.git

あとは、手元のGitリポジトリをremoteにpushしてあげればOKです。

$ git push origin online

これでLAN内にいなくても履歴を含めたソースに触ることができるようになりました。

あとは定期的に更新してあげるだけです。マシンAはWindowsでしたのでWindowsのタスクスケジューラを使いました。定期的にバッチファイルを実行するわけです。
やりたいことは、1)Subversionの最新の状態をマシンAに反映し、2)マシンAの状態をbitbucketのリポジトリへ反映するということです。バッチには次のコマンドを書いておきました。

1)$ git svn rebase
2)$ git push origin online

図にするとこんな感じです。


開発準備

この時点でBitbucketのプライベートリポジトリにソースが入っています。あとはもう超簡単です。いつものようにcloneしましょう。

$ git clone https://username@bitbucket.org/username/project.git

注意した点は、masterブランチは変更してはならないということです。日々Subversionの変更分がマシンAからpushされてきます。こちらでmasterブランチに変更を加えてうっかりpushしてしまうと、マシンAがpushしようとしたときに「別の変更があるよ」となってしまいます。当たり前ですよね。

masterを変更しないためにも常に別のブランチでコーディング・コミットを行うのがポイントです。

思ったより長くなったのでその2に続きます。