Do czego służy funkcja Wyloguj się w Git?

563

Jaki jest sens funkcji Wyloguj się w Git ?

git commit --signoff

Kiedy powinienem go użyć, jeśli w ogóle?

Clark Gaebel
źródło

Odpowiedzi:

535

Wylogowanie się jest wymagane do uzyskania łatek do jądra Linuksa i kilku innych projektów, ale większość projektów tak naprawdę go nie używa.

Został wprowadzony w następstwie procesu SCO (i innych oskarżeń SCO o naruszenie praw autorskich , z których większość nigdy nie wniosła sprawy do sądu), jako świadectwo pochodzenia deweloperów . Mówi się, że poświadczasz, że utworzyłeś łatkę, o której mowa, lub że, zgodnie z Twoją najlepszą wiedzą, został on utworzony na podstawie odpowiedniej licencji typu open source lub że został Ci dostarczony przez kogoś jeszcze na tych warunkach. Może to pomóc w ustanowieniu łańcucha osób, które biorą odpowiedzialność za status praw autorskich danego kodu, aby zapewnić, że kod chroniony prawem autorskim, który nie został wydany na podstawie odpowiedniej licencji wolnego oprogramowania (open source), nie jest zawarty w jądrze.

Brian Campbell
źródło
91
Należy zauważyć, że opisane znaczenie to znaczenie przypisane do Signed-off-by:linii komunikatów zatwierdzania przez projekt jądra Linux (i sam projekt Git). Jednak w przypadku innych projektów takie wiersze nie mają znaczenia, chyba że projekt przypisuje im znaczenie (np. Opisując je w dokumentacji projektu; np. Linux SubmittingPatches lub Git's SubmittingPatches ).
Chris Johnsen,
39
Dlaczego więc trzeba to zrobić w komunikacie zatwierdzenia? Myślałem, że do commits był dołączony autor, a oni byli częścią skrótu SHA1?
Leif Andersen
34
@Leif Zwykłe informacje o autorze nie są wystarczające. Mógłbym napisać łatkę, ale gdybym ją oparł na jakimś kodzie z Uniksa, nie miałbym pozwolenia na wydanie jej na GPL (przynajmniej bez podpisania się przez kogoś wyżej). Lub łatka może przedostać się między kilkoma różnymi opiekunami przed zamknięciem się w drzewie jądra; podpisanie wskazuje łańcuch kontroli. Przeczytaj świadectwo pochodzenia, z którym się łączyłem; to właśnie oznacza, kiedy dodajesz linię wypisywania się. Nagłówek „Autor” może być niedokładny i niekoniecznie oznacza zgodę na wszystko w świadectwie pochodzenia.
Brian Campbell
68
Bez klucza PGP, jak można ustalić, że podpisanie jest autentyczne?
HRJ,
7
@HRJ Prawdziwość podpisania umowy spoczywa na tobie (komisarzu). Nie autor, ani sam podpisany. Jeśli później ktoś (głównie wyrejestrowany) zakwestionuje jego nieważność, lepiej mieć przy sobie e-mail lub coś, co dowodzi, że się na to zgodził. Dowódca może powiedzieć, że nie popełnił takiego obiektu BLOB, JEŻELI obiekt nie jest podpisany przez GPG (IMHO słaba obrona, ale ...). W takim przypadku komiter może użyć opcji -S, aby zamknąć okrąg. Teraz z -S i -s masz łańcuch opieki oparty na słowie komisarza, że ​​kod napisany przez jakiegoś autora jest upoważniony do używania przez niektórych podpisanych wyżej.
Dr Beco,
70

Wylogowanie to wiersz na końcu komunikatu zatwierdzenia, który poświadcza, kto jest autorem zatwierdzenia. Jego głównym celem jest poprawa śledzenia tego, kto co zrobił, zwłaszcza z łatkami.

Przykład zatwierdzenia:

Add tests for the payment processor.

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

Powinien zawierać prawdziwą nazwę użytkownika, jeśli jest używany w projekcie typu open source.

Jeśli opiekun oddziału będzie musiał nieznacznie zmodyfikować łatki w celu ich scalenia, może poprosić zgłaszającego o ponowne wprowadzenie poprawek, ale przyniosłoby to efekt przeciwny do zamierzonego. Może dostosować kod i odłożyć swój podpis na końcu, aby pierwotny autor wciąż zyskał uznanie za łatkę.

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

Źródło: http://gerrit.googlecode.com/svn/documentation/2.0/user-signedoffby.html

Andrzej Rehmann
źródło
38
Czy to nie jest zbędne w authordziedzinie git commit? Zawsze myślałem, że właśnie dlatego istniało oddzielne authori committerpole. Autor jest autorem łatek, a sprawcą jest facet, który zastosował i wypchnął łatkę.
Leif Gruenwoldt
10
Czy to naprawdę poświadcza, kto jest autorem zatwierdzenia? Mam na myśli, podobnie jak -S (--gpg-sign), ponieważ nie sądzę. Myślę, że każdy może dodać wiersz „Podpisany przez” z dowolnym imieniem i adresem e-mail, podczas gdy podpis GPG jest znacznie bardziej niezawodny, ale może się mylę.
hdl
1
„Wylogowanie to wiersz na końcu komunikatu zatwierdzenia, który poświadcza, kto jest autorem zatwierdzenia. Jego głównym celem jest poprawa śledzenia tego, kto co zrobił, zwłaszcza z łatkami. ” - To prawie na pewno złe (szczególnie pierwsze zdanie). Jako przykład, patrz na przykład b2c150d3aa (powiązany z odpowiedzią VonC) , który ma dwa podpisane nagłówki; jeden autor , a drugi opiekun. Jest to powszechna praktyka w projektach Git i Linux.
Guildenstern
(Ciąg dalszy od poprzedniego komentarza). Podpisanie się oznacza, że ​​jesteś autorem zatwierdzenia pod pewnymi warunkami lub że przekazujesz coś, co zostało napisane przez osobę, która (zobowiązała się) spełnić powyższy warunek. Tworzy więc coś w rodzaju łańcucha certyfikacji.
Guildenstern
Zaktualizuj powyższe: okazuje się, że w ostatniej odpowiedzi coś mi umknęło, więc nie doceniłem tej odpowiedzi. Autor częściowo ma rację co do „dostosowania kodu”, ale niewłaściwie kładzie nacisk na zwiastun „podpisania się”. Dokumentacja mówi, że powinieneś dodać nawias klamrowy (jak w przykładzie w odpowiedzi), który o tym informuje. W związku z tym podpisania w połączeniu z tym można użyć do dodania niewielkich zmian przez osoby takie jak integrator / opiekun. Ale podpisywanie się nadal służy głównie tak, jak to opisałem.
Guildenstern
30

git 2.7.1 (luty 2016 r.) wyjaśnia, że ​​w zatwierdzeniu b2c150d (05 stycznia 2016 r.) David A. Wheeler ( david-a-wheeler) .
(Połączone przez Junio ​​C Hamano - gitster- w commit 7aae9ba , 05 lutego 2016)

git commitstrona man zawiera teraz:

-s::
--signoff::

Dodaj Signed-off-bywiersz przez osobę zatwierdzającą na końcu komunikatu dziennika zatwierdzeń.
Znaczenie podpisania zależy od projektu, ale zwykle poświadcza, że ​​zlecający ma prawo do przesłania tej pracy na tej samej licencji i wyraża zgodę na certyfikat pochodzenia dewelopera ( więcej informacji na stronie https://developercertificate.org ).


Rozwiń dokumentację opisującą --signoff

Zmodyfikuj różne pliki dokumentów (strony podręcznika), aby bardziej szczegółowo wyjaśnić, co --signoffto znaczy.

Inspiracją był „ artykuł z„ Bottomley: skromna propozycja w DCO ” ” (Developer Certificate of Origin), w którym Paul zauważył:

Problem mam z DCO jest to, że dodanie „ -s” argumentem do git commit naprawdę nie znaczy, że nawet słyszał o DCO ( strona człowiek nie wspomina o tym nigdzie DCO ), nie wspominając rzeczywiście widział.git commit

Jak więc obecność „ signed-off-by” w jakikolwiek sposób może sugerować, że nadawca zgadza się z DCO? W połączeniu z faktem widziałem odpowiedzi na listach do poprawek bez SOB, które mówią tylko „Wyślij to ponownie signed-off-by, abym mógł to zatwierdzić”.

Rozszerzenie dokumentacji gita ułatwi argumentowanie, że programiści rozumieli, --signoffkiedy z niego korzystają.


Zauważ, że to wylogowanie jest teraz (dla Git 2.15.x / 2.16, Q1 2018) również dostępne git pull.

Zobacz commit 3a4d2c7 (12 października 2017 r.) Autorstwa W. Trevora Kinga ( wking) .
(Połączone przez Junio ​​C Hamano - gitster- w commit fb4cd88 , 06 listopada 2017)

pull: przejdź --signoff/--no-signoffdo „ git merge

scalanie może zająć --signoff, ale bez przeciągania w --signoffdół jest niewygodne w użyciu; pozwól „ pull”, aby wziąć opcję i przejść przez nią.

VonC
źródło
2
Nawet z dokumentacją git commit (w końcu) odnoszącą się do dokumentu, flaga -s zamierza wskazać wiedzę i zgodę / zgodę / ??? sądzę, że SOB jest prawnie bardzo słaby. Myślę, że SOB został wymyślony przez Linusa, aby rozwiązać problem społeczny, ponieważ inni opowiadali się za biurokracją o wysokim koszcie. Linus niczego nie chciał, ale wymyślił to, żeby je zamknąć. O ile mi wiadomo, prawnicy nie doradzaliby ci, abyś zainwestował w nią dużo, jeśli w ogóle, wiarę w nią. (Jestem „paulj” na LWN).
paulj
3
VonC, jesteś prawdziwym kuratorem Git. Zawsze masz tak dobrze skonstruowane, pouczające i ładnie powiązane odpowiedzi na pytania takie jak to - prześledzenie historii rozwoju Git do ostatecznych narzędzi i dokumentacji dla użytkowników. Więc dziękuję za to.
Guildenstern
3
@Guildenstern Dziękuję za ten miły komentarz.
VonC
17

Istnieje kilka fajnych odpowiedzi na to pytanie. Spróbuję dodać szerszą odpowiedź, a mianowicie o tym, jakie są tego rodzaju linie / nagłówki / przyczepy w obecnej praktyce. W szczególności nie tyle nagłówek podpisu (to nie jedyny).

Nagłówki lub zwiastuny (↑ 1), takie jak „sign-off” (↑ 2), są w obecnej praktyce w projektach takich jak Git i Linux, skutecznie ustrukturyzowane metadane dla zatwierdzenia. Wszystkie są dołączane na końcu komunikatu zatwierdzenia, po „swobodnej formie” (nieustrukturyzowanej) części treści komunikatu. Są to pary symbol-wartość (lub klucz-wartość ) zwykle rozdzielane dwukropkiem i spacją ( :␣).

Jak wspomniałem, „podpisanie się” nie jest jedynym zwiastunem w obecnej praktyce. Zobacz na przykład ten zatwierdzenie , które ma związek z „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]>

Oprócz powyższego zwiastuna „Sign-off” dostępne są:

  • „Cc” (powiadomiono o łatce)
  • „Acked-by” (potwierdzony przez właściciela kodu, „wygląda mi dobrze”)
  • „Oceniony przez” (zrecenzowany)
  • „Zgłoszone i przetestowane przez” (zgłoszono i przetestowałem problem (zakładam))

Inne projekty, jak na przykład Gerrit, mają dla nich własne nagłówki i związane z nimi znaczenie.

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

Morał historii

Mam wrażenie, że chociaż początkową motywacją dla tych konkretnych metadanych były pewne kwestie prawne (sądząc po innych odpowiedziach), praktyka takich metadanych wykroczyła poza zwykłe zajmowanie się przypadkiem tworzenia łańcucha autorstwa.

[↑ 1]: man git-interpret-trailers
[↑ 2]: Wydaje się, że są one czasem nazywane „szlochem” (inicjały).

Guildenstern
źródło
2
Ciekawy przypadek użycia. +1
VonC