Dapatkah Anda GPG menandatangani komitmen lama?

93

Git sekarang memiliki kemampuan untuk menandatangani komit git commit -S, yang sangat bagus, tetapi kadang-kadang saya lupa flagnya commit, dan kadang-kadang saya mengirimkan sendiri patch yang saya ajukan am, dan perintah itu tidak memiliki bendera untuk ditandatangani.

Apakah ada cara untuk menambahkan tanda tangan ke komit yang sudah direkam?

Magnus
sumber
2
Sebagai catatan, Anda dapat memberitahu git untuk selalu menandatangani komit melalui konfigurasi: git config commit.gpgsign true.
nicooga
@nicooga Saya berharap komentar Anda memiliki lebih banyak suara sehingga saya perhatikan ini sebelumnya. Saya harus mengajukan pertanyaan ini setidaknya setengah lusin kali, dan menetapkan bendera itu akan menyelamatkan saya banyak waktu.
Michael Ziluck

Jawaban:

78
  1. Masuk ke mode rebase interaktif.
  2. Tambahkan baris berikut setelah setiap komit yang ingin Anda tandatangani

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

Ini akan menjalankan perintah ini setelah memilih setiap komit.

MEMPERBARUI:

Cara yang lebih mudah untuk melakukan ini adalah:

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

Ini mengubah segalanya hingga pengembangan (atau hash apa pun) dan Anda tidak perlu menyalin paste setelah setiap komit.

Shubham Chaudhary
sumber
Ini hanya yang saya butuhkan untuk situasi yang benar-benar membosankan, terima kasih!
msouth
2
Oh, kuharap aku menemukan ini lebih cepat. Saya membaca banyak hal, bahkan dari GitHub sendiri, mengatakan bahwa Anda tidak dapat mengundurkan diri dari komitmen lama. Ini membuktikan bahwa itu sepenuhnya salah! Saya bisa menyelamatkan ratusan komit, yang sekarang saya hancurkan. Oh well ... terima kasih sudah berbagi! Saya membuat alias dari ini. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"menjadigit resign HASH
BarryMode
2
Ini harus menjadi pengetahuan umum! Anda telah melakukan pelayanan yang luar biasa untuk kemanusiaan (tidak ada sarc!)!
hopeseekr
3
Tidak ada alasan untuk rebase sama sekali. Lari saja git commit --amend --no-edit -n -S.
Pertanyaan Quolonel
9
Apakah ini tidak mengubah sejarah, membutuhkan git push --force?
Steve
33

Menandatangani komit mengubah isinya, jadi komit yang lebih baru tergantung padanya akan mengubah hash mereka.

Jika Anda hanya ingin menandatangani komit terbaru, git commit -S --amendakan berhasil.

Will Ross
sumber
13

Saya menggunakan git rebase -i --root(lihat Sejarah Penulisan Ulang ) dan berubah pickmenjadi edit.

Kemudian saya menggunakan git commit -S --amend --no-edit && git rebase --continue (pada Windows) untuk setiap commit.

Ini secara manual masuk untuk setiap komit. Saya harap kami akan menemukan solusi yang lebih baik.

Iluminator
sumber
Saya memiliki direktori home saya sebagai git repo (untuk dotfiles). Beberapa program secara interaktif menerima perubahan sebagai perubahan kembali, lucu melihat sejarah diputar ulang secara langsung. Cukup lambat karena penandatanganan lambat
Avindra Goolcharan
2

Saya juga menemukan masalah yang sama dan inilah solusi saya:

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

ini akan menandatangani semua komit saya dari komit awal pertama dan juga memotong komit yang saya atur menggunakan husky . Tidak perlu diubah pickkeedit .

DrSensor
sumber
1

Jika Anda ingin memfilter hanya komit tertentu dan hanya menandatanganinya, Anda dapat menggunakan filter-branch:

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "[email protected]" ];
  then git commit-tree -S "$@";
  else git commit-tree "$@";
  fi' HEAD

Ini berguna jika, karena alasan tertentu, Anda hanya ingin menandatangani komitmen Anda sendiri.

Roberto Leinardi
sumber
0

Jika Anda perlu GPG menandatangani semua komitmen SEJAK komit tertentu pada cabang saat ini, Anda dapat menggunakan yang berikut ini sebagai gantinya:

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

Di mana <COMMIT>id komit (misalnya abc123e5).

Ini memiliki manfaat tambahan sehingga tidak mengganggu metadata komit (termasuk tanggal komit).

Jika Anda juga ingin berhenti diminta untuk memasukkan frasa sandi GPG Anda di setiap komit, lihat juga jawaban ini: https://askubuntu.com/a/805550

CATATAN: Beralih dari gpgke gpg2untuk penandatanganan GIT akan mengharuskan Anda mengimpor kembali kunci pribadi Anda di GPG 2.

GuyPaddock
sumber