В чем разница между git commit -S и -s?
Недавно я узнал о подписанных коммитах, и они рекомендуются. Мы можем подписывать коммиты локально с помощью
git commit -S
. После этого я прочитал страницу руководства git, и там была опция под названием
-s
(используется в качестве
git commit -s
) и он сказал, что опция подписывает фиксацию. Когда я смотрю вверх
-S
он говорит, что подписывает фиксацию ключами GPG.
Я настраиваю подписанные коммиты с ключами GPG в GitHub. Имеет ли это значение при нажатии или то же самое при отправке на удаленный компьютер?
2 ответа
-S
(Короче для
--gpg-sign
) использует gnupg для подписи вашего коммита, добавляя к нему подпись PGP. это криптографическая подпись, подтверждающая, что владелец ключа gpg или субъект, имеющий к нему доступ, совершает эту фиксацию / тег
-s
(Короче для
--signoff
) добавляет "Signed-off-by: Username<Email>
"до конца сообщения о фиксации. Кто угодно может поместить эту строку в сообщение о фиксации (так что это не гарантия авторства), но она использовалась для защиты авторских прав. Некоторые проекты требуют этого для DCO " Сертификат происхождения разработчика " - по сути, сертификат, который разработчик подтвердил, что у него есть разрешение на внесение кода
Актуальное описание для -s/--signoff
является:
Добавьте строку Signed-off-by коммиттера в конец сообщения журнала фиксации. Значение подписи зависит от проекта, но обычно он удостоверяет, что коммиттер имеет право отправлять эту работу под той же лицензией и соглашается с сертификатом разработчика происхождения (см. http://developercertificate.org/ для получения дополнительной информации).
Как описано, он в основном добавляет строку "Подписано:" в конце сообщения фиксации, например:
$ git log
commit 172ccc467d2171b645bb55d51146af82ac36d356 (HEAD -> master)
Author: gino <my@email.com>
Date: Sun Nov 15 11:56:10 2020 +0900
Added something
Signed-off-by: gino <my@email.com>
Вы можете прочитать это как "Я одобрил коммит и беру на себя ответственность". Его цель уже хорошо освещена в этом посте по теме: Для чего нужна функция выхода из Git?. В основном это основанный на проекте способ возложения ответственности на коммит, который, как упоминается в принятом ответе в этом посте, требуется, когда уместны авторские права или лицензия на коммит.
Но поскольку это всего лишь часть сообщения фиксации, любой может просто добавить / отредактировать его, а вы можете просто добавить его самостоятельно, набрав его вручную или используя шаблоны сообщений фиксации. Вы даже можете указать там чужое имя / адрес электронной почты. В Github оно обрабатывается так же, как и любое другое многострочное сообщение фиксации:
... и Github не будет проверять фиксацию на основе строки подписи и не будет отображать какие-либо индикаторы пользовательского интерфейса, что "эта фиксация была одобрена". Это, конечно, нарушение DCO, которое является целью подписи, и есть плагины / боты, которые вы можете использовать для обеспечения его соблюдения для PR, например, этот probot / dco.
В -S/--gpg-sign
вариант, с другой стороны, является фактической криптографической подписью, поскольку он использует ваш ключ GPG, который вы сгенерировали на своем компьютере, где вы сделали фиксацию, а затем Github использует ваш открытый ключ, который вы ему дали, чтобы убедиться, что фиксация действительно пришла от вас (или из источника, у которого есть ваши ключи GPG). Как сказано в документации Github о подписании коммитов:
Используя GPG или S/MIME, вы можете подписывать теги и коммиты локально. Эти теги или коммиты помечаются на GitHub как проверенные, поэтому другие люди могут быть уверены, что изменения поступают из надежного источника.
Если фиксация или тег имеет подпись, которую невозможно проверить, GitHub помечает фиксацию или тег как непроверенные.
Администраторы репозитория могут принудительно применить обязательную подпись фиксации в ветке, чтобы заблокировать все фиксации, которые не подписаны и не проверены.
Коммиты подписаны с использованием
-S
и правильно проверено Github покажет индикатор "Проверено":
Обязательно следуйте их шагам по проверке подписи фиксации GPG. Github будет использовать его для:
При проверке подписи мы извлекаем подпись и пытаемся проанализировать ее идентификатор ключа. Мы сопоставляем key-id с ключами, загруженными на GitHub. Пока вы не загрузите свой ключ GPG на GitHub, мы не сможем проверить ваши подписи.
Что касается того, какой из них использовать, это зависит от того, что вы размещаете на Github и какова ваша цель "подписывать коммиты". Я бы сказал, что подписание с помощью ключей GPG имеет больше смысла, если вы просто хотите показать, что на самом деле это вы (или одна из ваших машин / ботов) подтолкнули эту фиксацию.