Wofür ist die Abmeldefunktion in Git?

564

Was ist der Sinn der Abmeldefunktion in Git ? ?

git commit --signoff

Wann sollte ich es verwenden, wenn überhaupt?

Clark Gaebel
quelle

Antworten:

536

Das Abmelden ist eine Voraussetzung, um Patches in den Linux-Kernel und einige andere Projekte zu integrieren, aber die meisten Projekte verwenden ihn nicht wirklich.

Es wurde im Zuge der SCO-Klage (und anderer Vorwürfe wegen Urheberrechtsverletzung durch SCO , von denen die meisten nie vor Gericht gebracht wurden) als Ursprungszeugnis für Entwickler eingeführt . Es wird verwendet, um zu bestätigen, dass Sie bestätigen, dass Sie den betreffenden Patch erstellt haben, oder dass Sie nach bestem Wissen bestätigen, dass er unter einer geeigneten Open-Source-Lizenz erstellt wurde oder dass er Ihnen von jemandem zur Verfügung gestellt wurde sonst unter diesen Bedingungen. Dies kann dazu beitragen, eine Kette von Personen aufzubauen, die für den Urheberrechtsstatus des betreffenden Codes verantwortlich sind, um sicherzustellen, dass urheberrechtlich geschützter Code, der nicht unter einer geeigneten Lizenz für freie Software (Open Source) veröffentlicht wurde, nicht im Kernel enthalten ist.

Brian Campbell
quelle
91
Es ist zu beachten, dass die beschriebene Bedeutung diejenige ist, die den Signed-off-by:Commit-Nachrichtenzeilen vom Linux-Kernel-Projekt (und dem Git-Projekt selbst) zugewiesen wurde . Für andere Projekte sind solche Zeilen jedoch bedeutungslos, es sei denn, das Projekt weist ihnen eine Bedeutung zu (z. B. indem sie in der Projektdokumentation beschrieben werden, z. B. Linux's SubmissionPatches oder Git's SubmissionPatches ).
Chris Johnsen
39
Warum musste dies in der Festschreibungsnachricht erfolgen? Ich dachte, dass an Commits ein Autor angehängt war und sie Teil des SHA1-Hash waren?
Leif Andersen
34
@Leif Die bloße Urheberschaftsinformation reicht nicht aus. Ich hätte vielleicht einen Patch geschrieben, aber wenn ich ihn auf einem Code von Unix basieren würde, hätte ich keine Erlaubnis, ihn unter der GPL freizugeben (zumindest ohne Abmeldung von einer höheren Person). Oder ein Patch schafft es zwischen mehreren verschiedenen Betreuern, bevor es im Kernelbaum endet. Die Abmeldung gibt die Sorgerechtskette an. Lesen Sie das Ursprungszeugnis, mit dem ich verlinkt habe. Das bedeutet es, wenn Sie eine Abmeldezeile hinzufügen. Der "Author" -Header ist möglicherweise ungenau und impliziert nicht unbedingt die Übereinstimmung mit allem im Ursprungszeugnis.
Brian Campbell
68
Wie kann ohne PGP-Schlüssel festgestellt werden, dass die Abmeldung echt ist?
HRJ
7
@HRJ Die Echtheit einer Abmeldung liegt tatsächlich bei Ihnen (Commiter). Nicht auf Autor, noch auf dem abgemeldeten selbst. Wenn später jemand (hauptsächlich der Abgemeldete) bestreitet, dass er nicht gültig ist, sollten Sie eine E-Mail oder etwas mit sich führen, das beweist, dass er damit einverstanden ist. Commiter kann sagen, dass er einen solchen Blob nicht begangen hat, WENN der Blob nicht GPG-signiert ist (IMHO eine schwache Verteidigung, aber ...). In diesem Fall kann der Commiter -S verwenden, um den Kreis zu schließen. Mit -S und -s haben Sie jetzt eine Sorgerechtskette, die auf dem Wort des Commiters basiert und besagt, dass der von einem Autor geschriebene Code von einem höheren Benutzer verwendet werden darf.
Dr. Beco
70

Die Abmeldung ist eine Zeile am Ende der Festschreibungsnachricht, die bestätigt, wer der Autor der Festschreibung ist. Sein Hauptzweck ist es, die Verfolgung zu verbessern, wer was getan hat, insbesondere mit Patches.

Beispiel Commit:

Add tests for the payment processor.

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

Es sollte den echten Benutzernamen enthalten, wenn es für ein Open-Source-Projekt verwendet wird.

Wenn der Zweigstellenbetreuer Patches geringfügig ändern muss, um sie zusammenzuführen, könnte er den Übermittler auffordern, die Patches neu zu erstellen, dies wäre jedoch kontraproduktiv. Er kann den Code anpassen und seine Abmeldung am Ende setzen, damit der ursprüngliche Autor den Patch weiterhin gutschreibt.

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

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

Andrzej Rehmann
quelle
38
Ist das nicht überflüssig im authorBereich eines Git-Commits? Ich dachte immer , das ist , warum es ein separates war authorund committerFeld. Der Autor ist der Patch-Writer und der Committer der Typ, der den Patch angewendet und gepusht hat.
Leif Gruenwoldt
10
Bescheinigt es wirklich , wer der Autor eines Commits ist? Ich meine, genauso wie -S (--gpg-sign), weil ich das nicht glaube. Ich denke, jeder könnte eine "Abgemeldet von" -Zeile mit einem beliebigen Namen und einer beliebigen E-Mail-Adresse hinzufügen, während eine GPG-Signatur viel zuverlässiger ist, aber vielleicht irre ich mich.
HDL
1
„Abmelden ist eine Zeile am Ende der Festschreibungsnachricht, die bestätigt, wer der Autor des Festschreibens ist. Sein Hauptzweck ist es, die Verfolgung zu verbessern, wer was getan hat, insbesondere mit Patches. “ - Das ist mit ziemlicher Sicherheit falsch (speziell der erste Satz). Als Gegenbeispiel siehe zum Beispiel b2c150d3aa (verknüpft mit InCs Antwort) , das zwei von Signed-Off-Headern enthält. eine vom Autor und eine vom Betreuer. Dies ist in Git- und Linux-Projekten üblich.
Guildenstern
(Fortsetzung des vorherigen Kommentars.) Abmelden bedeutet, dass Sie das Commit unter bestimmten Bedingungen verfasst haben oder dass Sie etwas weitergeben, das von jemandem verfasst wurde, der die oben genannte Bedingung erfüllt hat. Es bildet also so etwas wie eine Zertifizierungskette.
Guildenstern
Update zu dem oben Gesagten: Es stellt sich heraus, dass ich in meiner letzten Antwort etwas verpasst habe, und deshalb habe ich diese Antwort unterschätzt. Der Autor hat teilweise Recht mit dem „Anpassen des Codes“, legt jedoch die falsche Betonung auf den Trailer zum „Abmelden“. In der Dokumentation heißt es, dass Sie einen Trailer in Klammern hinzufügen sollten (wie im Beispiel in der Antwort), der darüber informiert. So das die Abmelde in Verbindung mit , dass kann verwendet werden , um kleine Veränderungen von Menschen wie der Integrator / Betreuer hinzuzufügen. Aber die Abmeldung dient immer noch hauptsächlich als das, was ich beschrieben habe.
Guildenstern
30

Git 2.7.1 (Februar 2016) stellt klar, dass in Commit b2c150d (05. Januar 2016) von David A. Wheeler ( david-a-wheeler) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 7aae9ba , 05. Februar 2016)

git commitManpage enthält jetzt:

-s::
--signoff::

Fügen Sie Signed-off-byam Ende der Commit-Protokollnachricht eine Zeile des Committers hinzu.
Die Bedeutung einer Abmeldung hängt vom Projekt ab, bestätigt jedoch in der Regel, dass der Committer das Recht hat, diese Arbeit unter derselben Lizenz einzureichen, und stimmt einem Entwickler-Ursprungszeugnis zu ( weitere Informationen finden Sie unter https://developercertificate.org ).


Erweitern Sie die Beschreibung der Dokumentation --signoff

Ändern Sie verschiedene Dokumentdateien (Manpage), um detaillierter zu erklären, was --signoff bedeutet.

Dies wurde inspiriert von " lwn article 'Bottomley: Ein bescheidener Vorschlag zum DCO' " (Developer Certificate of Origin), in dem Paulj feststellte:

Das Problem, das ich mit DCO habe, ist, dass das Hinzufügen eines " -s" - Arguments zu git commit nicht wirklich bedeutet, dass Sie überhaupt von DCO gehört haben ( die git commitManpage erwähnt den DCO nirgendwo ), tatsächlich gesehen haben.

Wie kann das Vorhandensein von " signed-off-by" in irgendeiner Weise bedeuten, dass der Absender dem DCO zustimmt und sich dazu verpflichtet? In Kombination mit der Tatsache habe ich Antworten auf Listen auf Patches ohne SOBs gesehen, die nichts weiter sagen als "Senden Sie dies erneut mitsigned-off-by damit ich es kann".

Durch das Erweitern der Dokumentation von git wird es einfacher zu argumentieren, dass Entwickler verstanden haben, --signoffwann sie es verwenden.


Beachten Sie, dass diese Abmeldung jetzt (für Git 2.15.x / 2.16, Q1 2018) für verfügbar ist git pull .

Siehe Commit 3a4d2c7 (12. Oktober 2017) von W. Trevor King ( wking) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit fb4cd88 , 06. November 2017)

pull: Weitergabe --signoff/--no-signoffan " git merge"

Zusammenführen kann dauern --signoff, aber ohne Pull- --signoffDown- Passing ist es unpraktisch zu verwenden; Erlaube ' pull', die Option zu übernehmen und durchzuleiten.

VonC
quelle
2
Selbst wenn die git-Commit-Dokumentation (endlich) auf das Dokument verweist, soll das Flag -s Wissen und Zustimmung / Zustimmung / ??? Ich glaube, die SOB ist rechtlich sehr schwach. Ich denke, SOB wurde zumindest von Linus erfunden, um ein soziales Problem zu lösen, indem andere sich für eine Bürokratie mit hohem Overhead einsetzten. Linus wollte nichts, kam aber darauf, um sie zum Schweigen zu bringen. Soweit ich das beurteilen kann, würden Anwälte Ihnen nicht raten, viel, wenn überhaupt, Vertrauen in sie zu investieren. (Ich bin 'paulj' auf LWN).
Paulj
3
VonC, du bist ein echter Git-Kurator. Sie haben immer so gut strukturierte, informative und gut referenzierte Antworten auf Fragen wie diese - die Geschichte der Git-Entwicklung wird auf eventuelle benutzerbezogene Tools und Dokumentationen zurückgeführt. Also danke dafür.
Guildenstern
3
@ Guildenstern Danke für diesen schönen Kommentar.
VonC
17

Zu dieser Frage gibt es einige nette Antworten. Ich werde versuchen, eine breitere Antwort hinzuzufügen, nämlich darüber, worum es bei solchen Linien / Überschriften / Anhängern in der gegenwärtigen Praxis geht. Nicht so sehr über den Sign-Off-Header (es ist nicht der einzige).

Header oder Trailer (↑ 1) wie „Sign-Off“ (↑ 2) sind in der aktuellen Praxis in Projekten wie Git und Linux effektiv strukturierte Metadaten für das Commit. Diese werden alle an das Ende der Festschreibungsnachricht nach dem (unstrukturierten) Teil des Nachrichtentexts "freie Form" angehängt. Hierbei handelt es sich um Token-Wert- (oder Schlüssel-Wert- ) Paare, die normalerweise durch einen Doppelpunkt und ein Leerzeichen ( :␣) begrenzt sind.

Wie ich bereits erwähnt habe, ist „Abmelden“ nicht der einzige Trailer in der aktuellen Praxis. Siehe zum Beispiel dieses Commit , das mit „Dirty Cow“ zu tun hat:

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

Zusätzlich zu dem oben genannten "Sign-Off" -Anhänger gibt es:

  • "Cc" (wurde über den Patch benachrichtigt)
  • "Bestätigt von" (vom Eigentümer des Codes bestätigt, "sieht für mich gut aus")
  • "Überprüft von" (überprüft)
  • "Gemeldet und getestet von" (hat das Problem gemeldet und getestet (ich nehme an))

Andere Projekte, wie zum Beispiel Gerrit, haben ihre eigenen Überschriften und die damit verbundene Bedeutung.

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

Moral der Geschichte

Ich habe den Eindruck, dass, obwohl die anfängliche Motivation für diese bestimmten Metadaten einige rechtliche Probleme waren (nach den anderen Antworten zu urteilen), die Praxis solcher Metadaten über die bloße Behandlung des Falls der Bildung einer Kette von Autoren hinausgegangen ist.

[↑ 1]: man git-interpret-trailers
[↑ 2]: Diese werden anscheinend auch manchmal als „Schluchzen“ (Initialen) bezeichnet.

Guildenstern
quelle
2
Interessanter Anwendungsfall. +1
VonC