GitのTagへ署名してみる

はじめに

今まで、ある程度まとまった機能が開発できたら、タグ付けするということを繰り返してきましたが、
今まで使用していたのは、軽量版のタグだということに気がつきちょっと調べて見ると、タグには注釈を付けることができ、さらにそれに対して署名が可能だということがわかりました。

これは、開発者であるコミッターとリリースタグを付けるリリースマネージャみたいな異なる人がいる場合に有効な仕組みだと思います。

作成した注釈+署名付きタグを、git showコマンドで確認すると、コミットの情報の上に、タグの情報と署名が表示されます。

{タグ作成者の情報}
{注釈メッセージ}
{署名}
{コミットの情報}

環境

MacOSX v10.6

GnuPGやGitは導入済みとします。

前準備

Gitに署名用のGPG秘密鍵を登録します。$HOME/.gitconfigに直接記述することもできるのですが、コマンドで登録した方が、Syntaxエラー等を防げるのでコマンドで登録します。

$ git config --global user.signingkey 1234FEDC

署名付きのタグを作成

下記のコマンドで署名付きタグを作成できます。(既に作成済みのタグへ署名する場合は、-fオプションを追加します)

$ git tag -s v0.0.2 -m 'Interactive shell support'

次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります:“Gonbe Nanashi (hoge) <hoge@gmail.com>”
2048ビットRSA鍵, ID 1234FEDC作成日付は2010-09-23

Updated tag 'v0.0.2' (was 4c5f5b8)

署名されたか確認します。

いつものgit showコマンドを実行すると、GPG署名が一緒に表示されます。

    $ git show v0.0.2
    tag v0.0.2
    Tagger: Gonbe Nanashi <hoge@gmail.com>
    Date:   Thu Sep 23 18:58:42 2010 +0900

    Interactive shell support
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.10 (Darwin)

    iQEcBAABCAAGBQJMmyTSAAoJEFWFhZJ7f/uc/AQIAJDjM/PiwixNgIrtFIuTglzM
    pG6YVFML5O63Rf1bmX8W9WAY7jWDufHZ5q+dY9PnzffM3Tz8HTiJMzKGjg66cZ89
    vmuvaJ5nM/1hq1fbXdAjpXXxVPin/6jscpAjBefSQFckegXUCKe5Sl8K1M2c0ohY
    Qe7hViY9BlJXfn/xFgGBO9oWDcpz+hCcsb0SjyrsAirtPvX5axJEW/Eq3yKijXM4
    QiR+q0B7/Sz9ymZJUB6wWEK/pdhf6w64pN+xEvaIHmrsqoPG3kXzhYOYCxQgeAms
    lEyd5caIKteKzQqAejtWW2y0Q4W7v+aeWr7lJfwMym+7f6iHwqsjVp87lzUaC+M=
    =QFab
    -----END PGP SIGNATURE-----

    commit e57c1135027592d6f25a444fe04b2aff8ebf0c39
    Author: Gonbe Nanashi <hoge@gmail.com>
    Date:   Thu Sep 23 17:13:19 2010 +0900

        Add running interactive shell argument and parameters

    diff --git a/.gitignore b/.gitignore
    new file mode 100644
    index 0000000..6e92f57
    --- /dev/null
    +++ b/.gitignore
    (...)

タグの検証

署名者の公開鍵を使用して、検証できます。

$ git tag -v v0.0.2
object e57c1135027592d6f25a444fe04b2aff8ebf0c39
type commit
tag v0.0.2
tagger Gonbe Nanashi <hoge@gmail.com> 1285235922 +0900

Interactive shell support
gpg: 木  9/23 18:58:42 2010 JSTにRSA鍵ID 1234FEDCで施された署名
gpg: “Gonbe Nanashi (hoge) <hoge@gmail.com>”からの正しい署名

参考

Git

おまけ

タグをgithub等のリモートサーバへ送る

git push origin masterでやってるように、git push origin v0.0.2って実行してやるだけです。

$ git push origin v0.0.2

複数のタグを一度にpushしたい場合は、下記のコマンドを実行するといいらしいです。

$ git push origin --tags
リモートリポジトリからタグ一覧を取得する

まず、下記のコマンドで、自分のmasterブランチに最新リビジョンをマージします。

$ git pull origin master

タグはダウンロードされないので、下記のコマンドでタグを取得します。

$ git fetch origin --tags
最新のタグから、tarballを作成する
$ git describe
v0.0.2
$ APP_VER=$(git describe)
$ git archive --prefix=nanashi-${APP_VER#v}/ $APP_VER | gzip >nanashi-${APP_VER#v}.tar.gz
$ tar tvf ~/src/nanashi-0.0.2.tar.gz
-rw-rw-r--  0 root   root        5  9 23 23:41 nanashi-0.0.2/.gitignore
-rw-rw-r--  0 root   root        0  9 23 23:41 nanashi-0.0.2/LICENSE
-rw-rw-r--  0 root   root       27  9 23 23:41 nanashi-0.0.2/README
-rwxrwxr-x  0 root   root     4779  9 23 23:41 nanashi-0.0.2/nanashiCommand.py

ビルド用のディレクトリにtarballを送ってRPMを作成するとか、Webアプリだったら配信用ディレクトリに送ってrsync叩くとか。これで簡単にリリース管理ができますね。