VSSから分散型バージョン管理システムに移行するための another way

この記事は最終更新日から5年以上が経過しています。

今更ながら、10年以上使用してきたバージョン管理システムMicrosoft Visual Source Safeをようやく卒業し、分散型バージョン管理システムGitに移行しました。
この際に使用した移行ツールvss2git.rbを紹介します。

初めに

移行に際しては、まず初めに、巷で評判の良さそうな移行ツールvss2git.exeを検討しました。vss2git.exeはWindows GUIアプリケーションで、使用方法も簡単、vss2git.exeを使った移行記事もインターネットにたくさん公開されています。一般的には、たぶんこれが一番のおすすめツールなんだと思います。

しかし私の環境では、10個程度のVSSリポジトリのうち、どうしても特定のリポジトリで変換エラーが発生してしまいました。VSSリポジトリの修復、VSSのバージョン変更、vss2git.exeソースファイルの解析、他の移行ツールvss2svn.plの検討、などなどしているうちに、結局自分で作ってしまった方が早いという結論に達し、移行ツールvss2git.rbを作成しました。

もし私と同じようにお悩みの方がいらっしゃいましたら、vss2git.rbをお試しください。
なお、ツールの品質には十分注意を払っているつもりですが、不測の事態に備え、ツール使用前には、変換元のVSSリポジトリや、PC上の重要なファイルをバックアップしてからご使用ください。

vss2git.rbで何ができるの?

vss2git.exeと機能的にはほとんど変わらないと思います。

  • VSSリポジトリを、分散型バージョン管理システムGit, Mercurial, Bazaarリポジトリに変換する
  • 日本語のコメントを正しく変換できる
  • 近接したチェックイン、同一のチェックインコメントを持つ履歴は、同一コミットにまとめられる(vss2git.exeのアイディア)
  • VSSサブプロジェクトを指定した変換も可能
  • ターゲットバージョン管理システムで使用するユーザメールアドレス生成のため、E-mail domainが指定可能
  • JSONフォーマットで、VSSユーザIDと、ターゲットバージョン管理システムで使用するユーザID、E-mailアドレスのペアを定義しておき、マイグレーション時にユーザIDの変換が可能
  • VSSのTagを元に、ターゲットバージョン管理システムでA successful Git branching modelへの変換が可能
  • タイムゾーン指定が可能
  • VSSの継続的ミラーリング(差分更新)が可能

ライセンス

MITライセンスに従います。詳細はGitHubのLICENSE.txtを参照ください。

必要なもの

vss2git.rbの実行には以下が必要です。

Microsoft Windows オペレーティングシステム

  • Windows 7 or
  • Windows XP or
  • Windows 8, VISTA … 未確認ですが、たぶんOK

Microsoft Visual Source Safe

  • VSS 2005 … 言語設定をEnglishに設定する必要あり
  • VSS 6.0d … 英語バージョンが必要 (日本語版のSSJP.DLLをリネームして、無効にしても良い)

ターゲットのバージョン管理システム

vss2git.rb実行前に、ターゲットバージョン管理システムコマンドへのパスを、実行パスPATHに設定してください。

Ruby

  • Ruby 2.0 or 1.9.3 (32 bit version)

vss2git.rb

分散バージョン管理システム移行ツール

使用方法

ruby vss2git.rb -r <runmode> -s <vssdir> -u <user> [-p <password>]
                [-c <vcs>] [-d <email domain>] [-l <user list>]
                [-b <branch>] [-e <verbose>] [-t <time>]
                [-w <workingdir>] [-r] VSS_PROJECT

  -r|--runmode      Run mode (0, 1, 2) (defualt:0)
                      0: Analyze
                      1: Full migration
                      2: Continuous migration
  -s|--vssdir       Absolute path to VSS repository
  -u|--user         VSS user name
  -p|--password     VSS password
  -c|--vcs          Target version control system
                    "git", "hg" or "bzr"
  -d|--emaildomain  e-mail domain
  -l|--userlist     User list file (JSON format)
                      Ex.
                      {
                        "user name on VSS":
                         ["user name on VCS", "e-mail address"],
                        "user name on VSS":
                         ["user name on VCS", "e-mail address"],
                        ...
                      }
  -b|--branch       A successful Git branching model (0, 1, 2) (default:0)
                      0: No branching model
                      1: Branching model type 1
                         master:  Production branch
                         develop: Development branch
                      2: Branching model type 2
                         master:  Development branch
                         product: Production branch
  -e|--verbose      Verbose mode (0, 1, 2) (default:1)
                      STDOUT
                        0-1: VSS information, user list, migration log
                        2:   + dump of internal objest (for debug)
                      STDERR
                        0:   No output
                        1-2: Processing status
  -t|--timeshift    Time to shift (-12 .. 12)
  -w|--workingdir   Path to the root of working folder
  -r|--update       Update mode
  -v|--version      Print version
  -h|--help         Print help

-r [0 | 1 | 2]

RUNモード指定です。

  • -r0: VSSを解析して、VSS情報およびVSSのユーザリストを取得します。migrationは実行しません。
  • -r1: VSSからVCSへのFull migrationを実行します。(デフォルト)
    ターゲットVCSの新規リポジトリが作成され、VSSの全履歴がターゲットVCSに変換されます。
  • -r2: VSSからVCSへのContinuous migrationを実行します。
    VSSをターゲットバージョン管理システムに変換した後に、変換元VSSが更新された場合、差分履歴を抽出して、ターゲットバージョン管理システムのリポジトリに反映します。継続してVSSをターゲットバージョンシステムにミラーリングしたい場合に使用します。

-s <vssdir>

VSSリポジトリのパスを設定してください。UNCの指定も可能です。

-u <user>

VSSにアクセスするためのユーザIDを指定してください。

-p <password>

VSSユーザIDのパスワードを指定してください。

-c [git | hg | bzr]

ターゲットバージョン管理システム名を指定してください。
git” or “hg” or “bzr

-d <email domain>

VSSのチェックインユーザIDに、指定したE-mailドメイン名を付加して、E-mailアドレスを生成します。同一サイトでVSSを運用していて、VSSユーザIDとE-mailアドレスIDが同じ場合に有効な設定です。

-l <user list>

VSSのチェックインユーザIDのE-mailドメインが異なる場合や、変換時にユーザIDを変更したい場合に有効な方法です。JSONフォーマットで、あらかじめ、VSSのチェックインユーザIDと、ターゲットバージョン管理システムで使用するユーザID、E-mailアドレスのペアを指定して下さい。

{
  “VSSユーザID 1”: [“ターゲットバージョン管理システムユーザID 1”, “E-mailアドレス 1”],
  “VSSユーザID 2”: [“ターゲットバージョン管理システムユーザID 2”, “E-mailアドレス 2”],
  …
}

例)
{
  “taro”: [“Taro.Tanaka”, “taro.tanaka@mail.abcdef.co.jp”],
  “hanako”: [“Hanako.Kobayashi”, “hanako.kobayashi@mail.ghijkl.co.jp”]
}

-b [0 | 1 | 2]

A successful Git branching modelを適用するかどうかを指定します。

  • -b0: A Successful Git Branching model を適用しない (デフォルト)
  • -b1: A Successful Git Branching model type 1 を適用
  • -b2: A Successful Git Branching model type 2 を適用

-b1, -b2 を適用すると、VSSでタグ付けされた履歴は製品ブランチに、タグなしの履歴は開発ブランチにコミットされます。

  • type 1では、”master”, “develop”の2つのブランチが作成され、”master”は製品ブランチ、”develop”は開発ブランチになります。
  • type 2では、”master”, “product”の2つのブランチが作成され、”master”は開発ブランチ、”product”は製品ブランチになります。(私はtype 2を使ってます)

-e [0 | 1 | 2 ]

STDOUT, STDERRへのログの出力を指定します。

  • -e0: STDOUTにVSSの情報、ユーザIDリスト(JSONフォーマット)、変換ログを出力します。STDERRには何も出力しません。
  • -e1: STDOUTにVSSの情報、ユーザIDリスト(JSONフォーマット)、変換ログを出力します。STDERRには変換ステータスを出力します。(デフォルト)
  • -e2: STDOUTにVSSの情報、ユーザIDリスト(JSONフォーマット)、変換ログ、内部オブジェクト情報を出力します。STDERRには変換ステータスを出力します。vss2git.rbのデバッグ用の設定です。

-t <time shift>

タイムゾーンを設定します。設定可能な値は、-12〜12(時間)です。
単一サイトでVSSを使用していた場合には、本指定は不要です。タイムゾーンの異なるサイトでVSSを共有していた場合に指定してください。

-w <workingdir>

VSS_PROJECT で指定したプロジェクトを、カレントフォルダ以外に展開したい場合に指定してください。例えば、-w a\b\c 指定すると、指定したプロジェクトを、.\a\b\c\フォルダ以下に展開します。

-v

vss2git.rb のバージョンを表示します。

-h

vss2git.rb のhelpを表示します。

使用例

Case 1

  • VSSリポジトリ: c:\vssrepo\library
  • VSSプロジェクト: $/
  • VSSユーザID: taro
  • ターゲットVCS: git
ruby vss2git.rb -r1 -s c:\vssrepo\library -u taro -c git $/ > migration.log

Case 2

  • VSSリポジトリ: \\vssrepo\library
  • VSSプロジェクト: $/PRODUCT-1
  • VSSユーザID: taro
  • VSSパスワード: abc123
  • ターゲットVCS: git
  • ユーザリストファイル: C:\doc\user.json
  • ブランチモデル: type 2
  • ワーキングフォルダ: PRODUCT-1
ruby vss2git.rb -r1 -s \\vssrepo\library -u taro -p abc123 -c git -l c:\doc\user.json -b2 -w PRODUCT-1 $/PRODUCT-a > migration.log

サンプル

簡単なサンプルを用意しました。
以下の手順で、簡単にvss2git.rbをお試しいただけます。

1. 初めに、上記「必要なもの」が準備できていることを確認してください。

2. githubからvss2git.rbリポジトリをcloneします。

3. 変換元のVSSリポジトリ(サンプル)を作成します。

“sample”フォルダに移動して、”mk_sample_vss.rb”を実行してください。
“Enter VSS command directory:” が表示されますので、VSSのインストールディレクトリを入力してください。

> cd sample
\sample> ruby mk_sample_vss.rb
Enter VSS command directory: C:\Program Files (X86)\Microsoft Visual SourceSafe

”sample\vss”フォルダにサンプル用のVSSリポジトリが作成されます。

4. 上記VSSリポジトリをGitレポジトリに変換します。

サンプルフォルダで、”migrate.bat”を実行して下さい。

\sample> migrate

“sample\git”フォルダに、Gitリポジトリが作成されます。

hanaguro8
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザーは見つかりませんでした