PHP、Smarty、ケータイサイトについて発信中。書籍 「Smarty動的webサイト構築入門」(技術評論社) 好評発売中
RSS icon Home icon
  • vss2svn.plを使ってVSS6からSubversionへ移行


     バージョン管理ソフトをVSS6(Microsoft Visual Source Safe)からSubversionへ移行しました。移行ツール vss2svnに関する記事はあまり多くありませんが、どれもとても参考になりました。ありがとうございます。

    • [miau's blog] ここの vss2svn.pl を使いました。日本語ファイル名、日本語のコミットメッセージも移行できました。
    • [ひだまりのなか、想うこと] 「やりたいこと」に、日本語のコミットメッセージを移行したい、と書かれています。ここを読まなかったら、日本語はあきらめていたかもしれません。
    • [最高のコンピューテュング環境とは] VSSからSubversionへの移行するための、3つの方法を説明しています。
    • [我楽多園] VSSからプロジェクト単位のインポートが失敗したり、日本語が文字化けしたとの報告があります。
    • [pumacode]  vss2svnの本家。ただし日本語が文字化けします。

    動作環境

     サーバPC、移行作業PCともに、Windows XP + xamppです。サーバPCにはVSSリポジトリがあり、ネットワーク共有で公開しています。
     移行作業PCで、vss2svn.plを実行します。ネットワーク共有上のVSSリポジトリを読込み、移行作業PC内にsvnリポジトリを作成します。また、外部公開しませんが、http: のsubversionサーバとしても動作し、trunkへリネームしたり、tagsやbranchesの作成などの調整をします。
     移行後の最終形は、サーバPC内にsvnリポジトリがあり、サーバPCがhttp:のsubversionサーバとして動作します。

    つまづいた点

     vss2svn.plを実行すると、VSSからファイル一覧の取得後、MMagic.pmのなんやかんやのエラーで止まりました。この原因がわからず、2~3日悩みました。結果的に、ActivePerl 5.8.x.x をアンインストールし、ActivePerl 5.10.x.x をインストールしたら、あっさり動きました。

    採用しなかった方法

     pumacodeのサイトからvss2svnのソースファイルをチェックアウトして、CentOS-5にインストールしました。次に、WindowsPC上のVSSリポジトリをCentOS-5へコピーしました。vss2svnの実行は、あっさり成功しました。subversion用ダンプファイルをWindowsPCに戻し、svnadmin load したところ、日本語ファイル名と日本語メッセージは文字化けしていました。vss2svnのオプションで、- -encoding x-sjis-cp932 などを試しましたが、VSSリポジトリの読込中に、not well format エラーで止まりました。だいぶ時間をかけていたこともあって、日本語メッセージをあきらめかけましたが、もう一度 vss2svn.pl を試すことにして、ActivePerl 5.10.x.x インストールでうまくいったわけです、よかった、よかった。

    Perlの不足モジュールのインストール

     まず、ActivePerl 5.10.x.xをインストールします。vss2svn.pl を実行 ⇒ 不足モジュールのエラー ⇒ 不足モジュールをインストール、を繰り返します。Jcode、File-MMagicは、ppmでインストールしました。

    C:>ppm install Jcode
    C:>ppm install File-MMagic

     Time-ParseDateは、Time-modules-2006.0814.tgzをダウンロード、解凍し、その中のファイルをコピーしました。

    C:>copy Time-modules-2006.0814\lib\Time\*.pm C:\Perl\site\lib\Time

    xampp と Subversion

     xamppの最新バージョンは、1.6.8 で、Apache-2.2.9とsvn-1.4.6モジュールがついてきます。サーバ側のsubversionはバージョンを合わせたほうが確実だと思い、1.4.6をダウンロードしてインストールしました。

     続いて、Apacheのsubversion設定をします。C:\xampp\apache\conf\httpd.conf をテキストエディタで開きます。まず、92行目付近の LoadModule dav_fs_module ~~~ の次行に、

    LoadModule dav_svn_module modules/mod_dav_svn.so

    を挿入します。次に、 511行目付近の Include conf/extra/httpd-ssl.conf の次行に、

    Include conf/extra/httpd-svn.conf

    を挿入します。

     C:\xampp\apache\conf\extra\httpd-svn.conf を新規作成して、テキストエディタで開き、次の内容で保存します。

    <Location /svn>
      DAV svn
      SVNParentPath “D:/svnrepos”
    </Location>

     svnリポジトリを、D:\svnrepos\project_a や D:\svnrespo\project_b に作り、その下に trunk、tags、branches ディレクトリを作ります。svnリポジトリのhttp経由のURLは、http://localhost/svn/project_a となります。

    ディレクトリとバッチファイル紹介

      実ファイルを整理したもので、実際に動作確認はしていませんので、ご了承ください。ファイル内容とコマンドプロンプトの区別がつきにくく、折り返し表示しているため、見づらいです。「D:\xx>」で始まっていれば、コマンドプロンプトです。

    U:\vssrepos
    U:\vssrepos\sourcesafe.ini
     移行作業PCから見たサーバPCのVSSリポジトリです。ネットワークドライブを割り当てているので、U: になっています。30以上のプロジェクトがありましたが、プロジェクトごとの vss2svn.pl 処理がうまくいきました。

    D:\svnrepos\project_a
    D:\svnrepos\project_b
     移行作業PC内の移行先のsvnリポジトリです。

    D:\svnrepos\pre-revprop-change.bat
     VSSのコミット(チェックイン)の日付を移行するためのフック用ファイルです。ファイルを新規作成し、内容は次の1行だけにしてください。D:\svnrepos\project_hoge\hooks\pre-revprop-change.tmpl をコピーして、リネームしただけでは、正しく動作しません。

    exit 0

    D:\vss2svn\v2s_proj.txt
     
    プロジェクト名の一覧です。VSSに、$/project_a、$/project_b とある場合は、次のようになります。

    project_a
    project_b

    D:\vss2svn\v2s.bat
     プロジェクト一覧を読み込んで、各プロジェクトを vss2svn処理をします。内容は次のとおりです。

    for /F %%f in (v2s_proj.txt) do (
    call v2s1 %%f
    )

     コマンドプロンプトで、最初に、VSSのss.exeへパスを通します。

    C:\>set PATH=%PATH%;C:\Program Files\Microsoft Visual Studio\Common\VSS\win32

     コマンドプロンプトで、次のように実行します。

    C:>D:
    D:\>cd \vss2svn
    D:\vss2svn>v2s

    D:\vss2svn\v2s1.bat
     内容は次のようになります。

    set proj=%1
    if “%proj%”==”" goto err

    :作業ディレクトリをクリーンアップします
    rmdir /S /Q D:\vss2svn\_vss2svn

    :svnリポジトリの新規作成と、フック用バッチファイルをコピー
    rmdir /S /Q D:\svnrepos\%proj%
    svnadmin create D:\svnrepos\%proj%
    copy D:\svnrepos\pre-revprop-change.bat D:\svnrepos\%proj%\hooks

    :SSJP.DLL のリネーム
    ren “C:\Program Files\Microsoft Visual Studio\Common\VSS\win32\SSJP.DLL” “SSJP.DLL~”

    :vss2svn 実行
    set SSDIR=U:\vssrepos
    vss2svn.pl –setdates  –vssproject $/%proj%  –vsslogin Admin,PASSWORD  –svnrepo http://localhost/svn/%proj%  –noprompt

    :SSJP.DLL の戻し
    ren “C:\Program Files\Microsoft Visual Studio\Common\VSS\win32\SSJP.DLL~” “SSJP.DLL”

    :フック用バッチファイルを削除する
    del D:\svnrepos\%proj%\hooks\pre-revprop-change.bat

    :err

     プロジェクト1個だけを処理したい場合は、コマンドプロンプトで、次のように実行します。

    D:\vss2svn>v2s1 project_a

    trunk作成とチェックアウト

     VSSの$/project_a をsubversionリポジトリに移行直後のパスは、リポジトリ/project_a となっているので、Subversion慣例のtrunkにリネームし、必要に応じて、tags、branchesを新規作成します。D:\workspace\project_a にチェックアウトします。コマンドプロンプトで、次のように実行します。

    D:\>cd \workspace
    D:\workspace>rmdir /S /Q project_a
    D:\workspace\project_a>svn move -m “” http://localhost/svn/project_a/project_a http://localhost/svn/project_a/trunk
    D:\workspace\project_a>svn mkdir -m “” http://localhost/svn/project_a/tags
    D:\workspace\project_a>svn mkdir -m “” http://localhost/svn/project_a/branches

    実ファイルで上書き

     チェックアウトしたファイルを確認したところ、LF改行のファイルが、CRLFになっていました。VSS6がチェックイン時に改行をCRLFにしてしまうのかもしれません。VSSの作業ファイルはLF改行のままだったので、VSS作業ディレクトリからsvnチェックアウトディレクトリへ上書きコピーしました。VSS作業ディレクトリの各ファイルはReadOnly属性であり、これを上書きコピーしたので、ReadOnly属性を解除します。また、vssver.sccもコピーしてしまったので、これを削除します。最後に、svnコミットします。コマンドプロンプトで、次のように実行します。

    D:\workspace>cd project_a
    D:\workspace\project_a>attrib -R /S *.*
    D:\workspace\project_a>del /S /Q vssver.scc
    D:\workspace\project_a>svn commit -m “vss to svn” .

    サーバPCのsvnリポジトリへ

     サーバPCのSubversionのバージョンも1.4.6なら、D:\svnrepos\ を丸ごとコピーすれば動くはずです。移行作業PCとサーバPCのSubversionのバージョンが違う場合は、移行作業PCでエクスポートして、サーバPCでインポートします。

     まず、移行作業PCでエクスポートします。コマンドプロンプトで、次のように実行します。

    D:\>cd \svndump
    D:\svndump>svnadmin dump D:\svnrepos\project_a >project_a.dat

     *.datをサーバPCへコピーして、インポートします。移行作業PCもサーバPCも同じディレクトリ構成と仮定します。コマンドプロンプトで、次のように実行します。

    D:\svndump>rmdir /S /Q D:\svnrepos\project_a
    D:\svndump>svnadmin create D:\svnrepos\project_a
    D:\svndump>svnadmin load D:\svnrepos\project_a <project_a.dat

    TortoiseSVN(トータスSVN)のバージョンは?

     私は、1.5.2をインストールして使っています。http: や svn: で使う分には問題ないと思います。

    2008-10-15 admin No comments 未分類

    Leave a reply