どうしてもVSSを使わなければならない人のためのDVCS入門

まあVSSもそんなに悪いツールではないです。少なくとも90年代当時としては。悪いのは未だにVSSから離れようとしない連中の方ですよもう勘弁してください。

うちの会社はプロジェクトごとにバージョン管理の仕方はばらばらなんですが、他所のプロジェクトの手伝いに行ったりすると、ごくたまにVSSを使わなければならないことになったりします。そういう時に、クライアントにBazaarを使って少しは楽をしようとしたときのメモです。

前提

VSSにも一応マルチチェックアウトの機能はありますが、それが有効になっていることはまず無いです。あえてVSSを使おうという人たちはたいてい「同じファイルを同時に触るのは危険」だと思い込んでるので。

作業フロー

VSSワークスペースの構築
  • VSSのデータベースから、「最新のバージョンを取得」でソース一式を作業ディレクトリにダウンロードします。
  • その作業ディレクトリを、そのままBazaarのブランチにします。

$ bzr init VSS_WORKDIR

  • 適当に無視ファイルの設定をして(少なくとも、*sccは無視する設定にしましょう)、ファイルをまとめてBazaarの管理対象に追加します。

$ bzr ignore "*scc"
$ bzr ignore "*.obj"
$ bzr ignore "*.user"
・・・
$ bzr add
$ bzr commit -m "新規登録"

Bazaarワークスペースの構築
  • VSS_WORKDIRから、作業用のブランチを切ります。

$ bzr branch VSS_WORKDIR BZR_WORKDIR

  • 開発は、こっちのブランチ上で行います。好きなタイミングでコミットしてOKです。
  • ただし、ファイルの移動や変名、削除はしないようにした方がいいでしょう。
VSSから最新のコードを取り込む

VSSから最新のコードを取り込むには、以下のようにします。

  • VSSで、「最新のバージョンを取得」を実行します。
  • 変更内容を、Bazaarのブランチに反映します。

# statusコマンドで変更内容を確認。
# 特に、バージョン管理外のファイルがないかをチェックする

$ bzr status
# バージョン管理外のファイルがあったら、そのファイルを追加
$ bzr add XXXXX
# コミット
$ bzr commit -m "VSSから最新のコードを取得"

  • 変更内容を、BZR_WORKDIRに反映します。

$ cd ../BZR_WORKDIR
$ bzr merge ../VSS_WORKDIR
$ bzr commit -m "VSSから最新のコードを取得"
上記のやり方は単純なので、スクリプトを組めば自動化できます。ただ、ひとつ問題があって、VSS側でファイルの削除や移動があった場合に、それを正しく拾うことができません。
VSSでファイルの削除や移動をすることはそんなに無いと思うので、そこは特に自動化はせずに、bzr statusの出力内容から見当をつけて手作業でBazaarに反映してました。

自分が行った変更をBazaarに反映する
  • 上記の方法で、VSS_WORKDIRブランチをまず最新化します。
  • VSSに反映しなければならないファイルをリストアップします。

$ cd BZR_WORKDIR
$ bzr log -r submit:..-1

  • リストアップされたファイルを、全てVSSからチェックアウトします。もし、チェックアウトできないファイルがあったら、すべてのファイルがチェックアウトできるようになるまで待ちます。
  • BZR_WORKDIRの変更を、VSS_WORKDIRに反映します。

$ cd VSS_WORKDIR
$ bzr merge ..\BZR_WORKDIR
# まだコミットはしません

  • 変更されたファイルを、VSSにチェックイン、または追加します。
  • 変更されたファイルを、コミットします。

$ bzr commit -m "BZR_WORKDIRから○○の変更をマージ"

  • チェックインの結果を、BZR_WORKDIR側にも反映します。

$ cd ../BZR_WORKDIR
$ bzr merge ../VSS_WORKDIR
$ bzr commit -m "チェックイン結果をフィードバック"
チェックインしてからコミットするようにしているのは、ソースコード中に$Id$などのキーワードが埋め込まれている場合に、チェックインすることによってソースコードが変更される可能性があるからです。
最後にVSS_WORKDIRからBZR_WORKDIRへのマージを実行しているのも、同じ理由からですね。

上記のような流れを基本として、Pythonで適当にスクリプトを作って自動化してあれこれやってました。
スクリプト自体は、プロジェクトから離れるときに「二度とこんなことをしなくてよくなりますように」との願いを込めて供養したので手元には残っていませんがw

まとめ

VSSなんて使わずにすめばそれにこしたことは無いです。
全てのVSSプロジェクトを生まれる前に消し去りたい。