Visual Studio でのバージョン管理には長らく VSS (Visual SourceSafe) を利用してきました。個人で使っているかぎりは取り立てて問題になるようなことはないのですが、ここのところ Java 絡みの大きなプロジェクトに参加していると SVN (Subversion) を使う機会が多く、それに慣れてくると VSS での管理が面倒くさくなってきました。
なにより、管理対象のソースコードに干渉してしまうのがいただけない。
では、SVN に移行するかというと、Visual Studio に拡張機能を入れるのになんとなく抵抗があって、ちょっと躊躇してしまいました。Eclipse ならもともとがプラグインの集合体なのでプラグインの追加にそれほどの抵抗を感じないのですが、Visual Studio だとなんだか落ち着きません。Microsoft 社製の拡張機能でさえ期待どおりに動いてくれるとはかぎりませんから。それに、最近では Git に注目が集まっていて、Visual Studio 2017 では Git を推しており、必要なものがあらかじめそろっていたので、だったらそっちで行ってみるかということで Git に決めました。技術的なアドバンテージがどうのこうのと言われても個人レベルでは大した決め手にはなりませんし、機能的にはどちらも一長一短だったので、たまには流行りものに乗っかってみるのもいいかと。
バージョン管理を VSS から Git に移行するにあたり、Vss2Git なるツールを利用してリポジトリを変換しました。ただ、機能的には申し分なかったものの、細かいところで期待どおりにとはいかず、仕方がないのでソースコードを書き換えて対処しました。vss2git.rb という選択肢もあるようですが、Ruby 使いではない自分にはお膳立てがちょっと大変そうに見えたので、まずは見通しが立ちやすい Vss2Git でやってみました。
ルートを変更したい:
Vss2Git の [VSS Settings] に VSS のサブプロジェクトのパスを設定しても、それが Git のリポジトリの新たなルートになるわけではなく、ルートはあくまで $
のままで変換されます。どこかパスを変換しているところを書き換えれば対応できるはずだと考えていろいろ探しまわったところ、GitExporter.cs
の一か所を空文字列に変えるだけでなんとか対応できました。
タイムスタンプのタイムゾーンを温存したい:
夏時間 (DST: Daylight Savings Time) に絡む何かしらの意図があってタイムスタンプを世界標準時 (UTC: Universal Time, Coordinated) に変換しているようですが、当面はローカルリポジトリだけで運用するつもりですし、どうせこの先のコミットは日本標準時 (JST: Japan Standard Time) で記録されるので、VSS のタイムスタンプをそのまま転記するようにしました。これは GitWrapper.cs
の当該処理を無効化すれば対応できました。
git diff
の出力はこちら。
patch -p1 < vss2git.patch
―― とかやればこれらの修正を適用できます。vss2git.patch
の改行は CR + LF になっているので、ZIP ファイルから展開したソースコードの場合、patch
コマンドによっては vss2git.patch
の改行を LF に変えないとうまくパッチをあてられないかもしれません。
ちゃんと対応するならこれらの設定項目を加えて処理を選べるようにしないと使い物にならないので、これ以上深入りするつもりはありません。とっくの昔にサポートが切れている VSS を使い続けているところは減っているでしょうし、バージョン管理システムの切り替えなんてそう何度も経験するようなことではないはず。まぁ、それでも、この投稿が何かの役に立てば幸いです。
そういえば、VSS に PDF ファイルをコミットするとなんか様子がおかしいと思っていたら、どうやらバグがあったみたいですね。Visual SourceSafe 2005 の更新プログラムがあったなんて、つい最近まで知りませんでした。もっと早くに気づいていれば...。