Есть ли способ "autosign" совершает в Git с помощью GPG-ключа?

Есть ли простой способ сделать, что Git всегда подписывает каждый созданный фиксатор или тэг?

Я попробовал это с чем-то вроде:

alias commit = commit -S

Но это не помогло.

Я не хочу устанавливать другую программу, чтобы это произошло. Удобно ли это?

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

Ответ 1

Примечание: если вы не хотите добавлять -S все время, чтобы убедиться, что ваши коммиты подписаны, есть предложение (ветвь "pu" на данный момент, декабрь 2013 года, поэтому не гарантируйте, что это сделает это к выпуску git), чтобы добавить конфигурацию, которая позаботится об этом для вас.
Обновление в мае 2014 года: оно находится в git 2.0 (после повторно отправить в эту патч-серию)

См. зафиксировать 2af2ef3 Nicolas Vigier (boklm)

Добавьте параметр commit.gpgsign для подписания всех коммитов

Если вы хотите, чтобы GPG подписывал все ваши коммиты, вы должны добавить параметр -S все время.
Параметр commit.gpgsign config позволяет автоматически подписывать все фиксации.

commit.gpgsign

Логическое значение для указания, должны ли все коммиты подписываться GPG.
Использование этой опции при выполнении операций, таких как rebase, может привести к подписанию большого количества подписанных коммитов. Может быть удобно использовать агент, чтобы не вводить кодовую фразу GPG несколько раз.


Эта конфигурация обычно устанавливается на репо (вам не нужно подписывать частные экспериментальные локальные репозитории):

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true

Вы объединили бы это с user.signingKey, используемым как глобальный параметр (уникальный ключ, используемый для всех репо, где вы хотите подписать фиксацию)

git config --global user.signingkey F2C7AB29

user.signingKey был введен в git 1.5.0 (январь 2007) с commit d67778e:

Не должно быть требования, чтобы я использовал ту же форму моего имени в мой репозиторий git и мой ключ gpg.
Кроме того, у меня может быть несколько ключей в моем брелоке и, возможно, захотите использовать тот, который не совпадает с адресом, который я использую в сообщениях фиксации.

Этот патч добавляет запись конфигурации "user.signingKey", которая, если она присутствует, будет передана в "-u" для gpg, позволяя переопределить ключ подписывания тегов.

Это выполняется с помощью commit aba9119 (git 1.5.3.2), чтобы поймать случай, если пользователь неправильно сконфигурировал user.signingKey в их .git/config или просто не имеет секретных ключей в их keyring.

Примечания:

  • По соглашению с git 2.4.0 март 2015 г., это signingKey, а не signingKey, хотя клавиши git config нечувствительны к регистру. Это имеет значение только в том случае, если вы выполняете git config --get-regexp, который чувствителен к регистру, в противном случае это только соглашение с читабельностью;
  • Если вы хотите, чтобы сервер git проверял подпись для каждого нажатия, вам понадобится git 2.2+ (октябрь 2014) по крайней мере ( commit b945901), поскольку git push --signed не рассмотрел user.signingKey значение конфигурации;
  • git 2.9 (Июнь 2016) будет использовать user.signingKey для принудительного подписания аннотированных тегов, а также совершает: commit 61c2fe0.

Ответ 3

Изменить: с Git версия 1.7.9 можно подписать Git commits (git commit -S). Немного обновить ответ, чтобы это отразить.

Заголовок вопроса:

Есть ли способ "автосогласования" совершать в Git с помощью GPG-ключа?

Короткий ответ: да, но не делайте этого.

Адресация опечатки в вопросе: git commit -S не подписывает commit. Скорее, на странице man git-commit:

-s, --signoff
       Добавить выведенную строку коммиттера в конце сообщения журнала фиксации.

Здесь выдается журнал, похожий на следующий:


± $ git log                                                                                 [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name 
Date:   Mon Apr 16 00:43:27 2012 +0200

    Added .gitignore

    Signed-off-by: User Name 

Обратите внимание на бит "Отключен:..."; который был создан флагом -s на git-commit.

Цитата опубликовать объявление электронной почты:

  • "git зафиксировать" узнал "-S" для GPG-знака commit; это можно показать с опцией "--show-signature" для "git log".

Итак, вы можете подписывать коммиты. Тем не менее, я лично настоятельно рекомендую эту опцию; автоматическое подписание коммитов рядом с бессмысленным, см. ниже:

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

Это правильно. Записи не подписаны; теги. Причину этого можно найти в этом сообщении Линус Торвальдс, последний абзац которого гласит:

Подписание каждое совершение абсолютно глупо. Это просто означает, что вы его автоматизируете, и вы сделать подпись стоит меньше. Он также не добавляет никакой реальной ценности, поскольку как работает Git DAG-цепочка SHA1, вам нужен только один подписи, чтобы сделать все коммиты доступными от этого покрытый этим. Таким образом, подписывание каждой фиксации просто отсутствует.

Я бы посоветовал просмотреть связанное сообщение, в котором уточняется, почему подписывание автоматически совершает ошибку, но это не лучший вариант, чем я мог.

Однако, если вы хотите автоматически подписывать тег, вы могли бы это сделать, обернув git-tag -[s|u] в псевдоним; если вы собираетесь это сделать, вы, вероятно, захотите установить свой идентификатор ключа в ~/.gitconfig или конкретном проекте .git/config. Более подробную информацию об этом процессе можно найти в сообществе git. Подписи тегов бесконечно более полезны, чем подписывание каждой сделанной вами фиксации.

Ответ 4

Чтобы выполнить автоматическую подпись перед git версии 2.0, вам нужно добавить псевдоним git для фиксации.

# git config --global alias.commit commit -S
[alias]
    commit = commit -S

Ответ 5

Вам нужно четко указать, что если вы подписываете фиксацию или тег, это означает, что вы не одобряете всю историю. В случае коммитов вы только подписываете изменения под рукой, а в случае тега, ну... вам нужно определить, что вы имеете в виду. Возможно, вы сделали изменение, которое утверждает, что оно от вас, но не было (потому что кто-то другой нажал его на ваш пульт). Или это изменение, в которое вы не хотите быть, но вы только что подписали тег.

В типичных проектах OSS это может быть менее распространено, но в корпоративном сценарии, где вы время от времени нажимаете код, и вы не читаете всю историю, он может остаться незамеченным.

Подписание подписи является проблемой, если они будут переустановлены или выбраны вишней другим родителям. Но было бы хорошо, если модифицированная фиксация могла бы указывать на "оригинальную" фиксацию, которая на самом деле проверяет.