À quoi sert la fonctionnalité de déconnexion dans Git?

Réponses:

536

La déconnexion est une condition requise pour obtenir des correctifs dans le noyau Linux et quelques autres projets, mais la plupart des projets ne l'utilisent pas réellement.

Il a été introduit à la suite du procès de SCO (et d' autres accusations de violation du droit d'auteur de SCO , dont la plupart n'ont jamais été portées devant les tribunaux), en tant que certificat d'origine des développeurs . Il est utilisé pour dire que vous certifiez que vous avez créé le patch en question, ou que vous certifiez qu'à votre connaissance, il a été créé sous une licence open source appropriée, ou qu'il vous a été fourni par quelqu'un autrement dans ces conditions. Cela peut aider à établir une chaîne de personnes qui prennent la responsabilité du statut de copyright du code en question, pour aider à garantir que le code protégé par le droit d'auteur non publié sous une licence de logiciel libre (open source) appropriée n'est pas inclus dans le noyau.

Brian Campbell
la source
91
Il convient de noter que la signification décrite est celle attribuée aux Signed-off-by:lignes de message de validation par le projet de noyau Linux (et le projet Git lui-même). Pour d'autres projets, cependant, ces lignes n'ont de sens que si le projet leur attribue un sens (par exemple, en les décrivant dans la documentation du projet; par exemple, SubmittingPatches de Linux ou Git's SubmittingPatches ).
Chris Johnsen
39
Alors pourquoi cela devait-il être fait dans le message de validation? Je pensais que les commits avaient un auteur attaché à eux, et ils faisaient partie du hachage SHA1?
Leif Andersen
34
Les informations sur la paternité de @Leif Mere ne sont pas suffisantes. J'aurais peut-être écrit un correctif, mais si je le basais sur du code d'Unix, je n'aurais pas la permission de le publier sous la GPL (au moins sans l'approbation de quelqu'un de plus haut). Ou bien, un correctif peut passer entre plusieurs mainteneurs différents avant de se retrouver dans l'arborescence du noyau; la signature indique la chaîne de possession. Lisez le certificat d'origine auquel j'ai lié; c'est ce que cela signifie lorsque vous ajoutez une ligne d'approbation. L'en-tête "Auteur" peut être inexact et n'implique pas nécessairement un accord avec tout dans le certificat d'origine.
Brian Campbell
68
Sans clé PGP, comment peut-on établir que la signature est authentique?
HRJ
7
@HRJ L'authenticité d'une signature est en fait sur vous (commiter). Pas sur l'auteur, ni sur la signature lui-même. Si plus tard, quelqu'un (principalement la personne signée) conteste sa validité, vous feriez mieux d'avoir avec vous un e-mail ou quelque chose qui prouve qu'il l'a accepté. Commiter peut dire qu'il n'a pas commis un tel blob SI le blob n'est pas signé GPG (à mon humble avis une défense faible, mais ...). Dans ce cas, le commiter peut utiliser -S pour fermer le cercle. Maintenant, avec -S et -s, vous avez une chaîne de possession basée sur la parole de l'auteur, selon laquelle le code écrit par un auteur est autorisé à être utilisé par certains signataires plus haut.
Dr Beco
70

La signature est une ligne à la fin du message de validation qui certifie qui est l'auteur de la validation. Son objectif principal est d'améliorer le suivi de qui a fait quoi, en particulier avec les correctifs.

Exemple de validation:

Add tests for the payment processor.

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

Il doit contenir le nom réel de l'utilisateur s'il est utilisé pour un projet open-source.

Si le responsable de succursale devait modifier légèrement les correctifs afin de les fusionner, il pourrait demander à l'émetteur de rediffuser, mais ce serait contre-productif. Il peut ajuster le code et mettre sa signature à la fin afin que l'auteur original obtienne toujours le crédit pour le 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]>

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

Andrzej Rehmann
la source
38
N'est-ce pas redondant par le authorchamp d'un git commit? J'ai toujours pensé que ce pourquoi il y avait un indépendant authoret le committerterrain. L'auteur étant l'auteur du correctif et le committer étant le gars qui a appliqué et poussé le correctif.
Leif Gruenwoldt
10
Certifie- t-il vraiment qui est l'auteur d'un commit? Je veux dire, autant que -S (--gpg-sign), parce que je ne pense pas. Je pense que n'importe qui pourrait ajouter une ligne "signé par" avec n'importe quel nom et e-mail, alors qu'une signature GPG est beaucoup plus fiable, mais je me trompe peut-être.
hdl
1
«La signature est une ligne à la fin du message de validation qui certifie qui est l'auteur de la validation. Son objectif principal est d'améliorer le suivi de qui a fait quoi, en particulier avec les correctifs. » - C'est presque certainement faux (en particulier la première phrase). À titre de contre-exemple, voir par exemple b2c150d3aa (lié à dans la réponse de VonC) , qui a deux en-têtes signés par; une par l' auteur et une par le mainteneur. C'est une pratique courante dans les projets Git et Linux.
Guildenstern
(Suite du commentaire précédent.) La signature signifie que vous avez rédigé le commit sous certaines conditions, ou que vous transmettez quelque chose qui a été rédigé par quelqu'un qui a (stribué) remplir la condition susmentionnée. Il s'agit donc d'une sorte de chaîne de certification.
Guildenstern
Mise à jour sur ce qui précède: il s'avère que j'ai raté quelque chose dans ma dernière réponse, et j'ai donc sous-estimé cette réponse. L'auteur a partiellement raison au sujet de «l'ajustement du code», mais insiste mal sur la bande-annonce «approbation». La documentation indique que vous devez ajouter une bande-annonce entre crochets (comme dans l'exemple de la réponse) qui informe à ce sujet. Ainsi, l'approbation en conjonction avec cela peut être utilisée pour ajouter de petits changements par des personnes comme l'intégrateur / mainteneur. Mais la signature sert toujours principalement à ce que j'ai décrit.
Guildenstern
30

git 2.7.1 (février 2016) précise que dans commit b2c150d (05 janvier 2016) par David A. Wheeler ( david-a-wheeler) .
(Fusionné par Junio ​​C Hamano - gitster- en commit 7aae9ba , 05 févr.2016 )

git commitla page de manuel comprend désormais:

-s::
--signoff::

Ajoutez une Signed-off-byligne par le committer à la fin du message du journal de validation.
La signification d'une approbation dépend du projet, mais elle certifie généralement que le committer a le droit de soumettre ce travail sous la même licence et accepte un certificat d'origine de développeur (voir https://developercertificate.org pour plus d'informations).


Développer la documentation décrivant --signoff

Modifier divers fichiers de document (page de manuel) pour expliquer plus en détail ce --signoff signifie.

Cela a été inspiré par " lwn article 'Bottomley: A modest proposition on the DCO' " (Developer Certificate of Origin) où paulj a noté:

Le problème que j'ai avec DCO est que l' ajout d'un -sargument " " pour git commit ne signifie pas vraiment que vous avez même entendu parler du DCO ( la git commitpage de manuel ne fait aucune mention du DCO n'importe où ), sans même le voir.

Alors, comment la présence de " signed-off-by" peut-elle impliquer d'une manière ou d'une autre que l'expéditeur accepte et s'engage auprès de l'ACD? Combiné avec le fait, j'ai vu des réponses sur des listes de correctifs sans SOB qui ne disent rien de plus que "Renvoyez cela avec signed-off-bypour que je puisse le valider".

L'extension de la documentation de git facilitera l'argument selon lequel les développeurs ont compris --signoffquand ils l'utilisent.


Notez que cette approbation est désormais disponible (pour Git 2.15.x / 2.16, Q1 2018) git pull.

Voir commit 3a4d2c7 (12 octobre 2017) de W.Trevor King ( wking) .
(Fusionné par Junio ​​C Hamano - gitster- dans commit fb4cd88 , 06 nov.2017 )

pull: passer --signoff/--no-signoffà " git merge"

la fusion peut prendre --signoff, mais sans tirer --signoffvers le bas, elle n'est pas pratique à utiliser; permettre à ' pull' de prendre l'option et de la transmettre.

VonC
la source
2
Même avec la documentation de git commit (enfin) référençant le document, le drapeau -s a l'intention d'indiquer la connaissance et l'accord / l'assentiment / ??? à, je crois que le SOB est légalement très faible. SOB a été, je pense au moins, inventé par Linus pour résoudre un problème social dans la mesure où d'autres préconisaient une bureaucratie à frais généraux élevés. Linus ne voulait rien, mais il a trouvé ça pour les faire taire. Autant que je sache, les avocats ne vous conseilleraient pas d'investir beaucoup, le cas échéant, en leur faisant confiance. (Je suis 'paulj' sur LWN).
paulj
3
VonC, vous êtes un vrai conservateur Git. Vous avez toujours des réponses aussi bien structurées, informatives et bien référencées sur des questions comme celle-ci - retraçant l'histoire du développement de Git jusqu'aux éventuels outils et documentation destinés aux utilisateurs. Merci pour ça.
Guildenstern
3
@Guildenstern Merci pour ce gentil commentaire.
VonC
17

Il y a de belles réponses à cette question. J'essaierai d'ajouter une réponse plus large, à savoir ce que sont ces types de lignes / en-têtes / bandes-annonces dans la pratique actuelle. Pas tellement sur l'en-tête de signature en particulier (ce n'est pas le seul).

Les en-têtes ou bandes - annonces (↑ 1) comme «signature» (↑ 2) sont, dans la pratique actuelle dans des projets comme Git et Linux, des métadonnées efficacement structurées pour la validation. Ceux-ci sont tous ajoutés à la fin du message de validation, après la partie «forme libre» (non structurée) du corps du message. Il s'agit de paires jeton-valeur (ou clé-valeur ) généralement délimitées par deux points et un espace ( :␣).

Comme je l'ai mentionné, la «signature» n'est pas la seule bande-annonce dans la pratique actuelle. Voir par exemple ce commit , qui a à voir avec «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]>

En plus de la bande-annonce de «signature» ci-dessus, il y a:

  • «Cc» (a été informé du patch)
  • «Acked-by» (reconnu par le propriétaire du code, «me semble bien»)
  • «Révisé par» (révisé)
  • «Signalé et testé par» (a signalé et testé le problème (je suppose))

D'autres projets, comme par exemple Gerrit, ont leurs propres en-têtes et leur signification associée.

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

Morale de l'histoire

J'ai l'impression que, bien que la motivation initiale de ces métadonnées particulières ait été quelques problèmes juridiques (à en juger par les autres réponses), la pratique de ces métadonnées a progressé au-delà du simple traitement du cas de la formation d'une chaîne de paternité.

[↑ 1]: man git-interpret-trailers
[↑ 2]: Ceux-ci sont aussi parfois appelés «sanglot» (initiales), semble-t-il.

Guildenstern
la source
2
Cas d'utilisation intéressant. +1
VonC