GPG eski komisyonları imzalayabilir misiniz?


93

Git artık imza atma kabiliyetine sahip git commit -S, ki bu harika, ama bazen bayrağını unutacağım commitve bazen kendime başvurduğum yamaları gönderiyorum amve bu komutun imza için bir bayrağı yok.

Önceden kaydedilmiş bir taahhüde imza eklemenin bir yolu var mı?


2
Kayıt için, her zaman yapılandırma aracılığıyla kaydedilmesini imzalamak için git söyleyebilirim: git config commit.gpgsign true.
nicooga

@nicooga Yorumunuzun daha fazla oy almasını diliyorum, bu yüzden bunu daha önce fark ettim. Bu soruyu en az yarım düzine defa çözmem gerekti ve bu bayrağın ayarlanması beni bir sürü zaman kazandıracaktı.
Michael Ziluck

Yanıtlar:


78
  1. Etkileşimli rebase moduna geçin.
  2. İmzalamak istediğiniz her işlemden sonra aşağıdaki satırı ekleyin

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

Bu, her bir işlemi seçtikten sonra bu komutu çalıştıracaktır.

GÜNCELLEME:

Bunu yapmanın daha kolay yolu:

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

Bu gelişme (veya herhangi bir karmaşa) kadar her şeyi yeniden doğurur ve her işlemden sonra yapıştırmayı kopyalamanız gerekmez.


Bu gerçekten çok sıkıcı bir durum olacak için ihtiyacım olan şeydi, teşekkür ederim!
msouth

2
Oh keşke bunu daha erken bulmuş olsaydım. Eski işleri istifa edemeyeceğini söyleyerek GitHub’ın kendilerinden bile pek çok şey okudum. Bu tamamen yanlış olduğunu kanıtlıyor! Şimdi ezilmiş olduğum yüzlerce komisyonu biriktirebilirdim. Oh iyi ... paylaşım için teşekkürler! Bundan bir takma ad yaptım. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"olurgit resign HASH
BarryMode

2
Bu ortak bilgi olmalı! İnsanlık için çok iyi bir hizmet yaptınız (hayır!)!
hopeseekr

3
Yeniden diriltmek için hiçbir sebep yok. Sadece koş git commit --amend --no-edit -n -S.
Quolonel, 6:18

9
Bu, tarih gerektiren bir değişiklik yapmaz mı git push --force?
Steve,

33

Bir taahhüdü imzalamak içeriğini değiştirir, bu yüzden daha yeni taahhütler bağlılıklarını değiştirir.

Sadece en son taahhüdünüzü imzalamak istiyorsanız, git commit -S --amendişe yarayacaktır.


13

Kullandığım git rebase -i --root(bkz Geçmiş Yeniden Yazma ) ve değişim pickiçin edit.

Sonra her görev için git commit -S --amend --no-edit && git rebase --continue (Windows'ta) kullanıyorum .

Bu, her bir taahhüt için manuel olarak işarettir. Umarım daha iyi bir çözüm buluruz.


Ev dizini bir git repo (dotfiles için) olarak sahibim. Bazı programlar etkileşimli olarak yeniden doğuş olarak değişimleri algılarlar, yeniden oynatılmakta olan tarihi canlı olarak görmek komiktir. Yeterince yavaş, çünkü imza yavaş.
Avindra Goolcharan

2

Ben de aynı problemle karşılaştım ve işte benim çözümüm:

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

bu, ilk taahhüdümdeki tüm taahhütlerimi imzalayacak ve ayrıca husky kullanarak kurduğum taahhüt kancasını atlayacak . Gerek değiştirmek için .pickedit


1

Yalnızca belirli taahhütleri filtrelemek ve imzalamak istiyorsanız, bunları kullanabilirsiniz 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

Bir nedenden ötürü, yalnızca kendi taahhütlerinizi imzalamak istiyorsanız, bu kullanışlıdır.


0

Tüm GPG imzalamanız gerekiyorsa, SINCE'e şu anki dalda belirli bir taahhütte bulunduğunu taahhüt ederseniz, aşağıdakileri kullanabilirsiniz:

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

<COMMIT>Taahhüt kimliği nerede (örneğin abc123e5).

Bunun, taahhüt meta verilerini (taahhüt tarihi de dahil olmak üzere) rahatsız etmemesi avantajını ekledi.

Ayrıca her işlem için GPG şifrenizin sorulmasını istemezseniz, şu cevaba bakınız: https://askubuntu.com/a/805550

NOT: geçiş gpgiçin gpg2GYTE imzalanması için GPG 2'de yeniden içe özel anahtar etmenizi gerektirecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.