GPGは古いコミットに署名できますか?


93

Gitはでコミットに署名できるようになりましたgit commit -S。これは素晴らしいですが、時々にフラグを忘れたり、commit適用するパッチを自分にメールで送信しamたり、そのコマンドには署名用のフラグがありません。

すでに記録されたコミットに署名を追加する方法はありますか?


2
記録のために、構成を介してコミットに常に署名するようにgitに指示できますgit config commit.gpgsign true
nicooga

@nicoogaあなたのコメントにもっと賛成票があればいいのにと思います。私はこの質問を少なくとも半ダースで解決しなければならなかったので、そのフラグを設定することで時間を節約できました。
マイケルジラック

回答:


78
  1. 対話型リベースモードに移行します。
  2. 署名する各コミットの後に次の行を追加します

    exec git commit --amend --no-edit -S

これは、各コミットを選択した後にこのコマンドを実行します。

更新:

これを行う簡単な方法は次のとおりです。

git rebase --exec 'git commit --amend --no-edit -n -S' -i development

これにより、開発(または任意のハッシュ)まですべてがリベースされ、コミットするたびに貼り付けをコピーする必要がなくなります。


これは本当に退屈な状況になるために必要なものでした、ありがとう!
-msouth

2
ああ、私はこれをもっと早く見つけたかったのに。GitHub自体からでさえ、古いコミットを辞任できないと言って、私は非常に多くのことを読みました。これは完全に偽であることを証明しています!数百のコミットを保存できたかもしれませんが、今ではそれをつぶしています。まあ...共有してくれてありがとう!これからエイリアスを作成しました。resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"になるgit resign HASH
-BarryMode

2
これは常識であるべきです!あなたは人類に素晴らしいサービスを提供しました(サルクなし!)!
hopeseekr

3
リベースする理由はまったくありません。実行するだけgit commit --amend --no-edit -n -Sです。
Quolonel質問

9
これは履歴を変更しませんgit push --forceか?
スティーブ

33

コミットに署名するとその内容が変更されるため、それに依存する最近のコミットではハッシュが変更されます。

最新のコミットに署名したいだけなら、うまくいきますgit commit -S --amend


13

を使用してgit rebase -i --root(「履歴の書き換え」を参照)、に変更pickeditます。

次に、各コミットにgit commit -S --amend --no-edit && git rebase --continue (Windowsで)使用します

これは、コミットごとに手動で署名します。より良い解決策が見つかることを願っています。


ホームディレクトリをgitリポジトリ(ドットファイル用)として持っています。いくつかのプログラムは、ライブでリプレイされている履歴を見るのがおもしろく、リベースとして変更をインタラクティブにピックアップします。署名が遅いため十分に遅い
アビンドラグールチャラン

2

私も同じ問題に出くわしました。これが私の解決策です。

git rebase -i --root --exec 'git commit --amend --no-edit --no-verify -S'

これは、最初の最初のコミットからのすべてのコミットに署名し、ハスキーを使用して設定したコミットフックバイパスします。に変更する必要ありませんpickedit


1

特定のコミットのみをフィルタリングし、それらにのみ署名する場合は、次を使用できますfilter-branch

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "user@domain.com" ];
  then git commit-tree -S "$@";
  else git commit-tree "$@";
  fi' HEAD

これは、何らかの理由で、自分のコミットのみに署名したい場合に便利です。


0

現在のブランチの特定のコミット以降、すべてのコミットにGPGで署名する必要がある場合は、代わりに次を使用できます。

git filter-branch --commit-filter 'git commit-tree -S "$@";' <COMMIT>..HEAD

<COMMIT>コミットIDはどこにありますか(例abc123e5)。

これには、コミットメタデータ(コミット日を含む)を妨げないという追加の利点があります。

また、コミットのたびにGPGパスフレーズの入力を求められないようにする場合は、https//askubuntu.com/a/805550ご覧ください。

注:からの切り替えgpggpg2GIT署名には、GPG 2で再インポートする秘密鍵にあなたが必要となります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.