5

git の最近のバージョン (>= 1.7.9) は、GPG による個々のコミットへの署名をサポートしています。

ツリー内のすべてのコミットにさかのぼって署名することは可能ですか?

4

3 に答える 3

4

git commit's --gpg-sign(aka -S)オプションからの署名は、コミットを識別するsha1ハッシュを生成するために使用されるデータの一部です。したがって、コミットにさかのぼって署名するには、それが行われたすべてのコミットのIDを変更する必要があります。

本当にやりたいのであれば、おそらくで何かをすることができますがgit filter-branch、新しいコミットに署名する方が良いでしょう。すべての祖先のコミットIDは、新しいコミットによって署名されるデータに影響を与えるため、これにより、新しい署名済みコミットによる古いコミットのgpg検証が引き続き可能になります。

于 2012-11-22T03:16:46.587 に答える
2

ツリー内のすべてのコミットにさかのぼって署名しますか?

はい:署名するタグを追加します
コミットに署名する場合は、これが実際に推奨されるオプションです。それぞれに個別に署名するのではなく、タグを使用してすべてのセットに署名します。「受信後フックでプッシャーの情報を取得する方法は?
」を 参照してください。


Git 2.13.x/2.14 (2017 年第 3 四半期) のみが署名プロセスを完全に修正することに注意してください (2017 年 5 月の更新)。これは、" git cherry-pick" およびその他のシーケンサー機構の使用と、最後の行が不完全な行であるトレーラー ブロックの取り扱いを誤ったためです。これは、既存の不完全な行を完了した後に
追加のサインオフなどが追加されるように修正されました。

Jonathan Tan ( )によるcommit 44dc738 (2017 年 4 月 26 日)を参照してください。( 2017 年 5 月 16 日のcommit 6ebfa10Junio C Hamanoによってマージされました)jhowtan
gitster

sequencer: フッターを追加する前に改行を追加します

改行で終わらないコミット メッセージに遭遇した場合、シーケンサーは空白行を追加する必要があるかどうかを判断する前に行を完了しません。
これにより、" (cherry picked..." とサインオフの行が、コミット メッセージの最後の行と同じ行に表示されることがあります

この動作は、コミット 967dfd4 (「シーケンサー: トレーラーのトレーラー レイアウトを使用する」、2016-11-29) によって導入されました。ただし、そのコミットを元に戻しても、この問題は完全には解決されません。そのコミットの前は、適合するフッターは has_conforming_footer()終了改行がない場合に不適合であると見なされ、適合するフッターと不適合のフッターの両方が同じように扱われる結果になりました。あるべきではないとき。

準拠フッターと非準拠フッターの両方、および と の両方do_pick_commit()append_signoff()フッターの適合性をチェックする前に、改行で終わらない場合は常にコミット メッセージに改行を追加することで、この問題を解決します。


Git 2.29 (2020 年第 4 四半期) では、これはより信頼性が高くなります。

commit 842385b、commit 9dad073commit 26e28fecommit 75d3beecommit 20f4b04commit 5b9427ecommit 8d2aa8dcommit 424e28fcommit e885a84commit 185e865 (2020 年 9 月 30 日) by Jeff King ( peff)を参照してください。
( 2020 年 10 月 5 日、コミット 19dd352Junio C Hamanoによってマージされました)gitster

sequencerignore_footer:トレーラーを解析するときのハンドル

署名者: Jeff King

このappend_signoff()関数は"ignore_footer"引数を取ります。これは、メッセージ バッファの末尾にある考慮すべきではないバイト数を指定します (トレーラーを含めることはできず、トレーラーはそれらの前に挿入されます)。

しかし、既存の予告編を見つけるために、 を呼び出しますhas_conforming_trailer()。その関数はignore_footerパラメーターを取りますが、967dfd4d56 (" sequencer: トレーラーのトレーラー レイアウトを使用する"、2016-11-02、Git v2.12.0-rc0 --バッチ #2にリストされているマージ) 以降、パラメーターは完全に無視されます。

私たちが使用しているトレーラ インターフェイスは単一の文字列を取り、文字列の一部を使用するように指示するオプションはありません。ただし、変更可能な があるためstrbuf、単に境界をNUL.

これが実際に実際にバグを引き起こす可能性があるかどうかはわかりません。次のようにすることで、ゼロ以外を簡単に取得できますignore_footer

git commit -F - --cleanup=verbatim <<-EOF
subject  

body  

Signed-off-by: me  

# this looks like a comment, but is actually in the
# message! That makes the earlier s-o-b fake.
EOF  

git commit --amend -s  

ヘッダignore_non_trailer()となる "#" cruft をカウントアップするgit-commit 呼び出しがあります。ignore_footerしかし、このパッチがなくても機能します。これは、トレーラー コードクラフトを呼び出しignore_non_trailer()てスキップするためです。したがって、ゼロ以外の呼び出し元のみignore_footerが、トレーラーパーサーが内部で使用するのとまったく同じ関数を使用しているため、たまたま機能します。

そして、それは現在の呼び出し元のすべてに当てはまるようですが、それを保証するものは何もありません. そもそも正しいバッファだけをトレーラ コードに供給したほうがよいでしょう。

于 2012-11-22T07:13:13.480 に答える
1

コミットへの署名を開始したいポイントから新しいブランチを作成してみることができます。最近、秘密鍵にアクセスできないマシンで作成したブランチに対してこれを行いました。

# git checkout -b new-branch <last-signed-commit>
# git cherry-pick <first-unsigned-commit>
# git checkout unsigned-branch
# git rebase new-branch

これには、Git がコミットに自動的に署名するように構成されている必要があり、マージ コミットが多すぎてはいけません。そうしないと、リベースが奇妙に見えます。疑わしい場合は、コミットをチェリーピックしてください。選択された各コミットは署名されます。

于 2015-07-24T18:57:06.943 に答える