69

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

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

6 ответов6

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

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

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

ОБНОВИТЬ:

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

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

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

28

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

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

10

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

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

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

1

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

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

это будет подписывать все мои коммиты с первого начального коммита, а также обходить хук коммита, который я настроил с помощью лайки. Нет необходимости менять 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .