LAN内のSubversionで管理されているソースをGitでなんとかしたい(その1)
ソース管理のためのSubversionのサーバーを自社内に持つクライアントと仕事をしたことがあります。SubversionのサーバーはLANにあるので社外からのアクセスは許されていません。この仕事は常駐ではなかったのでSubversionのサーバーに直接アクセスすることはできませんでした。
ソースコードを共有するために最初にこんなことを考えていました。
これらの方法は面倒が多いし履歴や差分を見ることもできません。次のような方法を取ることにしました。
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に続きます。