いけむランド

はてダからやってきました

パッケージャーから見た git

git を普段から使っているわけではないため、勘違いしているところもあるかもしれないです。


cygport で git がサポートされていることと、最近は git でしか配布していないソースもそこそこあるため、パッケージを git からつくることがある。

パッケージには元々のソースのバージョンだけでなく、パッケージ特有のリリース番号を追加することが一般的である。リリース番号はソースは同じだが、コンパイルオプションや梱包するファイルの変更など、パッケージする条件が変わった場合に変更 (ほとんどの場合はインクリメント) される。

例えば、cygwin だと 1 から始まる整数値のみ *1Vine Linux の場合は 1 から始まる整数値にディストリビューションの略称と思われる固定文字列 "vl" がついて、さらに Vine Linux 自体のメジャーバージョン番号が付与される。*2


話を git に戻すが、git は svn と違って、内容に変更があった場合に変更されるリビジョン番号が前の数値からインクリメントされた値ではなく、その変更毎の SHA1 の ID となる。*3

すると、例えば svn のリビジョン番号をリリース番号、またはリリース番号の一部に使用するようなパッケージポリシーであった場合には、git のリビジョン番号 (というかスナップショット ID?) にそのポリシーを適用すると、第三者がリリース番号が変わったことを認識した時に、それが以前のパッケージよりも古いのか新しいのかがパッと見でわかりにくい状況になるのではないかと思っている。(少なくとも、リリース番号の順序関係を前提にしているツールは動かなくなる場合がありそう。)

実際に git からパッケージをつくっているものを見ると、この回避策として、日付を埋め込んだりしている。*4

%define tarball xf86-video-ati
%define moduledir %(pkg-config xorg-server --variable=moduledir )
%define driverdir	%{moduledir}/drivers
%define gitdate 20100219
%define gitversion e68d3a389

Summary:   Xorg X11 ati video driver
Name:      xorg-x11-drv-ati
Version:   6.13.0
Release:   0.23.%{gitdate}git%{gitversion}%{?dist}
URL:       http://www.x.org
License:   MIT
Group:     User Interface/X Hardware Support
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)


git はその性質上、リビジョン番号をインクリメンタルに割り当てることができないことは仕方ないことであるし、他の長所がたくさんあると思うけど、ほんのちょっとだけパッケージャーには優しくないのかと思ったりもする。


これで話を終わらせようとしたのだが、さっきググったら git からチェックアウトして作成したパッケージに、きちんとインクリメンタルな整数値を割り当てているものもあるというエントリを見つけた。

たしかにこの方法だと問題なさそうな気がする。ただ、この値 (commit 回数) はおそらく git では意味を持たないものなのだろうとは思う。

*1:ただし cygwin 自体が 1.5 から 1.7 へアップグレードした時には一気に 10 にまで跳ね上がったものもあった。

*2:VersioningPolicy – My Project

*3:Git - SVN Crash Course(in Japanese)

*4:一日に複数回の更新が必要だったら、さらに日付の後にシーケンシャルな整数値を付与するのだろうが、あんまり長くなるのは美しくない気もする。