Git はコミットに git commit -S
で署名できるようになりました。これは素晴らしいことですが、たまに commit
へのフラグを忘れてしまったり、am
で適用したパッチを自分にメールで送ってしまうことがあり、そのコマンドには署名のフラグがありません
すでに記録されているコミットに署名を追加する方法はありますか?
134 Magnus 2012-03-05
- インタラクティブリベースモードに入ります
署名したい各コミットの後に以下の行を追加します
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
( 履歴の書き換え を参照) を使用し、pick
をedit
に変更しています
そして、コミットごとに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 で設定したコミットフックをバイパスします。pick
をedit
に変更する必要はありません
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..
BarryMode と Roberto 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