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.


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 <humpty.dumpty@example.com>

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 <humpty.dumpty@example.com>

[Project Maintainer: Renamed test methods according to naming convention.]
Signed-off-by: Project Maintainer <project.maintainer@example.com>

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


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.


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 <kernel@linuxace.com>
 Acked-by: Hugh Dickins <hughd@google.com>
 Reviewed-by: Michal Hocko <mhocko@suse.com>
 Cc: Andy Lutomirski <luto@kernel.org>
 Cc: Kees Cook <keescook@chromium.org>
 Cc: Oleg Nesterov <oleg@redhat.com>
 Cc: Willy Tarreau <w@1wt.eu>
 Cc: Nick Piggin <npiggin@gmail.com>
 Cc: Greg Thelen <gthelen@google.com>
 Cc: stable@vger.kernel.org
 Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

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.


2
Caso de uso interessante. +1
— VonC
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.