先日、こちらの記事を書きました。
いまさらだけどSubversionからGitへ移行する(その1: リポジトリー変換)
いまさらだけどSubversionからGitへ移行する(その2: プロジェクト・ディレクトリー分割)
今回はその続きで SVN リビジョンをどう Git にマッピングさせるか。移行したプロジェクトの一部では SVN Rev をバージョン表記に適用しているので、これをどうするべきか。
SVN のリビジョンのバージョン表記への利用
Git ネイティブなヤング達はご存じない方も既にいるだろうが、r1234
なんてのがバージョン表記に現れたりしているやつです。
Git で運用しているプロジェクトだと SHA1 ショートハッシュから…。
$ git rev-parse --short HEAD
b34f896
この値を version 1.2.3-b34f896
などするものをよく見かけるはずです。それの SVN でよく利用されていた版です。
手元の Linux 系 OS でパッケージ一覧表示してみると gitXXXXXX とか rXXXX svnXXXX ってやつがあると思いますが、それ。
$ # CentOS/RHEL
$ yum list
...
$ # Debian/Ubuntu
$ apt list
...
SVN Rev 実使用例
たとえば、Subversion 自体のバージョン表記がこれなので、手元の SVN がインストールされている環境で version を確認してみると…。
$ svn --version
svn, version 1.10.4 (r1850624)
余談ですが、Redmine の SVN リポジトリー https://svn.redmine.org 2020-07-16 現在は Powered by Subversion version 1.6.6 (r40053).
となんだか古いですね。新しいものを利用すれば良いってものでもないですが、 redmine.org 自体ドッグフーディングもせず、古い Redmine アプリケーションで運用している様だしなんなのでしょうね。
移行で困る点
Version ${major}.${minor}.${tiny}.${revision}
バージョン表記が上記のように、上位の部分は任意の値を開発者が付与するものとして、最終の revision 部分をこの SVN Rev から取得している場合。
- SVN の特徴でもある Revision 値がインクリメンタルであることを前提としている
- SHA1 hash の様なアルファベットを含む値では稼働(ビルド)できない (.NET Assembly など)
- 政治的な理由で数値のままにしたい
対応
Linux/UNIX などの shell 環境
wc と sed とを組み合わせてそれまでのコミット回数をカウントするという方法がよく利用される模様。
$ git log --oneline | wc -l | sed -e "s/[ \t]*//g"
1234
参考: Git で SVN みたいなリビジョン番号を取りたい - トリの部屋
Windows cmd 環境
上記の wc+sed の例はよく見かけるので知っていたのだが、Windows 環境のプロジェクトもあるのでこれをどう対処したか。
C:\Work\proj> git log --oneline | find /v /c ""
1234
こんな感じで空文字にマッチしない行数をカウントとすればよい。
Windows PowerShell 環境
PS C:\Work\proj> (git log --oneline).Length
1234
cmd よりもシンプルにできた。私はとりあえず find
で実現してしまったが、こちらに移行するかも。
つづく
上記で少し触れたが、 .NET Framework 環境のプロジェクトも移行させ AssemblyVersion をどうするか検討したので、その点について書くかもしれない。