Есть ли способ "автоматического подписания" коммитов в Git с помощью ключа GPG?
Есть ли простой способ сделать так, чтобы Git всегда подписывал каждый созданный коммит или тэг?
Я попробовал это с чем-то вроде:
псевдоним commit = commit -S
Но это не помогло.
Я не хочу устанавливать другую программу, чтобы это произошло. Это выполнимо с легкостью?
Просто дополнительный вопрос, может быть, коммиты не должны подписываться, только теги, которые я никогда не создаю, так как я отправляю отдельные коммиты для проекта, такого как Homebrew и т. Д.
6 ответов
Примечание: если вы не хотите добавлять -S
все время, чтобы убедиться, что ваши коммиты подписаны, есть предложение (ветка ' pu
"На данный момент, декабрь 2013 года, так что нет никаких гарантий, что он попадет в релиз git), чтобы добавить конфигурацию, которая позаботится об этой опции для вас.
Обновление май 2014: выпущено в Git 2.0 (после повторной отправки в этой серии патчей)
Смотрите коммит 2af2ef3 Николя Вигье (boklm):
Добавить commit.gpgsign
возможность подписать все коммиты
Если вы хотите, чтобы GPG подписал все ваши коммиты, вы должны добавить
-S
вариант все время.
commit.gpgsign
опция config позволяет автоматически подписывать все коммиты.
commit.gpgsign
Логическое значение, указывающее, должны ли подписываться все коммиты.
Использование этой опции при выполнении таких операций, как 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 г.) с коммитом d67778e:
Не должно быть требования, чтобы я использовал одинаковую форму моего имени в моем git-хранилище и в моем ключе gpg.
Кроме того, у меня может быть несколько ключей в моей связке ключей, и я могу захотеть использовать тот, который не совпадает с адресом, который я использую в сообщениях фиксации.Этот патч добавляет запись конфигурации
user.signingKey
msgstr ", который, если присутствует, будет передан переключателю"-u"для gpg, что позволяет переопределить ключ подписи тега.
Это принудительно выполняется коммитом aba9119 (git 1.5.3.2), чтобы отследить случай, когда пользователь неправильно настроил user.signingKey
в их .git/config
или просто не имеет никаких секретных ключей на их связке ключей.
Заметки:
- По соглашению, начиная с git 2.4.0 март 2015 года,
signingKey
неsigningkey
хотяgit config
ключи нечувствительны к регистру. Это будет иметь значение, только если вы делаетеgit config --get-regexp
, который чувствителен к регистру, в противном случае, это всего лишь соглашение о читаемости; - Если вы хотите, чтобы git-сервер проверял подпись для каждого push- запроса, вам потребуется как минимум git 2.2+ (октябрь 2014 г.) ( commit b945901), так как
git push --signed
не смог рассмотретьuser.signingKey
значение конфигурации; - Git 2.9 (июнь 2016) будет использовать
user.signingKey
для принудительного подписания аннотированных тегов и коммитов: commit 61c2fe0.
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true
Замените 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 на свой идентификатор ключа. Помните: никогда не стоит использовать короткий идентификатор.
ОБНОВЛЕНИЕ: согласно новому указу git, все ключи конфигурации должны быть в camelCase.
Редактировать: Начиная с Git версии 1.7.9, можно подписывать коммиты Git (git commit -S
). Обновление ответа немного, чтобы отразить это.
Название вопроса:
Есть ли способ "автоматической подписи" коммитов в Git с помощью ключа GPG?
Краткий ответ: да, но не делай этого.
Обращаясь к опечатке в вопросе: git commit -s
не подписывает коммит. Скорее из 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 commit" научился "-S" для GPG-подписать коммит; это можно показать с помощью опции --show-signature для git log.
Так что да, вы можете подписывать коммиты. Однако я лично призываю к осторожности с этим вариантом; автоматическое подписание коммитов практически бессмысленно, см. ниже:
Просто дополнительный вопрос, может быть, коммиты не должны подписываться, только теги, которые я никогда не создаю, так как я отправляю отдельные коммиты.
Правильно. Комитеты не подписаны; теги есть. Причину этого можно найти в этом сообщении Линуса Торвальдса, последний абзац которого гласит:
Подписывать каждый коммит абсолютно глупо. Это просто означает, что вы автоматизируете это, и вы делаете подпись на сумму меньше. Это также не добавляет никакой реальной ценности, поскольку, как работает цепочка мерзких DAG в SHA1, вам когда-либо понадобится только одна подпись, чтобы все коммиты, достижимые из этого, были эффективно охвачены этим. Так что подписание каждого коммита просто упускает смысл.
Я бы посоветовал просмотреть связанное сообщение, в котором разъясняется, почему автоматическое подписание коммитов - не самая лучшая идея, чем я мог бы.
Однако, если вы хотите автоматически подписать тег, вы сможете сделать это, обернув git-tag -[s|u]
в псевдониме; если вы собираетесь это сделать, вы, вероятно, захотите установить свой идентификатор ключа в ~/.gitconfig
или для конкретного проекта .git/config
файл. Больше информации об этом процессе можно увидеть в книге сообщества git. Подписание тегов бесконечно более полезно, чем подписание каждого коммита, который вы делаете.
Чтобы автоматическая подпись работала до версии git 2.0, вам нужно добавить псевдоним git для commit.
# git config --global alias.commit commit -S
[alias]
commit = commit -S
Сначала настройте открытый ключ, с помощью которого вы хотите подписывать все свои коммиты, теги и push-уведомления. Чтобы получить открытый ключ, используйте следующую команду
% gpg --list-keys --keyid-format=short
/home/blueray/.gnupg/pubring.kbx
-------------------------------
pub rsa3072/F6EED39A 2021-12-25 [SC] [expires: 2023-12-25]
В этом случае открытый ключ
F6EED39A
. Теперь выполните следующие команды.
git config --global user.signingkey F6EED39A
git config --global commit.gpgSign true // sign all commits
git config --global tag.gpgSign true // sign all tags
git config --global push.gpgSign true // sign all push
Теперь все ваши коммиты, теги и push-уведомления будут автоматически подписаны вашим открытым ключом.
Иногда может потребоваться переопределить эти настройки .
Для коммитов используйте
git commit --no-gpg-sign -m "Unsigned commit"
Для тегов используйте
git tag --no-sign <tag-name>
Для толчка используйте
git push --no-signed
Вам необходимо четко указать, что если вы подписываете коммит или тег, это не означает, что вы одобряете всю историю. В случае коммитов вы только подписываете изменения под рукой, а в случае тега, ну... вам нужно определить, что вы имеете в виду. Возможно, вы извлекли изменение, которое утверждает, что оно от вас, но не было (потому что кто-то другой выдвинул его на ваш пульт). Или это изменение, в котором вы не хотите участвовать, но вы только что подписали тег.
В типичных проектах OSS это может быть менее распространенным, но в сценарии предприятия, когда вы только касаетесь кода время от времени и не читаете всю историю, он может остаться незамеченным.
Подписание коммитов является проблемой, если они будут перебазированы или подобраны другим родителям. Но было бы хорошо, если бы измененный коммит мог указывать на "оригинальный" коммит, который фактически проверяет.