git – 古いコミットに GPG で署名できる?

git

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

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

  134  Magnus  2012-03-05


ベストアンサー

  1. インタラクティブリベースモードに入ります
  2. 署名したい各コミットの後に以下の行を追加します

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

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

UPDATE:

もっと簡単な方法があります

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

これは開発までのすべてをリベースしてくれるので(あるいはどんなハッシュでも)、すべてのコミットの後にコピペする必要はありません

131  Shubham Chaudhary  2016-09-13


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

最新のコミットに署名したいだけならば、git commit -S --amendが有効です

43  Will Ross  2012-05-24


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

そして、コミットごとにgit commit -S --amend --no-edit && git rebase --continue(Windowsの場合)を使っています

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

16  Illuminator  2016-04-09


私も同じ問題でつまずきましたが、ここに私の解決策があります

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

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

8  community wiki  None


現在のブランチの特定のコミット以降のすべてのコミットに GPG 署名をする必要がある場合は、以下のようにしてください

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

ここで <COMMIT> はコミット ID (例: abc123e5) です

これには、コミットのメタデータ (コミットの日付を含む) に影響を与えないという付加的な利点があります。ただし、コミットハッシュは変更されます (これは各コミットの内容のダイジェストであり、各コミットに署名が追加されるからです)

また、コミットするたびに GPG パスフレーズの入力を求められるのを止めたい場合は、こちらの回答も参照してください。https://askubuntu.com/a/805550

注意: GIT署名のためにgpgからgpg2に切り替える場合、秘密鍵をGPG 2に再インポートする必要があります

8  GuyPaddock  2018-10-20


特定のコミットだけをフィルタリングして、そのコミットだけに署名したい場合は 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

何らかの理由で自分のコミットだけに署名したい場合に便利です

5  Roberto Leinardi  2018-04-14


コミットに対するフィルタリングが不要な場合は、filter-branch よりも rebase を使用することが好ましいです

git rebase -i master --exec 'git commit --amend --no-edit --no-verify -S --reset-author'

そうでなければ、自分が所有していないコミットはそのままにしておきます。 ~/.gitconfigに以下のエイリアスを設定します(your@address.comをメールアドレスに置き換えてください)

resign = "!_() { : git checkout ; [ \"$#\" -eq 0 ] && echo 'Usage: resign <rev-list>' && exit 2; \
git filter-branch --commit-filter ' \
if [ \"$GIT_COMMITTER_EMAIL\" = \"your@address.com\" ]; then git commit-tree -S \"$@\"; else git commit-tree \"$@\"; fi' $1; }; _"

そして、例えば master から引っ張ってきた現在のブランチのコミットをすべて放棄するには、次のようにします

git resign master..

BarryModeRoberto Leinardi による過去の回答に謝意を表します

3  Julien Carsique  2019-12-13


これは私がすべてのコミットに使っているもので、履歴を書き換えます

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

0  Jubair  2020-04-23


最後のNのコミットをオフにするには、あなたも行うことができます

git rebase HEAD~N --signoff

0  Fardin  2020-07-28


タイトルとURLをコピーしました