Для чего нужна функция выхода в Git?

В чем смысл функции выхода из системы в Git?

git commit --signoff

Когда я должен его использовать, если вообще?


person Clark Gaebel    schedule 25.12.2009    source источник


Ответы (4)


Подписание - это требование для установки исправлений в ядро ​​Linux и некоторые другие проекты, но в большинстве проектов оно фактически не используется.

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

person Brian Campbell    schedule 25.12.2009
comment
Следует отметить, что описанное значение - это значение, присвоенное строкам сообщения Signed-off-by: фиксации проектом ядра Linux (и самим проектом Git). Однако для других проектов такие строки бессмысленны, если проект не придает им значения (например, описывая их в документации проекта; например, Linux SubmittingPatches или Отправка исправлений). - person Chris Johnsen; 07.07.2010
comment
Так почему это нужно было сделать в сообщении о фиксации? Я думал, что к коммитам прикреплен автор, и они были частью хэша SHA1? - person Leif Andersen; 31.12.2010
comment
@Leif Одной информации об авторстве недостаточно. Я мог бы написать патч, но если бы я основывал его на каком-то коде из Unix, у меня не было бы разрешения выпустить его под GPL (по крайней мере, без одобрения кого-то более высокого уровня). Или патч может быть использован несколькими разными сопровождающими до того, как он окажется в дереве ядра; знак указывает на цепочку поставок. Прочтите сертификат происхождения, на который я ссылаюсь; вот что это означает, когда вы добавляете строку выхода. Заголовок Author может быть неточным и не обязательно означает согласие со всем в сертификате происхождения. - person Brian Campbell; 01.01.2011
comment
Как можно определить подлинность подписи без ключа PGP? - person HRJ; 03.12.2012
comment
Сертификат происхождения участника Eclipse Foundation также использует функцию подписи для подписи. - person koppor; 27.05.2013
comment
@HRJ Подлинность подписанного на самом деле на вас (коммитере). Ни по автору, ни по подписанному. Если позже кто-то (в основном подписанный) оспорит его недействительность, вам лучше иметь с собой электронное письмо или что-то, что доказывает, что он согласился с этим. Коммитер может сказать, что он не фиксировал такой blob, ЕСЛИ этот blob не подписан GPG (IMHO слабая защита, но ...). В этом случае коммитер может использовать -S, чтобы замкнуть круг. Теперь с -S и -s у вас есть цепочка ответственности, основанная на слове коммитера, что код, написанный каким-то автором, авторизован для использования некоторыми подписанными выше. - person DrBeco; 09.11.2014
comment
@BrianCampbell Авторства должно быть более чем достаточно, я до сих пор не понимаю. Патчи, примененные через am (созданные через format-patch), несут с собой правильного автора, и этот автор применяется при применении патча. Для исправлений, примененных из вывода git diff (который не содержит метаданных фиксации), выход из системы в любом случае не поможет, поскольку сообщение фиксации не связано с udiff. - person void.pointer; 19.07.2015
comment
@ void.pointer Недостаточно авторства. Если я работаю в компании и являюсь автором патча, авторские права на этот патч принадлежат компании. У меня нет разрешения на публикацию этого патча в соответствии с условиями GPL без соответствующего разрешения руководства. Итак, если я напишу патч и отправлю его в LKML, информация об авторстве будет верной, но на самом деле никто не подтвердил, что на самом деле существует законное основание для распространения этого патча под GPL. Тот факт, что эту информацию можно удалить, не имеет значения. - person Brian Campbell; 20.07.2015
comment
@BrianCampbell Если он принадлежит Компании, в качестве подписи по-прежнему используются мое имя и адрес электронной почты (домен может быть зарегистрирован Компанией). Подписание, являющееся частью сообщения фиксации, не более безопасно, чем поле автора. Его еще можно раздеть. Подтверждение не сообщает ничего дополнительного по сравнению с полем автора. Может быть, если вы сможете объяснить, что есть в подписи, которой нет у этого автора, это сделало бы его немного менее избыточным. - person void.pointer; 20.07.2015
comment
@ void.pointer Это не является избыточным, потому что знак подписи действительно сообщает нечто большее, чем поле автора. Подписание означает (упрощенно): «Я подтверждаю, что код в этом коммите может быть опубликован в соответствии с условиями лицензии на проект». Поле автора означает «Я сделал это». это не означает, что «это» может быть опубликовано… Другими словами, подписываясь, вы берете на себя полную ответственность за эту фиксацию, что она может быть распространена на законных основаниях. Это не вопрос безопасности. Если вы хотите защитить коммиты, подпишите их. - person Frizlab; 05.10.2015
comment
@Frizlab Я до сих пор не куплюсь на это. Наличие одной и той же информации дважды не означает, что вы даете разрешение на публикацию патча. Тот факт, что вы передали его кому-то, в первую очередь дает такое разрешение. Плюс, кто сказал, что кто-то не входит и просто отредактирует сообщение фиксации, чтобы добавить это для вас? Это по-прежнему остается глупым жестом, навязанным сообществом OSS. - person void.pointer; 05.10.2015
comment
@ void.pointer Фиксирует, где обычно необходимо подписывать вопросы о подписании. Подписанный коммит не может быть изменен без закрытого ключа. Подписанный еще добавляет некоторую информацию. Это не потому, что вы что-то совершили, вы это сделали. Вы можете скопировать и вставить какой-нибудь код из любого места, а затем выполнить фиксацию. Если вставленный код нельзя было использовать и ведется расследование, кто виноват? Тот, кто подписал коммит; НЕ тот, кто это совершил. Вот что это значит. Это полезно? Я не знаю… - person Frizlab; 05.10.2015
comment
Лично я бы никогда не применял патч от кого-то еще, который не идет с метаданными фиксации. Это старый способ SVN наложения патча. Идеальные патчи в git создаются где-то из коммитов. Коммитером коммита может быть я, но автором будут они. Это фактически дает ту же информацию, что и выход. Вы должны поговорить с автором, если они узнают, что это не код, которым они владеют. - person void.pointer; 05.10.2015
comment
@Frizlab, цитирую ваше заявление: Другими словами, подписываясь, вы берете на себя полную ответственность за этот коммит, который может быть распространен на законных основаниях. Чем «подписанное» лучше, чем юридически обязывающее соглашение об обязательстве, устанавливающее его и увязывающее его с фактом совершения самообязательства? Даже слово «коммит» здесь предполагает :) Если его единственная цель - найти виноватого - с согласия коммитера, то это будет автор или коммитер, который мог незаконно использовать авторский патч. Так что никакого выигрыша нет! - person PF4Public; 29.03.2018
comment
Если значение подписанного пользователем - это то, что должен установить проект, почему проект не может просто объявить, что коммитер git commit выходит из системы? Возможно, это потому, что это может измениться, если кто-то придет и будет выбирать между базовыми уровнями. Сборщик вишен не удостоверяет происхождение; исходный коммиттер делает. - person Kaz; 28.02.2020

Sign-off - это строка в конце сообщения фиксации, которая удостоверяет, кто является автором фиксации. Его основная цель - улучшить отслеживание того, кто что сделал, особенно с помощью исправлений.

Пример фиксации:

Add tests for the payment processor.

Signed-off-by: Humpty Dumpty <[email protected]>

Он должен содержать настоящее имя пользователя, если используется для проекта с открытым исходным кодом.

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

Add tests for the payment processor.

Signed-off-by: Humpty Dumpty <[email protected]>

[Project Maintainer: Renamed test methods according to naming convention.]
Signed-off-by: Project Maintainer <[email protected]>

Источник: http://web.archive.org/web/20160507011446/http://gerrit.googlecode.com/svn/documentation/2.0/user-signedoffby.html

person Andrzej Rehmann    schedule 26.12.2012
comment
Разве это не избыточно из-за поля author коммита git? Мне всегда казалось, что именно поэтому было отдельное поле author и committer. Автор является автором патча, а коммиттер - парнем, который применил и выпустил патч. - person Leif Gruenwoldt; 30.08.2014
comment
Действительно ли он удостоверяет, кто является автором коммита? Я имею в виду, как и -S (--gpg-sign), потому что я так не думаю. Я думаю, что любой может добавить строку Signed-off-by с любым именем и адресом электронной почты, тогда как подпись GPG намного надежнее, но, возможно, я ошибаюсь. - person hdl; 29.02.2016
comment
«Подписание - это строка в конце сообщения о фиксации, которая удостоверяет, кто является автором фиксации. Его основная цель - улучшить отслеживание того, кто что сделал, особенно с помощью исправлений ». - Это почти наверняка неверно (особенно первое предложение). В качестве контрпримера см., Например, b2c150d3aa (ссылка на ответ VonC) который имеет два подписанных заголовка; один от автора и один от сопровождающего. Это обычная практика в проектах Git и Linux. - person Guildenstern; 15.12.2016
comment
(Продолжение предыдущего комментария.) Для подписания означает, что вы создали коммит при определенных условиях, или что вы передаете что-то, что было создано кем-то, кто (предписал) выполнить вышеупомянутое условие. Таким образом, это образует нечто вроде цепочки сертификации. - person Guildenstern; 15.12.2016
comment
Обновите вышесказанное: оказалось, что я что-то пропустил в своем последнем ответе, поэтому я недооценил этот ответ. Автор частично прав насчет «корректировки кода», но неправильно акцентирует внимание на «подписывающем» трейлере. В документации говорится, что вы должны добавить трейлер в скобках (как в примере в ответе), который информирует об этом. Таким образом, подпись в сочетании с этим может использоваться для добавления небольших изменений такими людьми, как интегратор / сопровождающий. Но подписание по-прежнему в основном соответствует тому, что я описал. - person Guildenstern; 15.12.2016
comment
@LeifGruenwoldt для большинства проектов, которые я видел, под коммиттером понимается человек, который нажал Я одобряю, объединяю это и не указывает, что коммиттер внес изменения в коммит. Одна из возможных альтернатив - добавить еще одну фиксацию позже, где коммиттер является автором, но это может быть неприемлемо, например. если первая фиксация нарушит сборку, что приведет к сбою пополам. - person Ciro Santilli 新疆再教育营六四事件ۍ 30.10.2019

git 2.7.1 (февраль 2016 г.) поясняет, что в фиксации b2c150d (5 января 2016 г.) Дэвид А. Уиллер (david-a-wheeler).
(объединено Junio ​​C Hamano - gitster - в commit 7aae9ba, 5 февраля 2016 г.)

git commit справочная страница теперь включает:

-s::
--signoff::

Добавьте строку Signed-off-by от коммиттера в конце сообщения журнала фиксации.
Значение подписи зависит от проекта, но обычно удостоверяет, что коммиттер имеет право отправлять эту работу под той же лицензией и соглашается к исходному сертификату разработчика (дополнительную информацию см. в https://developercertificate.org).


Развернуть документацию с описанием --signoff

Измените различные файлы документов (страниц руководства), чтобы более подробно объяснить, что означает --signoff.

Это было вдохновлено «lwn статьей« Боттомли: скромное предложение по DCO »» (сертификат разработчика Происхождение), где Поль отметил:

Проблема с DCO заключается в том, что добавление аргумента "-s" к git commit на самом деле не означает, что вы даже слышали о DCO (на странице руководства git commit не упоминается DCO где угодно), не говоря уже о том, что видел это на самом деле.

Итак, как присутствие «signed-off-by» каким-либо образом может означать, что отправитель соглашается с DCO и принимает на себя обязательства? В сочетании с фактом я видел ответы на списки исправлений без SOB, в которых не было ничего, кроме «Отправить это повторно с signed-off-by, чтобы я мог его зафиксировать».

Расширение документации git упростит утверждение, что разработчики поняли --signoff, когда они его используют.


Обратите внимание, что это подтверждение теперь (для Git 2.15.x / 2.16, Q1 2018) доступно и для git pull.

См. commit 3a4d2c7 (12 октября 2017 г.) от W. Тревор Кинг (wking).
(Объединено Junio ​​C Hamano - gitster - в commit fb4cd88, 06 ноября 2017 г.)

pull: передать --signoff/--no-signoff в "git merge"

merge может занять --signoff, но без перехода --signoff вниз, неудобно использовать; позволить pull взять опцию и передать ее.

person VonC    schedule 06.02.2016
comment
Даже с документацией git commit (наконец), ссылающейся на документ, флаг -s предназначен для обозначения знания и согласия / согласия / ??? Я считаю, что SOB очень слаб с юридической точки зрения. Я думаю, что SOB был изобретен Линусом для решения социальной проблемы, поскольку другие отстаивали бюрократию с высокими накладными расходами. Линус ничего не хотел, но придумал это, чтобы заткнуть им рот. Насколько я могу судить, юристы не посоветовали бы вам вкладывать в это много веры, если таковая имеется. (Я «Пол» на LWN). - person paulj; 05.12.2016
comment
VonC, вы настоящий куратор Git. У вас всегда есть такие хорошо структурированные, информативные и хорошо перекрестные ответы на подобные вопросы - прослеживание истории разработки Git до возможных инструментов и документации, ориентированных на пользователя. Так что спасибо вам за это. - person Guildenstern; 15.12.2016
comment
@Guildenstern Спасибо за этот хороший комментарий. - person VonC; 15.12.2016

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

Заголовки или трейлеры (↑ 1), такие как «sign-off» (↑ 2), в современной практике таких проектов, как Git и Linux, представляют собой эффективно структурированные метаданные для фиксации. Все они добавляются в конец сообщения фиксации после «свободной формы» (неструктурированной) части тела сообщения. Это пары токен – значение (или ключ – значение), обычно разделенные двоеточием и пробелом (:␣).

Как я уже упоминал, «подписка» - не единственный трейлер в текущей практике. См., Например, этот коммит, что связано с «Грязной коровой»:

 mm: remove gup_flags FOLL_WRITE games from __get_user_pages()
 This is an ancient bug that was actually attempted to be fixed once
 (badly) by me eleven years ago in commit 4ceb5db9757a ("Fix
 get_user_pages() race for write access") but that was then undone due to
 problems on s390 by commit f33ea7f404e5 ("fix get_user_pages bug").

 In the meantime, the s390 situation has long been fixed, and we can now
 fix it by checking the pte_dirty() bit properly (and do it better).  The
 s390 dirty bit was implemented in abf09bed3cce ("s390/mm: implement
 software dirty bits") which made it into v3.9.  Earlier kernels will
 have to look at the page state itself.

 Also, the VM has become more scalable, and what used a purely
 theoretical race back then has become easier to trigger.

 To fix it, we introduce a new internal FOLL_COW flag to mark the "yes,
 we already did a COW" rather than play racy games with FOLL_WRITE that
 is very fundamental, and then use the pte dirty flag to validate that
 the FOLL_COW flag is still valid.

 Reported-and-tested-by: Phil "not Paul" Oester <[email protected]>
 Acked-by: Hugh Dickins <[email protected]>
 Reviewed-by: Michal Hocko <[email protected]>
 Cc: Andy Lutomirski <[email protected]>
 Cc: Kees Cook <[email protected]>
 Cc: Oleg Nesterov <[email protected]>
 Cc: Willy Tarreau <[email protected]>
 Cc: Nick Piggin <[email protected]>
 Cc: Greg Thelen <[email protected]>
 Cc: [email protected]
 Signed-off-by: Linus Torvalds <[email protected]>

В дополнение к трейлеру с подписью, приведенному выше, есть:

  • «Копия» (получил уведомление о патче)
  • «Подтверждено» (признано владельцем кода, «мне нравится»)
  • «Проверено» (просмотрено)
  • «Сообщено и протестировано» (сообщил и проверил проблему (я полагаю))

Другие проекты, такие как, например, Gerrit, имеют свои собственные заголовки и связанные с ними значения.

См .: https://git.wiki.kernel.org/index.php/CommitMessageConventions

Мораль истории

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

[↑ 1]: man git-interpret-trailers
[↑ 2]: Кажется, их также иногда называют «s-o-b» (инициалы).

person Guildenstern    schedule 15.12.2016