Para que serve o recurso Sign Off no Git?

Respostas:

536

A assinatura é um requisito para obter correções no kernel do Linux e em alguns outros projetos, mas a maioria dos projetos não o utiliza.

Foi introduzido na sequência do processo da SCO (e outras acusações de violação de direitos autorais da SCO , a maioria das quais eles nunca levaram a tribunal), como um Certificado de Origem para Desenvolvedores . Costuma-se dizer que você certifica que criou o patch em questão ou que, segundo o seu conhecimento, foi criado sob uma licença de código-fonte apropriado ou que foi fornecido a você por alguém mais sob esses termos. Isso pode ajudar a estabelecer uma cadeia de pessoas que assumem a responsabilidade pelo status de direitos autorais do código em questão, para ajudar a garantir que o código protegido por direitos autorais não liberado sob uma licença apropriada de software livre (código aberto) não seja incluído no kernel.

Brian Campbell
fonte
91
Deve-se notar que o significado descrito é aquele atribuído às Signed-off-by:linhas de mensagem de confirmação pelo projeto do kernel Linux (e pelo próprio projeto Git). Para outros projectos, no entanto, essas linhas não têm significado, a menos que os cessionários do projecto significado para eles (por exemplo, descrevendo-os na documentação do projecto; por exemplo, de Linux SubmittingPatches ou de Git SubmittingPatches ).
31710 Chris Chrissen
39
Então, por que isso precisa ser feito na mensagem de confirmação? Eu pensei que os commits tinham um autor anexado a eles, e eles faziam parte do hash SHA1?
Leif Andersen
34
@ Leif Mera informação de autoria não é suficiente. Eu poderia ter escrito um patch, mas se o baseasse em algum código do Unix, não teria permissão para liberá-lo sob a GPL (pelo menos sem aprovação de alguém mais alto). Ou, um patch pode fazer isso entre vários mantenedores diferentes antes de terminar na árvore do kernel; a aprovação indica a cadeia de custódia. Leia o certificado de origem ao qual vinculei; é isso que significa quando você adiciona uma linha de sinalização. O cabeçalho "Autor" pode ser impreciso e não implica necessariamente concordar com tudo no certificado de origem.
Brian Campbell
68
Sem a chave PGP, como pode ser estabelecido que a assinatura é genuína?
HRJ 3/12/12
7
@HRJ A genuinidade de uma assinatura é realmente sua (commiter). Nem no autor, nem no próprio assinante. Se, posteriormente, alguém (principalmente o signatário) contestar sua validade, é melhor você ter um e-mail ou algo que prove que ele concordou. O comissário pode dizer que não cometeu esse blob SE o blob não tiver GPG assinado (IMHO é uma defesa fraca, mas ...). Nesse caso, o commiter pode usar -S para fechar o círculo. Agora, com -S e -s, você tem uma cadeia de custódia baseada na palavra do comissário, que o código escrito por algum autor está autorizado a ser usado por alguns assinantes mais avançados.
Dr Beco
70

A assinatura é uma linha no final da mensagem de confirmação que certifica quem é o autor da confirmação. Seu principal objetivo é melhorar o rastreamento de quem fez o que, especialmente com patches.

Exemplo de confirmação:

Add tests for the payment processor.

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

Ele deve conter o nome real do usuário, se usado para um projeto de código aberto.

Se o mantenedor da ramificação precisar modificar levemente as correções para mesclá-las, ele poderá solicitar que o remetente faça o rediff, mas isso seria contraproducente. Ele pode ajustar o código e encerrar sua assinatura no final para que o autor original ainda receba o crédito pelo patch.

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]>

Fonte: http://gerrit.googlecode.com/svn/documentation/2.0/user-signedoffby.html

Andrzej Rehmann
fonte
38
Isso não é redundante no authorcampo de um commit do git? Eu sempre pensei que era por isso que havia um campo authore um committercampo separados . O autor é o autor do patch e o committer é o cara que aplicou e empurrou o patch.
Leif Gruenwoldt 30/08/14
10
Certifica realmente quem é o autor de um commit? Quero dizer, tanto quanto -S (--gpg-sign), porque acho que não. Acho que qualquer um poderia adicionar uma linha "Assinada por" com qualquer nome e email, enquanto uma assinatura GPG é muito mais confiável, mas talvez eu esteja errado.
HDL
1
“A assinatura é uma linha no final da mensagem de confirmação que certifica quem é o autor da confirmação. Seu principal objetivo é melhorar o rastreamento de quem fez o que, especialmente com patches. ” - Isso quase certamente está errado (especificamente a primeira frase). Como um contra-exemplo, veja, por exemplo, b2c150d3aa (vinculado à resposta do VonC) , que possui dois cabeçalhos assinados; um pelo autor e outro pelo mantenedor. Essa é uma prática comum nos projetos Git e Linux.
Guildenstern
(Continuação do comentário anterior.) Assinar significa que você foi o autor do commit sob certas condições ou está transmitindo algo que foi criado por alguém que (se esforçou para) cumprir a condição mencionada acima. Por isso, forma algo como uma cadeia de certificação.
Guildenstern
Atualize o que foi dito acima: aconteceu que perdi algo na minha última resposta e, portanto, subestimei essa resposta. O autor está parcialmente correto sobre "ajustar o código", mas coloca a ênfase errada no trailer "assinar". A documentação diz que você deve adicionar um trailer entre colchetes (como no exemplo da resposta) que informa sobre isso. Portanto, a assinatura em conjunto com ela pode ser usada para adicionar pequenas alterações por pessoas como o integrador / mantenedor. Mas a assinatura ainda serve principalmente como o que descrevi.
quer
30

O git 2.7.1 (fevereiro de 2016) esclarece que no commit b2c150d (05 de janeiro de 2016) por David A. Wheeler ( david-a-wheeler) .
(Mesclado por Junio ​​C Hamano - gitster- no commit 7aae9ba , 05 de fevereiro de 2016)

git commitA página de manual agora inclui:

-s::
--signoff::

Adicione Signed-off-bylinha pelo confirmador no final da mensagem de log de confirmação.
O significado de uma aprovação depende do projeto, mas normalmente certifica que o committer tem o direito de enviar este trabalho sob a mesma licença e concorda com um Certificado de Origem do Desenvolvedor (consulte https://developercertificate.org para obter mais informações).


Expandir a documentação descrevendo --signoff

Modifique vários arquivos de documentos (página de manual) para explicar em mais detalhes o que --signoff significa.

Isso foi inspirado no " artigo da lwn 'Bottomley: Uma proposta modesta sobre o DCO' " (Certificado de Origem do Desenvolvedor), onde paulj observou:

O problema que tenho com o DCO é que adicionar um -sargumento " " ao git commit não significa que você tenha ouvido falar do DCO ( a git commitpágina de manual não menciona o DCO em nenhum lugar) ), independentemente de realmente ter visto.

Então, como a presença de " signed-off-by" de qualquer forma implica que o remetente está concordando e se comprometendo com o OCD? Combinado com o fato, vi respostas em listas de patches sem SOBs que dizem nada mais do que "Reenviar isso signed-off-bypara que eu possa confirmar".

A extensão da documentação do git tornará mais fácil argumentar que os desenvolvedores entenderam --signoffquando o usam.


Observe que agora esta aprovação (para o Git 2.15.x / 2.16, primeiro trimestre de 2018) também está disponível git pull.

Veja commit 3a4d2c7 (12 de outubro de 2017) por W. Trevor King ( wking) .
(Mesclado por Junio ​​C Hamano - gitster- in commit fb4cd88 , 06 de novembro de 2017)

pull: passe --signoff/--no-signoffpara " git merge"

a fusão pode demorar --signoff, mas sem puxar a transmissão --signoff, é inconveniente de usar; permita que ' pull' escolha a opção e passe-a.

VonC
fonte
2
Mesmo com a documentação do git commit (finalmente) referenciando o documento, o sinalizador -s pretende indicar conhecimento e concordância / concordância / ??? para, acredito que o SOB é legalmente muito fraco. Acho que a SOB foi inventada por Linus para resolver um problema social, na medida em que outros defendiam a burocracia de alto custo. Linus não queria nada, mas veio com isso para calá-los. Até onde eu sei, os advogados não aconselham que você invista muita fé, se é que existe alguma. (Eu sou 'paulj' no LWN).
paulj 5/16
3
VonC, você é um verdadeiro curador do Git. Você sempre tem respostas bem estruturadas, informativas e com referências cruzadas em perguntas como essa - rastreando a história do desenvolvimento do Git até possíveis ferramentas e documentação voltadas para o usuário. Então, obrigado por isso.
precisa
3
@Guildenstern Obrigado por este belo comentário.
VonC
17

Existem algumas respostas legais sobre esta questão. Tentarei adicionar uma resposta mais ampla, a saber, sobre o que são esses tipos de linhas / cabeçalhos / trailers na prática atual. Não tanto sobre o cabeçalho de assinatura em particular (não é o único).

Cabeçalhos ou trailers (↑ 1) como "logoff" (↑ 2) são, na prática atual em projetos como Git e Linux, metadados efetivamente estruturados para o commit. Tudo isso é anexado ao final da mensagem de confirmação, após a parte "forma livre" (não estruturada) do corpo da mensagem. Estes são pares de valor de token (ou valor-chave ) normalmente delimitados por dois pontos e um espaço ( :␣).

Como mencionei, “assinar” não é o único trailer na prática atual. Veja, por exemplo, este commit , que tem a ver com "Dirty Cow":

 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]>

Além do trailer "assinar" acima, há:

  • "Cc" (foi notificado sobre o patch)
  • "Acked-by" (reconhecido pelo proprietário do código, "parece bom para mim")
  • “Avaliado por” (avaliado)
  • "Relatado e testado por" (relatou e testou o problema (presumo))

Outros projetos, como, por exemplo, a Gerrit, têm cabeçalhos próprios e significado associado a eles.

Veja: https://git.wiki.kernel.org/index.php/CommitMessageConventions

Moral da história

Tenho a impressão de que, embora a motivação inicial para esses metadados específicos tenha sido algumas questões legais (a julgar pelas outras respostas), a prática desses metadados progrediu além de apenas lidar com o caso de formar uma cadeia de autoria.

[↑ 1]: man git-interpret-trailers
[↑ 2]: Eles também são chamados de "sob" (iniciais), ao que parece.

Guildenstern
fonte
2
Caso de uso interessante. +1
VonC