Можете ли вы подписать старые коммиты GPG?

93

Теперь у Git есть возможность подписывать коммиты git commit -S, что замечательно, но иногда я забываю флаг commit, а иногда я отправляю по почте патчи, к которым я применяю am, и у этой команды нет флага для подписи.

Есть ли способ добавить подпись в уже записанный коммит?

Магнус
источник
2
Для записи, вы можете сказать , мерзавцу всегда подписывать фиксации через конфигурацию: git config commit.gpgsign true.
NICOOGA
@nicooga Я хотел бы, чтобы у вашего комментария было больше голосов, поэтому я заметил это раньше. Мне приходилось поднимать этот вопрос как минимум полдюжины раз, и установка этого флага сэкономила бы мне кучу времени.
Майкл Зилук

Ответы:

78
  1. Войдите в интерактивный режим перебазирования.
  2. Добавьте следующую строку после каждого коммита, который вы хотите подписать

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

Это запустит эту команду после выбора каждого коммита.

ОБНОВИТЬ:

Более простой способ сделать это:

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

Это сбрасывает все до разработки (или любого хэша), и вам не нужно копировать вставить после каждого коммита.

Шубхам Чаудхари
источник
Это было как раз то, что мне было нужно, потому что это была бы действительно утомительная ситуация, спасибо!
MSN
2
О, если бы я нашел это раньше. Я читал так много вещей, даже от самого GitHub, говоря, что вы не можете отказаться от старых коммитов. Это доказывает, что совершенно неверно! Я мог бы спасти сотни коммитов, которые я теперь раздавил. Ну что ж ... спасибо, что поделились! Я сделал псевдоним из этого. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"становитсяgit resign HASH
BarryMode
2
Это должно быть общеизвестно! Вы сделали великое служение человечеству (без сарка!)!
hopeseekr
3
Там нет причин, чтобы перебазировать вообще. Просто беги git commit --amend --no-edit -n -S.
Quolonel Questions
9
Разве это не меняет историю, требуя git push --force?
Стив
33

Подписание коммита изменяет его содержимое, поэтому более поздние коммиты в зависимости от него меняют свой хеш.

Если вы просто хотите подписать самый последний коммит, git commit -S --amendсработает.

Уилл Росс
источник
13

Я использую git rebase -i --root(см. Переписывание истории ) и меняю pickна edit.

Затем я использую git commit -S --amend --no-edit && git rebase --continue (в Windows) для каждого коммита.

Это знак вручную для каждого коммита. Я надеюсь, что мы найдем лучшее решение.

осветитель
источник
У меня есть домашний каталог в качестве git-репо (для точечных файлов). Некоторые программы в интерактивном режиме воспринимают изменения как перебазирование, забавно видеть, что история воспроизводится вживую. Он достаточно медленный, потому что подпись медленная
Авиндра Гулчаран
2

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

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

это подпишет все мои коммиты с первого начального коммита, а также обойдет хук коммита, который я настроил с помощью лайки . Не нужно менять pickнаedit .

DrSensor
источник
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.

GuyPaddock
источник