Чи можете ви підписати GPG старі комісії?


87

Тепер Git має можливість підписувати коміти з git commit -S, що чудово, але іноді я забуваю прапор commit, а іноді надсилаю собі патчі, до яких я застосовую am, і ця команда не має прапор для підписання.

Чи є спосіб додати підпис до вже записаного комітету?


1
Для запису, ви можете сказати , мерзотнику завжди підписувати фіксації через конфігурацію: git config commit.gpgsign true.
nicooga

Відповіді:


74
  1. Перейдіть в режим інтерактивного ребазування.
  2. Додайте наступний рядок після кожного зобов'язання, яке ви хочете підписати

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

Ця команда буде запущена після вибору кожного комітету.

ОНОВЛЕННЯ:

Найпростіший спосіб зробити це:

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

Це відновлює все до розробки (або будь-якого хешу), і вам не доведеться копіювати пасту після кожного введення.


Це було якраз те, що мені потрібно для того, що було б справді нудною ситуацією, дякую!
msouth

2
О, я б хотів, щоб я знайшов це раніше. Я читав так багато речей, навіть від самого GitHub, кажучи, що не можна відмовлятися від старих зобов’язань. Це доводить, що абсолютно помилково! Я міг би врятувати сотні комітетів, які я зараз розбив. Ну добре ... дякую за обмін! Я зробив псевдонім із цього. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"стаєgit resign HASH
BarryMode

2
Це повинно бути загальновідомим! Ви зробили чудову послугу для людства (без сарка!)!
hopeseekr

2
Взагалі немає підстав для відновлення. Просто біжи git commit --amend --no-edit -n -S.
питання Quolonel

8
Чи це не змінює історію, вимагаючи git push --force?
Стів

31

Підписання зобов’язання змінює його вміст, тому новіші комісії залежно від нього змінять хеш.

Якщо ви просто хочете підписати останню комісію, git commit -S --amendбуде працювати.


12

Я використовую git rebase -i --root(див. Історію переписування ) та переходжу pickна edit.

Тоді я використовую git commit -S --amend --no-edit && git rebase --continue (у Windows) для кожної комісії.

Це підписується вручну для кожного комітету. Я сподіваюся, що ми знайдемо краще рішення.


У мене домашній каталог є git repo (для dotfiles). Деякі програми в інтерактивному режимі вибирають зміни як їх оновлення, і смішно бачити історію, яка відтворюється в прямому ефірі. Це досить повільно, оскільки підписання відбувається повільно
Авіндра Голчаран

2

Я також натрапив на ту ж проблему, і ось моє рішення:

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

це підпише всі мої зобов’язання з першого початкового комітету, а також обійде гачок фіксації, яку я встановив за допомогою husky . Немає необхідності змінювати pickвedit .


1

Якщо ви хочете відфільтрувати лише певні комісії та підписати лише їх, ви можете використовувати 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

Це корисно, якщо ви з якоїсь причини хочете підписати лише власні зобов’язання.


0

Якщо вам потрібно підписати GPG, усі зобов’язуються з певної комісії в поточній гілці, замість цього ви можете скористатись наступним:

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

Де <COMMIT>ідентифікатор фіксації (наприклад abc123e5).

Це має додаткову вигоду, що вона не порушує метадані фіксації (включаючи дату виконання).

Якщо ви також хочете перестати отримувати запит на отримання парольної фрази GPG під час кожного перегляду, також перегляньте цю відповідь: https://askubuntu.com/a/805550

ПРИМІТКА. Для переходу gpgна gpg2підпис для GIT потрібно буде повторно імпортувати приватний ключ у GPG 2.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.