Gitの署名
Gitで署名を使う
GitにはGPG1を利用して、コミット(およびタグ)に暗号化した署名を付与可能。2
細かいやり方はGit公式やGithub、GitLabのドキュメントを調べればいくらでも出るが、大まかには以下の流れ。
- gpgで秘密鍵と公開鍵を用意する。
- 公開鍵をGithubやGitLabでアカウントに追加する。
- Gitで鍵を利用する設定をする。以下の設定を入れる。
git cofig --global user.signingkey <Key info>
- コミット実施やタグ付与時にコマンドオプションで署名する。
# コミットの場合(-Sオプションの追加)
git commit -S -m "commit message"
# タグの場合(-aの代わりに-sオプション)
git tag -s v1.0.0 -m "tag message"
ただ、調べた限り、クラウドベンダーが提供するAWS CodeCommit等では公開鍵の追加ができなかったりする。
署名する意味
署名とその検証は信頼できるソース(ユーザなど)からのコミット、変更で有ることを証明する。
署名をする意味もこれを担保すること。
仮に署名がない場合、gitの--auhtor
でコミットしたユーザをごまかせる。3
本当に全部にするのか。いつ署名をするべきか。
確かに上記をやれば、コミットした人を証明でき、GithubやGitLabでかっこいい感じになるのかもしれない。
でも本当にするべきか。
調べて見た感じは以下だった。
- 全てのコミットとタグに付与する
- タグに付与する
全てに付与する理由は前述の署名をする理由をあげていた。
タグにコミットするのが良い派はLinusの主張をあげて示していた。4
- いろんなコミッターがいるOSSのメンテで必要。
- Linusはすべての変更パッチを見ているわけではない。誰が行った変更であるのか信頼性を担保するためには署名が必要。
- すべてのコミットに付与するのは、自動的に行っていることになるので署名を付与していても信頼性が下がる。
- 価値の有るコミットへの署名に意味がある。この単位で信頼性を保ちたい。
ここまで踏まえて、個人的な利用方針は以下。
- 原則すべてのコミットに署名しない。
- 対応してないサービスも有る。
- 自分が常に意味のあるコミットを作るわけではない。一時的な何かを作るときもある。
- タグは署名してもよい。
- Github上でのOSSへの貢献であれば意味のある単位でしておくのがいいかも。
- そうでなくともタグを付与するのは、自分でもある程度価値の有る単位だとわかっている。
会社やチーム、組織、マージ戦略等に応じても少し変える可能性は有るが、いいお勉強になりました。
Footnotes
-
https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work ↩
-
https://binx.io/2021/12/06/why-you-should-start-signing-your-git-commits-today/ ↩
-
https://lore.kernel.org/all/20090415185554.GG23644@curie-int/T/ ↩
-
https://lore.kernel.org/lkml/CAHk-=whFAkqwGSNXqeN4KfNwXeCzp9-uoy69_mLExEydTajvGw@mail.gmail.com/ ↩