web-dev-qa-db-ja.com

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

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

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

エイリアスcommit = commit -S

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

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

ちょっとした質問ですが、Homebrewなどのプロジェクトに単一のコミットを送信するときに、コミットには署名せず、タグのみを作成する必要があります。

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

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

UPDATE:新しいgit edict ごとに、すべての設定キーはcamelCaseにある必要があります。

150
Felipe

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

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

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

簡単な答え:はい、でもやらないでください。

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

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

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


± $ 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:...」ビットに注意してください。 -sgit-commitフラグによって生成されました。

リリース発表メール

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

そのため、コミットに署名できます。ただし、このオプションには個人的に注意を促します。 自動的にコミットの署名はほとんど意味がありません。以下を参照してください:

ただの質問ですが、たぶんコミットは署名されるべきではなく、タグだけが作成されるべきであり、私は単一のコミットを送信するので、決して作成しません。

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

各コミットに署名することはまったくばかげています。それはあなたがそれを自動化することを意味し、あなたは署名の価値を減らします。また、SHA1のgit DAGチェーンの動作方法から、実際の価値を追加することはありません。one署名のみで、そのコミットからすべてのコミットに到達できるようになります。したがって、各コミットに署名するだけでは、ポイントが失われます。

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

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

48
simont

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

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

コミットまたはタグに署名する場合、履歴全体を承認するという意味ではないことを明確にする必要があります。コミットの場合は、手元の変更に署名するだけです。タグの場合は、それで何を意味するのかを定義する必要があります。あなたはそれがあなたからであると主張するが、そうではなかった変更を引っ張ったかもしれません(誰かがあなたのリモートにそれをプッシュしたため)。または、変更したいのですが、タグに署名しただけです。

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

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

0
eckes