Czy GPG może podpisywać stare zobowiązania?

93

Git ma teraz możliwość podpisywania zatwierdzeń git commit -S, co jest świetne, ale czasami zapominam flagę commit, a czasami wysyłam sobie łatki, które stosuję am, a to polecenie nie ma flagi do podpisywania.

Czy istnieje sposób na dodanie podpisu do już zarejestrowanego zatwierdzenia?

Magnus
źródło
2
Dla przypomnienia, można powiedzieć git zawsze podpisać zobowiązuje poprzez konfigurację: git config commit.gpgsign true.
nicooga,
@nicooga Chciałbym, żeby twój komentarz miał więcej pozytywnych opinii, więc zauważyłem to wcześniej. Musiałem poruszyć to pytanie co najmniej pół tuzina razy, a ustawienie tej flagi pozwoliłoby mi zaoszczędzić sporo czasu.
Michael Ziluck

Odpowiedzi:

78
  1. Przejdź do interaktywnego trybu bazowania.
  2. Dodaj następujący wiersz po każdym zatwierdzeniu, które chcesz podpisać

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

Uruchomi to polecenie po wybraniu każdego zatwierdzenia.

AKTUALIZACJA:

Łatwiejszym sposobem na to jest:

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

Spowoduje to zmianę wszystkiego do momentu opracowania (lub dowolnego skrótu) i nie musisz kopiować wklejania po każdym zatwierdzeniu.

Shubham Chaudhary
źródło
Właśnie tego potrzebowałem do tego, co byłoby naprawdę nudne, dziękuję!
msouth
2
Och, szkoda, że ​​nie znalazłem tego wcześniej. Czytam tak wiele rzeczy, nawet z samego GitHub, mówiąc, że nie możesz zrezygnować ze starych zobowiązań. To dowodzi, że to całkowicie nieprawda! Mógłbym uratować setki zobowiązań, które teraz zmiażdżyłem. No cóż ... dzięki za udostępnienie! Zrobiłem z tego alias. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"staje sięgit resign HASH
BarryMode
2
To powinna być powszechna wiedza! Wykonaliście wspaniałą służbę dla ludzkości (bez sark!)!
hopeseekr
3
W ogóle nie ma powodu, by się opierać. Po prostu biegnij git commit --amend --no-edit -n -S.
Pytania do kolonela
9
Czy to nie zmienia historii, wymagając git push --force?
Steve
33

Podpisanie zatwierdzenia zmienia jego zawartość, więc nowsze zatwierdzenia w zależności od niego zmienią ich skrót.

Jeśli chcesz tylko podpisać ostatnie zatwierdzenie, git commit -S --amendzadziała.

Will Ross
źródło
13

Używam git rebase -i --root(patrz Historia przepisywania ) i zmieniam pickna edit.

Następnie używam git commit -S --amend --no-edit && git rebase --continue (w systemie Windows) dla każdego zatwierdzenia.

Jest to ręcznie znak dla każdego zatwierdzenia. Mam nadzieję, że znajdziemy lepsze rozwiązanie.

Iluminator
źródło
Mam swój katalog domowy jako repozytorium git (dla plików dotfile). Niektóre programy interaktywnie wychwytują zmiany w celu ich zmiany, zabawnie jest oglądać historię odtwarzaną na żywo. Jest wystarczająco wolny, ponieważ podpisywanie jest powolne
Avindra Goolcharan
2

Natknąłem się również na ten sam problem i oto moje rozwiązanie:

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

spowoduje to podpisanie wszystkich moich zatwierdzeń od pierwszego początkowego zatwierdzenia, a także obejście haka zatwierdzania, który ustawiłem za pomocą husky . Nie trzeba zmieniać picknaedit .

DrSensor
źródło
1

Jeśli chcesz filtrować tylko określone zatwierdzenia i podpisywać tylko je, możesz użyć filter-branch:

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

Jest to przydatne, jeśli z jakiegoś powodu chcesz podpisywać tylko własne zatwierdzenia.

Roberto Leinardi
źródło
0

Jeśli musisz podpisać GPG, wszystkie zatwierdzenia SINCE od konkretnego zatwierdzenia w bieżącym oddziale, możesz użyć następujących poleceń:

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

Gdzie <COMMIT>jest identyfikator zatwierdzenia (np abc123e5.).

Ma to tę dodatkową zaletę, że nie zakłóca metadanych zatwierdzenia (w tym daty zatwierdzenia).

Jeśli chcesz zrezygnować z monitu o podanie hasła GPG przy każdym zatwierdzeniu, zapoznaj się również z odpowiedzią: https://askubuntu.com/a/805550

UWAGA: Przełączenie z gpgna w gpg2celu podpisywania GIT będzie wymagało ponownego zaimportowania klucza prywatnego w GPG 2.

GuyPaddock
źródło