git の最近のバージョン (>= 1.7.9) は、GPG による個々のコミットへの署名をサポートしています。
ツリー内のすべてのコミットにさかのぼって署名することは可能ですか?
git の最近のバージョン (>= 1.7.9) は、GPG による個々のコミットへの署名をサポートしています。
ツリー内のすべてのコミットにさかのぼって署名することは可能ですか?
git commit
's --gpg-sign
(aka -S
)オプションからの署名は、コミットを識別するsha1ハッシュを生成するために使用されるデータの一部です。したがって、コミットにさかのぼって署名するには、それが行われたすべてのコミットのIDを変更する必要があります。
本当にやりたいのであれば、おそらくで何かをすることができますがgit filter-branch
、新しいコミットに署名する方が良いでしょう。すべての祖先のコミットIDは、新しいコミットによって署名されるデータに影響を与えるため、これにより、新しい署名済みコミットによる古いコミットのgpg検証が引き続き可能になります。
ツリー内のすべてのコミットにさかのぼって署名しますか?
はい:署名するタグを追加します。
コミットに署名する場合は、これが実際に推奨されるオプションです。それぞれに個別に署名するのではなく、タグを使用してすべてのセットに署名します。「受信後フックでプッシャーの情報を取得する方法は?
」を
参照してください。
Git 2.13.x/2.14 (2017 年第 3 四半期) のみが署名プロセスを完全に修正することに注意してください (2017 年 5 月の更新)。これは、" git cherry-pick
" およびその他のシーケンサー機構の使用と、最後の行が不完全な行であるトレーラー ブロックの取り扱いを誤ったためです。これは、既存の不完全な行を完了した後に
追加のサインオフなどが追加されるように修正されました。
Jonathan Tan ( )によるcommit 44dc738 (2017 年 4 月 26 日)を参照してください。( 2017 年 5 月 16 日のcommit 6ebfa10でJunio 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 9dad073、commit 26e28fe、commit 75d3bee、commit 20f4b04、commit 5b9427e、commit 8d2aa8d、commit 424e28f、commit e885a84、commit 185e865 (2020 年 9 月 30 日) by Jeff King ( peff
)を参照してください。
( 2020 年 10 月 5 日、コミット 19dd352でJunio C Hamanoによってマージされました)gitster
sequencer
ignore_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
が、トレーラーパーサーが内部で使用するのとまったく同じ関数を使用しているため、たまたま機能します。そして、それは現在の呼び出し元のすべてに当てはまるようですが、それを保証するものは何もありません. そもそも正しいバッファだけをトレーラ コードに供給したほうがよいでしょう。
コミットへの署名を開始したいポイントから新しいブランチを作成してみることができます。最近、秘密鍵にアクセスできないマシンで作成したブランチに対してこれを行いました。
# git checkout -b new-branch <last-signed-commit>
# git cherry-pick <first-unsigned-commit>
# git checkout unsigned-branch
# git rebase new-branch
これには、Git がコミットに自動的に署名するように構成されている必要があり、マージ コミットが多すぎてはいけません。そうしないと、リベースが奇妙に見えます。疑わしい場合は、コミットをチェリーピックしてください。選択された各コミットは署名されます。