GPGキーでGitにコミットを「自動署名」する方法はありますか?


213

作成された各コミットまたはタグにGitが常に署名するようにする簡単な方法はありますか?

私はそれを次のようなもので試しました:

エイリアスコミット=コミット-S

しかし、それはトリックをしませんでした。

これを実現するために別のプログラムをインストールしたくありません。簡単にできますか?

余談ですが、おそらくHomebrewなどのプロジェクトの単一のコミットを送信するため、コミットには署名せず、タグだけを作成する必要があります。


8
エイリアスが機能した理由は、既存のコマンドに対してエイリアスを設定できないためです。(関連:stackoverflow.com/questions/5875275/git-commit-v-by-default stackoverflow.com/questions/2500586/...の stackoverflow.com/questions/1278296/...
ダン・D.

2
参考までに:プッシュするすべてのコミットを書き換えて署名しますgit filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD@{u}..HEAD(これを使用する必要があるわけではありません)。
Vi。

回答:


275

注:-Sコミットを確実に署名するために常に追加したくない場合は、pu2013年12月にブランチ ' 'が存在するため、gitリリースになる保証はありません。あなたのためにそのオプションを処理する設定。
2014年5月の更新:Git 2.0に含まれています(このパッチシリーズ再送信された後)

Nicolas Vigier(boklm)によるcommit 2af2ef3を参照してください。

commit.gpgsignすべてのコミットに署名するオプションを追加する

すべてのコミットにGPGで署名したい場合は、-S常にオプションを追加する必要があります。設定オプションは、自動的にすべてのコミットを署名することができます。
commit.gpgsign

commit.gpgsign

すべてのコミットにGPG署名を付けるかどうかを指定するブール値。
リベースなどの操作を行うときにこのオプションを使用すると、多数のコミットが署名される可能性があります。エージェントを使用すると、GPGパスフレーズを何度も入力する手間が省けます。


その構成は通常、リポジトリごとに設定されます(プライベートの実験的なローカルリポジトリに署名する必要はありません)。

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true

あなたはそれをuser.signingKeyグローバル設定として使用することと組み合わせます(あなたがコミットに署名したいすべてのリポジトリに使用される一意のキー)

git config --global user.signingkey F2C7AB29

user.signingKeygit 1.5.0(2007年1月)にcommit d67778eで導入されました

私のgitリポジトリとgpgキーで同じ形式の名前を使用する必要はありません。
さらに、キーリングに複数のキーがあり、コミットメッセージで使用するアドレスと一致しないキーを使用したい場合があります。

このパッチは、設定エントリ " user.signingKey"を追加します。これは、存在する場合、gpgの "-u"スイッチに渡され、タグ署名キーを上書きできるようにします。

これは、ユーザーが自分で設定を誤った場合や、キーリングに秘密鍵がない場合に対処するために、コミットaba9119(git 1.5.3.2)で実施されます。user.signingKey.git/config

ノート:


かっこいい。githubでホールレポをダウンロードせずにgit describeのような簡単な方法はありますか?

13
あなたは私的な実験的レポジトリに署名する必要はありません...しかし、なぜあなたはそうしませんか?
アンディヘイデン

168
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

9E08524833CB3038FDE385C54C0AFCCFED5CDE14をキーIDに置き換えます。覚えておいてください:短いIDを使用することは決して良い考えではありません

更新:新しいgit edictごとに、すべての構成キーがcamelCaseにある必要があります。


これをVonCの回答からコピーして貼り付けましたか?
ロビーアベリル、2016年

19
いいえ。エディションの履歴でわかるように、誰かが私の例を彼の回答に追加しています。ED5CDE14は私自身の個人鍵です。でも問題ない。
フェリペ

7
奇妙な。私はあなたに悪いように見えるので、明日変更を元に戻します
ロビー・アベリル

鍵署名IDをどのようにして見つけますか?また、すべてのGitリポジトリにGPGキーが1つしかないのは悪いことですか?私はかなり接続されたプロジェクトで4つのdiffキーを処理する必要がないことを望んでいるからです。
MarcusJ 2017年

1
これはLinuxユーザーに役立つ場合があります:場合によっては(たとえば、Vimでは、PINエントリが必要なスマートカードに格納されているキーを使用して)機能させるために~/.gnupg/gpg-agent.conf、編集して追加する必要がありましたpinentry-program /usr/bin/pinentry-gtk-2(このガイドに従ってwiki.archlinux.org/ index.php / GnuPG#pinentry
iakovos Gurulian

49

編集:Gitバージョン1.7.9以降、Gitコミットに署名することできgit commit -Sます()。これを反映するために回答を少し更新します。

質問のタイトルは次のとおりです。

GPGキーでGitにコミットを「自動署名」する方法はありますか?

短い答え:はい、しかしそれをしないでください。

質問のタイプミスに対処する:git commit -sコミットに署名しません。むしろ、man git-commitページから:

-s、--signoff
コミットログメッセージの最後にコミッターがSigned-off-by行を追加します。

これにより、次のようなログが出力されます。


± $ git log                                                                                 [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name 
Date:   Mon Apr 16 00:43:27 2012 +0200

    Added .gitignore

    Signed-off-by: User Name 

「Signed-off-by:...」ビットに注意してください。の-sフラグによって生成されgit-commitます。

リリース発表メールの引用:

  • 「git commit」は「-S」を学習してGPG署名にコミットしました。これは、「git log」の「--show-signature」オプションで表示できます。

ですから、コミットに署名できます。ただし、私は個人的にこのオプションには注意を促しています。コミットの自動署名は無意味なものの隣にあります。以下を参照してください:

余談ですが、コミットには署名しないでください。単一のコミットを送信するときに、タグだけを作成する必要があります。

そのとおりです。コミットは署名されていません。タグがあります。この理由は、Linus Torvaldsによるこのメッセージで確認できます。

各コミットへの署名は完全に愚かです。それはあなたがそれを自動化し、署名の価値を少なくすることを意味するだけです。また、SHA1のgit DAGチェーンが機能 するため、1つのシグネチャだけで、そのコミットから到達可能なすべてのコミットを効果的にカバーできます。したがって、各コミットに署名することは、要点を見逃しているだけです。

リンクされたメッセージを閲覧することをお勧めします。これにより、コミットに自動的に署名することが、私よりもはるかに良い方法ではない理由が明らかになります。

ただしタグに自動的に署名したい場合git-tag -[s|u]は、をエイリアスでラップすることで可能になります。これを行う場合は、キーID ~/.gitconfigまたはプロジェクト固有の.git/configファイルをセットアップする必要があります。そのプロセスの詳細については、gitコミュニティブックを参照してください。タグへの署名は、コミットごとに署名するよりもはるかに便利です。


74
「各コミットへの署名はまったくばかげています。」->偽の作者とコミッターにコミットをプッシュするのが好きな「ラット」開発者がいる場合、コミットを保護するためのより良い方法は何ですか?サーバーにフックマジックがない限り、彼はgit blame好きな人に向けることができます。
Vi。

11
0 記事私はと主張、」伝える方法> - 、1は「それらのすべてに署名するのに十分である」これは本当に私の差分(ただし、以前とさらにコミットがわからない)私は上の署名を載せていきたいと思います。私のコミット2.信頼されていない環境でも、誰が罪を犯しているかを確認するための信頼できるツールがあるはずです。すべてのコミットがコミッターのメールのキーで署名されていることをサーバーがチェックした場合、それは(あなたも、あなたのコンピュータを保護する場合)コミット偽へのハード。
Viに。

9
コードが変更されない場合は、1つのコミットに署名するだけで十分です。コミットを追加したら、さらに署名が必要になります。タグに署名すると、そのコミットよりも古いものすべてにマークが付けられます。コミットが来るときにきめ細かな検証が必要な場合は、各コミットに署名することは理にかなっています。それ以外の場合は、多くのタグを使用する必要があり、リポジトリを混乱させるだけです。認証されたリモートgitリポジトリでは、タグをプッシュするときだけでなく、コミットをプッシュするたびにパスワードまたはSSHキーを提供する必要があります。これは同様の状況です。
Hans-Christoph Steiner

22
ライナスは要点を逃しているような気がします。彼は、そのスレッドのOPとは異なり、署名されたコミットのユースケースがまったく異なるようです。(プロジェクト全体の整合性の検証と、単一のコミットの作成者の検証。)
Ajedi32

9
「はい、ただし行わない」の場合は-1。答えは、完全に「はい」のはずです。コミットに署名することで作者が証明されます。
ウルダ

6

自動署名をgitバージョン2.0より前に機能させるには、コミット用のgitエイリアスを追加する必要があります。

# git config --global alias.commit commit -S
[alias]
    commit = commit -S

0

コミットまたはタグに署名する場合、履歴全体を承認することを意味するものではないことを明確にする必要があります。コミットの場合は、手元の変更にのみ署名し、タグの場合は、まあ..意味を定義する必要があります。自分からであると主張するが、そうではないという変更をプルした可能性があります(他の誰かがそれをリモートにプッシュしたため)。または、変更を加えたくないが、タグに署名しただけです。

一般的なOSSプロジェクトではこれはあまり一般的ではないかもしれませんが、時々コードに触れるだけで、履歴全体を読まないエンタープライズシナリオでは、それが気付かれない可能性があります。

コミットの署名は、他の親にリベースされたり、厳選されたりする場合に問題になります。しかし、変更されたコミットが実際に検証する「元の」コミットを指すことができれば良いでしょう。


3
リベースはうそをつくようなものです。それは非常に控えめに使用されるべきです。もう1つは、署名でのコミットが「サインオフ」コードであることです。そのため、a)アンチCYAではなく、b)無駄な労力ではないことを確認してください。

11
@Barry「リベースは嘘のようなものです。非常に控えめに使用する必要があります。」–これは真実ではありません。リベースベースのワークフローは、マージベースのワークフローと同様に有効です。リベースはあまりにも強力であり、控えめに使用することはできません。
Lukas Juhrich、2015年

1
これを問題のないGitHubでのみ使用する場合、GitHubはこれをサポートしていないため、マージコミットは署名されません。この環境ですべての(マージしない)コミットに署名することの利点は、GPGキーで署名されないため、不正なコミットがPRを介して追加されたときに非常に明白になることです。
Arran Cudbard-Bell 2015

3
「コミットまたはタグに署名すると(両方とも履歴全体に署名します)、それが自分からのものであると主張する変更をプルした可能性があるので危険です」コミットに署名するだけの場合は、あなたから到達可能なすべてのコミットの承認。これらの過去の変更が有効である、または承認されていることを必ずしも表明しているのではなく、それらの変更に基づいてコミットを作成したことだけを表明しています。(タグがあっても、タグで到達可能なすべてのコミットを実際にサインオフしていることに同意します。)
Ajedi32

1
@ ArranCudbard-Bell更新と同様に、@ VonCのcommit.gpgsign提案に従ってtrueに設定すると、マージコミットに署名されます
Jay
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.