Как сохранить фиксацию gpg-подписи после интерактивного сжатия rebase?

Когда я хочу раздавить некоторые коммиты интерактивным rebase:

git rebase -i HEAD~3

А потом:

pick cbd03e3 Final commit (signed)
s f522f5d bla-bla-bla (signed)
s 09a7b7c bla-bla (signed)

# Rebase c2e142e..09a7b7c onto c2e142e
...

Окончательный коммит не имеет gpg-подписи, несмотря на то, что все эти коммиты имеют одинаковую подпись. Можно ли сохранить gpg-подпись коммита после интерактивного сквош-перебазирования?


person Alexander Yancharuk    schedule 18.09.2013    source источник
comment
что все эти коммиты имеют одинаковую подпись, это не имеет никакого смысла. Вероятно, вы генерируете разные подписи из одного и того же ключа, но сами подписи не могут быть одинаковыми.   -  person chpio    schedule 07.05.2021


Ответы (4)


Как было сказано в Cupcake, вы не можете сохранить старую подпись из несжатых коммитов, но вы можете подписать новый сжатый коммит, если выполните перебазирование следующим образом:

git rebase --interactive [email protected] HEAD~4

Добавление [email protected] в качестве аргумента подпишет окончательный сжатый коммит.

person samurailink3    schedule 25.03.2015
comment
Хотел бы я дать этому больше голосов! Просто и легко! Большое спасибо. - person M. Porooshani; 29.08.2016
comment
Это все еще актуально в git 1.8.3.1 или новее? Запуск этой команды выдает это: error: unknown option '[email protected]' - person JWF; 17.07.2017
comment
@ jflory7 Я использую git 2.13.3, и это все еще актуально для меня. - person samurailink3; 31.07.2017
comment
если это не сработает, вы можете сделать git rebase -i HEAD~4 и отредактировать каждый коммит с помощью git commit --amend -S . - person Gabo Esquivel; 27.12.2017

Не имеет смысла, что вы могли бы. Весь смысл подписи gpg заключается в том, чтобы убедиться, что код не был подделан. Если бы вы могли сохранить подпись после изменения истории, это свело бы на нет всю цель.

В настоящее время я не подписываю свой код Git с помощью gpg, поэтому я не знаю точных деталей, но я предполагаю, что он, вероятно, хэширует окончательный объект фиксации дерева. Когда вы перебазируете, как в вашем примере, Final commit будет иметь другой идентификатор sha1, поэтому это не тот же объект, что и до перебазирования, поэтому иметь ту же подпись gpg, вероятно, невозможно, и, как я уже сказал, это не имеет смысла.

person Community    schedule 18.09.2013
comment
Это имеет смысл, если это ВАШИ коммиты, и вы хотите сохранить подпись (а не подпись). - person Andy Hayden; 08.11.2016
comment
@AndyHayden, тогда вам следует отказаться от коммитов. это помогло мне концептуально перед переустановкой проверки новой ветки. Я работаю над работой-01. Я делаю git checkout work-02. Я перебазирую, разрешаю конфликты слияния и сквош коммиты по мере необходимости. work-01 вообще не изменился. все коммиты все еще там и как они были. некоторые из коммитов также могут существовать в work-02, некоторые могут быть почти идентичными, но если один символ изменился, у него будет новый хэш-идентификатор коммита. это упражнение помогло мне понять git rebase. - person emory; 24.01.2018
comment
Это интересно, но мне интересно, действительно ли это на 100%. Мы работаем над ветками функций, и наш Gitlab настроен на разрешение MR только в том случае, если они могут быть перемотаны вперед (квазилинейная история), поэтому мы перебазируем эти ветки, если что-то изменилось в базовой ветке. Когда я фиксирую ветвь функции и подписываю фиксацию, тогда мой коллега перебазирует ветку, подпись GPG должна оставаться нетронутой, если фиксация выбрана без изменений (поэтому моя подпись все еще действительна, потому что это точный код, который я зафиксировал и подписал). Однако подпись GPG теряется, когда подписанный коммит перебазируется другим человеком (мы только что это проверили). - person Wirone; 20.03.2018

Чтобы подчеркнуть тот факт, что вы не храните подпись при перебазированных коммитах, в git 2.9.x+ (3 квартал 2016 г.) будет четко указано, что git pull --rebase не будет проверять подпись (поскольку часть перебазирования потеряет их)

См. commit c57e501 (20 мая 2016 г.) от Александр Хирш (``).
(Объединено Junio ​​C Hamano -- gitster -- в commit 73bc4b4, 20 июня 2016)

pull: предупредить об --verify-signatures с помощью --rebase

git-pull молча игнорирует параметр --verify-signatures при запуске --rebase, потенциально оставляя пользователей в уверенности, что операция перебазирования проверит действительные подписи GPG.

Обсуждалась реализация --verify-signatures для git rebase, но возникли сомнения в правильности рабочего процесса. Поскольку вы обычно объединяете чужие ветки со своей веткой, вам может быть интересно, чтобы на их стороне была действующая подпись GPG.

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

Предупреждаем пользователей, что опция --verify-signatures игнорируется во время "pull --rebase"; пользователей не интересует, что произойдет, если их коммиты не будут иметь приемлемой подписи.

person VonC    schedule 21.06.2016

Один из вариантов — установить для параметра commit.gpgSign значение true. Это всегда будет подписывать коммиты, включая перебазированные коммиты.

Чтобы сделать это локально в репо:

git config commit.gpgSign true

Чтобы сделать это глобально:

git config --global commit.gpgSign true
person PiotrWolkowski    schedule 27.04.2021