¿Para qué sirve la función Cerrar sesión en Git?

Respuestas:

536

El cierre de sesión es un requisito para obtener parches en el kernel de Linux y algunos otros proyectos, pero la mayoría de los proyectos en realidad no lo usan.

Se introdujo a raíz de la demanda de SCO (y otras acusaciones de infracción de derechos de autor de SCO , la mayoría de las cuales nunca se llevaron a los tribunales), como un Certificado de origen de desarrolladores . Se utiliza para decir que certifica que ha creado el parche en cuestión, o que certifica que, según su leal saber y entender, fue creado bajo una licencia de código abierto apropiada, o que alguien se lo ha proporcionado. más bajo esos términos. Esto puede ayudar a establecer una cadena de personas que asuman la responsabilidad del estado de copyright del código en cuestión, para ayudar a garantizar que el código protegido por derechos de autor no publicado bajo una licencia de software libre (código abierto) apropiado no esté incluido en el núcleo.

Brian Campbell
fuente
9191
Cabe señalar que el significado descrito es el asignado a las Signed-off-by:líneas de mensaje de confirmación por el proyecto del kernel de Linux (y el propio proyecto Git). Para otros proyectos, sin embargo, estas líneas no tienen sentido a menos que los cesionarios de proyectos que significan para ellos (por ejemplo, mediante la descripción de ellos en la documentación del proyecto, por ejemplo, de Linux SubmittingPatches o de Git SubmittingPatches ).
Chris Johnsen
39
Entonces, ¿por qué tenía que hacerse esto en el mensaje de confirmación? Pensé que los commits tenían un autor adjunto, y que eran parte del hash SHA1?
Leif Andersen
34
@Leif La mera información de autoría no es suficiente. Podría haber escrito un parche, pero si lo basara en algún código de Unix, no tendría permiso para publicarlo bajo la GPL (al menos sin la aprobación de alguien más arriba). O, un parche puede aparecer entre varios mantenedores diferentes antes de terminar en el árbol del núcleo; la firma indica la cadena de custodia. Lea el certificado de origen al que me vinculé; eso es lo que significa cuando agrega una línea de cierre de sesión. El encabezado "Autor" puede ser inexacto y no implica necesariamente un acuerdo con todo en el certificado de origen.
Brian Campbell
68
Sin la clave PGP, ¿cómo se puede establecer que el cierre de sesión es genuino?
HRJ
77
@HRJ La autenticidad de un cierre de sesión está realmente en usted (comprometido). No por el autor, ni por el mismo. Si más tarde alguien (principalmente el que firmó) disputa no es válido, es mejor que tenga con usted un correo electrónico o algo que demuestre que estuvo de acuerdo. El comitente puede decir que no cometió tal blob SI el blob no está firmado por GPG (en mi humilde opinión, una defensa débil, pero ...) En este caso, el responsable puede usar -S para cerrar el círculo. Ahora con -S y -s tiene una cadena de custodia basada en la palabra del comitente, de que el código escrito por algún autor está autorizado a ser utilizado por algunos que están más arriba.
Dr Beco
70

El cierre de sesión es una línea al final del mensaje de confirmación que certifica quién es el autor de la confirmación. Su objetivo principal es mejorar el seguimiento de quién hizo qué, especialmente con parches.

Ejemplo commit:

Add tests for the payment processor.

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

Debe contener el nombre real del usuario si se usa para un proyecto de código abierto.

Si el responsable de la sucursal necesita modificar ligeramente los parches para fusionarlos, podría pedirle al remitente que vuelva a enviar, pero sería contraproducente. Puede ajustar el código y poner su cierre de sesión al final para que el autor original todavía reciba crédito por el parche.

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

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

Andrzej Rehmann
fuente
38
¿No es eso redundante por el authorcampo de un git commit? Siempre pensé que por eso había una por separado authory committercampo. El autor es el escritor del parche y el confirmador es el que aplicó y presionó el parche.
Leif Gruenwoldt
10
¿Realmente certifica quién es el autor de un commit? Quiero decir, tanto como -S (--gpg-sign), porque no lo creo. Creo que cualquiera podría agregar una línea "Firmado por" con cualquier nombre y correo electrónico, mientras que una firma GPG es mucho más confiable, pero tal vez me equivoque.
hdl
1
“La firma es una línea al final del mensaje de confirmación que certifica quién es el autor de la confirmación. Su objetivo principal es mejorar el seguimiento de quién hizo qué, especialmente con parches ". - Es casi seguro que está mal (específicamente la primera oración). Como contraejemplo, vea por ejemplo b2c150d3aa (vinculado a la respuesta de VonC) , que tiene dos encabezados aprobados por; uno por el autor y otro por el mantenedor. Esta es una práctica común en los proyectos Git y Linux.
Guildenstern
(Continúa del comentario anterior). Cerrar sesión significa que usted es el autor del compromiso bajo ciertas condiciones, o que está transmitiendo algo que ha sido creado por alguien que (cumplió) cumple con la condición mencionada anteriormente. Entonces forma algo así como una cadena de certificación.
Guildenstern
Actualización sobre lo anterior: resulta que me perdí algo en mi última respuesta, por lo que subestimé esta respuesta. El autor está parcialmente en lo correcto acerca de "ajustar el código", pero pone el énfasis incorrecto en el avance "cierre de sesión". La documentación dice que debe agregar un avance entre corchetes (como en el ejemplo en la respuesta) que informa sobre eso. Por lo tanto, el cierre de sesión junto con eso se puede usar para agregar pequeños cambios por personas como el integrador / mantenedor. Pero la firma todavía sirve principalmente como lo que he descrito.
Guildenstern
30

git 2.7.1 (febrero de 2016) aclara que en commit b2c150d (05 de enero de 2016) por David A. Wheeler ( david-a-wheeler) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 7aae9ba , 05 feb 2016)

git commitLa página man ahora incluye:

-s::
--signoff::

Agregue Signed-off-bylínea por el confirmador al final del mensaje de registro de confirmación.
El significado de una firma depende del proyecto, pero por lo general certifica que el responsable tiene los derechos para enviar este trabajo bajo la misma licencia y acepta un Certificado de origen del desarrollador (consulte https://developercertificate.org para obtener más información).


Ampliar la documentación que describe --signoff

Modifique varios archivos de documentos (página de manual) para explicar con más detalle lo que --signoffsignifica.

Esto se inspiró en el " artículo de lwn 'Bottomley: una modesta propuesta sobre el DCO' " (Certificado de origen del desarrollador) donde Paulul señaló:

El problema que tengo con DCO es que agregar un " -s" argumento a git commit no significa que hayas oído hablar del DCO ( la git commitpágina del manual no menciona el DCO en ninguna parte ), no importa verlo realmente.

Entonces, ¿cómo puede la presencia de " signed-off-by" de alguna manera implicar que el remitente acepta y se compromete con el DCO? Combinado con el hecho, he visto respuestas en listas a parches sin SOB que dicen nada más que "Reenviar esto signed-off-bypara que pueda confirmarlo".

Extender la documentación de git hará que sea más fácil argumentar que los desarrolladores entendieron --signoffcuándo lo usan.


Tenga en cuenta que esta firma ahora también está disponible (para Git 2.15.x / 2.16, Q1 2018) git pull.

Ver commit 3a4d2c7 (12 de octubre de 2017) por W. Trevor King ( wking) .
(Fusionada por Junio ​​C Hamano - gitster- en commit fb4cd88 , 06 nov 2017)

pull: pase --signoff/--no-signoffa " git merge"

la fusión puede tomar --signoff, pero sin tirar --signoffhacia abajo, es incómodo de usar; permitir ' pull' para tomar la opción y pasarla.

VonC
fuente
2
Incluso con la documentación de confirmación de git (por fin) que hace referencia al documento, la bandera -s tiene la intención de indicar conocimiento y acuerdo / asentimiento / ??? a, creo que el SOB es legalmente muy débil. SOB fue, al menos creo, inventado por Linus para resolver un problema social en el que otros abogaban por una burocracia de alto costo. Linus no quería nada, pero se le ocurrió eso para callarlos. Por lo que puedo decir, los abogados no le aconsejarían que invierta mucha fe, si es que la tiene. (Estoy 'paulj' en LWN).
paulj
3
VonC, eres un verdadero curador de Git. Siempre tiene respuestas bien estructuradas, informativas y con referencias cruzadas a preguntas como esta: rastrear la historia del desarrollo de Git hasta eventuales herramientas y documentación para el usuario. Así que gracias por eso.
Guildenstern
3
@Guildenstern Gracias por este bonito comentario.
VonC
17

Hay algunas buenas respuestas a esta pregunta. Trataré de agregar una respuesta más amplia, a saber, de qué se trata este tipo de líneas / encabezados / trailers en la práctica actual. No se trata tanto del encabezado de cierre de sesión en particular (no es el único).

Los encabezados o trailers (↑ 1) como "cierre de sesión" (↑ 2) son, en la práctica actual en proyectos como Git y Linux, metadatos efectivamente estructurados para el commit. Todos estos se agregan al final del mensaje de confirmación, después de la parte de "forma libre" (no estructurada) del cuerpo del mensaje. Estos son pares token-value (o key-value ) típicamente delimitados por dos puntos y un espacio ( :␣).

Como mencioné, "cerrar sesión" no es el único avance en la práctica actual. Ver por ejemplo este commit , que tiene que ver con "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]>

Además del trailer de "cierre de sesión" en lo anterior, hay:

  • "Cc" (se le notificó sobre el parche)
  • "Acked-by" (reconocido por el propietario del código, "me parece bien")
  • “Revisado por” (revisado)
  • “Reportado y probado por” (informó y probó el problema (supongo))

Otros proyectos, como por ejemplo Gerrit, tienen sus propios encabezados y significado asociado para ellos.

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

Moraleja de la historia

Tengo la impresión de que, aunque la motivación inicial para estos metadatos en particular fueron algunos problemas legales (a juzgar por las otras respuestas), la práctica de dichos metadatos ha progresado más allá de solo tratar el caso de formar una cadena de autoría.

[↑ 1]: man git-interpret-trailers
[↑ 2]: Parece que a veces también se les llama "sollozo" (iniciales).

Guildenstern
fuente
2
Interesante caso de uso. +1
VonC