A cosa serve la funzione di disconnessione in Git?


Risposte:


536

La firma è un requisito per ottenere patch nel kernel di Linux e in alcuni altri progetti, ma la maggior parte dei progetti non lo utilizza effettivamente.

È stato introdotto sulla scia della causa SCO (e altre accuse di violazione del copyright da parte di SCO , la maggior parte delle quali non ha mai portato in tribunale), come certificato di origine degli sviluppatori . Viene utilizzato per affermare che si certifica di aver creato la patch in questione, o che si certifica che, per quanto a sua conoscenza, è stata creata con una licenza open source appropriata o che è stata fornita da qualcuno altro in quei termini. Questo può aiutare a stabilire una catena di persone che si assumono la responsabilità dello stato del copyright del codice in questione, per garantire che il codice protetto da copyright non rilasciato sotto un'appropriata licenza di software libero (open source) non sia incluso nel kernel.


91
Va notato che il significato descritto è quello assegnato alle Signed-off-by:righe dei messaggi di commit dal progetto del kernel Linux (e dal progetto Git stesso). Per gli altri progetti, tuttavia, tali linee sono privi di significato a meno che gli aventi causa del progetto significato ad essi (ad esempio, descrivendoli nella documentazione del progetto, ad esempio di Linux SubmittingPatches o di Git SubmittingPatches ).
Chris Johnsen,

39
Quindi perché è stato necessario farlo nel messaggio di commit? Pensavo che i commit avessero un autore collegato a loro, e facevano parte dell'hash SHA1?
Leif Andersen,

34
@Leif Le informazioni sulla paternità non sono sufficienti. Potrei aver scritto una patch, ma se la basassi su un codice di Unix, non avrei il permesso di rilasciarlo sotto GPL (almeno senza la firma di qualcuno più in alto). Oppure, una patch può farcela tra diversi manutentori diversi prima di finire nella struttura del kernel; la firma indica la catena di custodia. Leggi il certificato di origine che ho collegato; questo è ciò che significa quando aggiungi una linea di firma. L'intestazione "Autore" potrebbe essere imprecisa e non implica necessariamente un accordo con tutto ciò che si trova nel certificato di origine.
Brian Campbell,

68
Senza chiave PGP, come si può stabilire che la firma è autentica?
HRJ,

7
@HRJ La genuinità di una firma è in realtà su di te (commiter). Non sull'autore, né sul firmatario stesso. Se in seguito qualcuno (principalmente il firmatario) contesta che non è valido, è meglio avere con te un'e-mail o qualcosa che dimostri che ha accettato. Commiter può dire che non ha commesso tale BLOB SE il BLOB non è firmato GPG (IMHO una difesa debole, ma ...). In questo caso, il commiter può usare -S per chiudere il cerchio. Ora con -S e -s hai una catena di custodia basata sulla parola del committente, che il codice scritto da un autore è autorizzato ad essere utilizzato da alcuni firmati in alto.
Dr Beco,

70

La firma è una riga alla fine del messaggio di commit che certifica chi è l'autore del commit. Il suo scopo principale è migliorare il tracciamento di chi ha fatto cosa, specialmente con le patch.

Esempio di commit:

Add tests for the payment processor.

Signed-off-by: Humpty Dumpty <humpty.dumpty@example.com>

Dovrebbe contenere il nome reale dell'utente se utilizzato per un progetto open source.

Se il manutentore del ramo ha bisogno di modificare leggermente le patch per unirle, potrebbe chiedere al redattore di rediffire, ma sarebbe controproducente. Può modificare il codice e mettere la firma alla fine in modo che l'autore originale ottenga ancora credito per la 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
Non è ridondante nel authorcampo di un commit git? Ho sempre pensato che per questo c'era una separata authore committercampo. L'autore è lo scrittore di patch e il committer è il ragazzo che ha applicato e spinto la patch.
Leif Gruenwoldt,

10
Certificato davvero chi è l'autore di un commit? Voglio dire, proprio come -S (--gpg-sign), perché non la penso così. Penso che chiunque potrebbe aggiungere una riga "Sign-off-by" con qualsiasi nome ed e-mail, mentre una firma GPG è molto più affidabile, ma forse mi sbaglio.
hdl,

1
“La firma è una riga alla fine del messaggio di commit che certifica chi è l'autore del commit. Il suo scopo principale è migliorare il monitoraggio di chi ha fatto cosa, specialmente con le patch. " - È quasi certamente sbagliato (in particolare la prima frase). Come contro-esempio, vedi ad esempio b2c150d3aa (collegato alla risposta di VonC) , che ha due intestazioni firmate; uno dall'autore e uno dal manutentore. Questa è una pratica comune nei progetti Git e Linux.
Guildenstern,

(Continua dal commento precedente.) La firma significa che è stato creato il commit in determinate condizioni o che si sta trasmettendo qualcosa che è stato creato da qualcuno che ha (prescritto) soddisfare la suddetta condizione. Quindi forma qualcosa come una catena di certificazione.
Guildenstern,

Aggiornamento su quanto sopra: si scopre che ho perso qualcosa nella mia ultima risposta e quindi ho sottovalutato questa risposta. L'autore ha parzialmente ragione su "aggiustare il codice", ma pone l'enfasi sbagliata sul trailer di "firma". La documentazione dice che è necessario aggiungere un trailer tra parentesi (come nell'esempio nella risposta) che lo informa. Quindi la firma in combinato disposto con quella può essere utilizzata per aggiungere piccole modifiche da parte di persone come l'integratore / manutentore. Ma la firma serve ancora principalmente come ho descritto.
Guildenstern,

30

git 2.7.1 (febbraio 2016) chiarisce che in commit b2c150d (05 gen 2016) di David A. Wheeler ( david-a-wheeler) .
(Unito da Junio ​​C Hamano - gitster- in commit 7aae9ba , 05 feb 2016)

git commitla pagina man ora include:

-s::
--signoff::

Aggiungi Signed-off-byriga dal committer alla fine del messaggio di registro di commit.
Il significato di una firma dipende dal progetto, ma in genere certifica che il committer ha i diritti di presentare quest'opera con la stessa licenza e accetta un certificato di origine per sviluppatori (vedere https://developercertificate.org per ulteriori informazioni).


Espandi la descrizione della documentazione --signoff

Modifica vari file di documenti (pagina man) per spiegare in modo più dettagliato cosa --signoffsignifica.

Questo è stato ispirato dall '" articolo lwn' Bottomley: una modesta proposta sul DCO " (Certificato di origine per sviluppatori) in cui Paul notava:

Il problema che ho con DCO è che l' aggiunta di un " -s" argomento a git commit non significa davvero che tu abbia mai sentito parlare del DCO ( la git commitpagina man non fa menzione del DCO da nessuna parte ), non importa davvero vederlo.

Quindi, come può la presenza di " signed-off-by" implicare in qualche modo che il mittente accetta e si impegna con il DCO? In combinazione con il fatto, ho visto le risposte sugli elenchi alle patch senza SOB che non dicono altro che "Rinvia questo con signed-off-bycosì posso commetterlo".

L'estensione della documentazione di git renderà più facile sostenere che gli sviluppatori --signoffabbiano capito quando la usano.


Nota che questo signoff è ora disponibile (anche per Git 2.15.x / 2.16, Q1 2018) git pull.

Vedi commit 3a4d2c7 (12 ott 2017) di W. Trevor King ( wking) .
(Unita da Junio ​​C Hamano - gitster- in commit fb4cd88 , 06 nov 2017)

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

l'unione può richiedere --signoff, ma senza trascinare --signoffverso il basso, è scomodo da usare; consenti ' pull' di prendere l'opzione e passarla attraverso.


2
Anche con la documentazione di git commit (finalmente) che fa riferimento al documento la bandiera -s intende indicare conoscenza e accordo / consenso / ??? a, credo che lo SOB sia legalmente molto debole. Penso che almeno SOB sia stato inventato da Linus per risolvere un problema sociale in quanto altri stavano sostenendo una burocrazia generale. Linus non voleva nulla, ma inventò quello per zittirli. Per quanto ne so, gli avvocati non ti consiglierebbero di investire molto, se del caso, in essa. (Sono 'paulj' su LWN).
paulj,

3
VonC, sei un vero curatore di Git. Hai sempre risposte così strutturate, istruttive e con riferimenti incrociati su domande come questa: tracciare la storia dello sviluppo di Git su eventuali strumenti e documentazione rivolti all'utente. Quindi grazie.
Guildenstern,

3
@Guildenstern Grazie per questo bel commento.
VonC,

17

Ci sono alcune belle risposte a questa domanda. Proverò ad aggiungere una risposta più ampia, vale a dire di cosa trattano questi tipi di linee / intestazioni / rimorchi nella pratica attuale. Non tanto sull'intestazione della firma in particolare (non è l'unica).

Header o trailer (↑ 1) come "sign-off" (↑ 2) sono, nella pratica corrente in progetti come Git e Linux, metadati strutturati in modo efficace per il commit. Questi sono tutti aggiunti alla fine del messaggio di commit, dopo la parte "forma libera" (non strutturata) del corpo del messaggio. Queste sono coppie token-valore (o chiave-valore ) in genere delimitate da due punti e uno spazio ( :␣).

Come ho già detto, il "sign-off" non è l'unico trailer nella pratica attuale. Vedi ad esempio questo commit , che ha a che fare 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 <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>

Oltre al trailer di "firma" di cui sopra, c'è:

  • "Cc" (è stato informato della patch)
  • "Acked-by" (riconosciuto dal proprietario del codice, "mi sta bene")
  • “Review-by” (recensione)
  • "Segnalato e testato da" (segnalato e testato il problema (presumo))

Altri progetti, come ad esempio Gerrit, hanno le loro intestazioni e il significato associato per loro.

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

Morale della storia

La mia impressione è che, sebbene la motivazione iniziale per questi particolari metadati fosse di natura giuridica (a giudicare dalle altre risposte), la pratica di tali metadati è andata oltre il solo caso di formare una catena di autori.

[↑ 1]: man git-interpret-trailers
[↑ 2]: a volte sono anche chiamati "singhiozzo" (iniziali).


2
Caso d'uso interessante. +1
VonC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.