Untuk apa fitur Sign Off di Git?

564

Apa gunanya fitur Sign Off di Git ?

git commit --signoff

Kapan saya harus menggunakannya, jika sama sekali?

Clark Gaebel
sumber

Jawaban:

536

Sign-off adalah persyaratan untuk mendapatkan tambalan ke kernel Linux dan beberapa proyek lainnya, tetapi sebagian besar proyek tidak benar-benar menggunakannya.

Itu diperkenalkan setelah gugatan SCO , (dan tuduhan pelanggaran hak cipta dari SCO lainnya , yang sebagian besar tidak pernah mereka bawa ke pengadilan), sebagai Surat Keterangan Asal Pengembang . Ini digunakan untuk mengatakan bahwa Anda menyatakan bahwa Anda telah membuat tambalan tersebut, atau bahwa Anda menyatakan bahwa sepengetahuan Anda, itu dibuat di bawah lisensi sumber terbuka yang sesuai, atau bahwa itu telah diberikan kepada Anda oleh seseorang lain di bawah persyaratan tersebut. Ini dapat membantu membangun rantai orang yang bertanggung jawab atas status hak cipta dari kode yang dimaksud, untuk membantu memastikan bahwa kode yang dilindungi hak cipta tidak dirilis di bawah lisensi perangkat lunak (sumber terbuka) gratis yang sesuai tidak termasuk dalam kernel.

Brian Campbell
sumber
91
Perlu dicatat bahwa makna yang dideskripsikan adalah makna yang diberikan pada Signed-off-by:baris pesan commit oleh proyek kernel Linux (dan proyek Git itu sendiri). Untuk proyek-proyek lain, bagaimanapun, garis tersebut tidak ada artinya kecuali pihak yang ditunjuk proyek yang berarti mereka (misalnya dengan menggambarkan mereka dalam dokumentasi proyek, misalnya Linux SubmittingPatches atau Git ini SubmittingPatches ).
Chris Johnsen
39
Jadi mengapa ini perlu dilakukan dalam pesan komit? Saya pikir komit memiliki penulis yang menyertainya, dan mereka adalah bagian dari hash SHA1?
Leif Andersen
34
@Leif Mere informasi kepengarangan tidak mencukupi. Saya mungkin telah menulis sebuah tambalan, tetapi jika saya mendasarkannya pada beberapa kode dari Unix, saya tidak akan memiliki izin untuk melepaskannya di bawah GPL (setidaknya tanpa penandatanganan dari seseorang yang lebih tinggi). Atau, sebuah tambalan mungkin dibuat di antara beberapa pengelola yang berbeda sebelum ditutup di pohon kernel; tanda-tanda menunjukkan rantai tahanan. Baca sertifikat asal yang saya tautkan; itulah artinya ketika Anda menambahkan garis keluar. Header "Penulis" mungkin tidak akurat, dan tidak selalu menyiratkan persetujuan dengan semua yang ada dalam sertifikat asal.
Brian Campbell
68
Tanpa kunci PGP, bagaimana bisa dipastikan bahwa penandatanganan itu asli?
HRJ
7
@ HRJ Keaslian dari yang ditandatangani sebenarnya ada pada Anda (komiter). Tidak pada penulis, juga pada menandatangani sendiri. Jika nanti seseorang (terutama yang telah menandatangani) membantahnya tidak valid, Anda sebaiknya memiliki email atau sesuatu yang membuktikan bahwa ia menyetujuinya. Commiter mungkin mengatakan dia tidak melakukan gumpalan seperti itu JIKA gumpalan tidak ditandatangani GPG (IMHO pertahanan lemah, tapi ...). Dalam hal ini, komiter dapat menggunakan -S untuk menutup lingkaran. Sekarang dengan -S dan -s Anda memiliki rantai penahanan berdasarkan kata komiter, bahwa kode yang ditulis oleh beberapa penulis berwenang untuk digunakan oleh beberapa penandatanganan lebih tinggi.
Dr Beco
70

Sign-off adalah baris di akhir pesan komit yang menyatakan siapa penulis komit tersebut. Tujuan utamanya adalah untuk meningkatkan pelacakan siapa yang melakukan apa, terutama dengan tambalan.

Contoh komit:

Add tests for the payment processor.

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

Itu harus berisi nama asli pengguna jika digunakan untuk proyek open-source.

Jika pengelola cabang perlu sedikit memodifikasi tambalan untuk menggabungkannya, ia bisa meminta submitter untuk melakukan rediff, tetapi itu akan menjadi kontra-produktif. Dia dapat menyesuaikan kode dan menandatangani di akhir sehingga penulis asli masih mendapat kredit untuk 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]>

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

Andrzej Rehmann
sumber
38
Bukankah itu berlebihan dengan authorbidang git komit? Saya selalu berpikir itu sebabnya ada bidang yang terpisah authordan committer. Penulis menjadi penulis tambalan dan komuter adalah orang yang menerapkan dan mendorong tambalan.
Leif Gruenwoldt
10
Apakah itu benar-benar menyatakan siapa penulis komit? Maksudku, sebanyak -S (--gpg-sign) tidak, karena saya tidak berpikir begitu. Saya pikir siapa pun dapat menambahkan baris "Ditandatangani oleh" dengan nama dan email apa pun, sedangkan tanda tangan GPG jauh lebih dapat diandalkan, tetapi mungkin saya salah.
hdl
1
“Sign-off adalah baris di akhir pesan komit yang menyatakan siapa penulis komit tersebut. Tujuan utamanya adalah untuk meningkatkan pelacakan siapa yang melakukan apa, terutama dengan tambalan. ” - Itu hampir pasti salah (khususnya kalimat pertama). Sebagai contoh tandingan, lihat misalnya b2c150d3aa (ditautkan dalam jawaban VonC) , yang memiliki dua tajuk ditandatangani-oleh; satu oleh penulis , dan satu oleh pengelola. Ini adalah praktik umum dalam proyek Git dan Linux.
Guildenstern
(Lanjutan dari komentar sebelumnya.) Untuk sign-off berarti Anda telah membuat komit dalam kondisi tertentu, atau bahwa Anda menyampaikan sesuatu yang telah ditulis oleh seseorang yang (telah berusaha) memenuhi kondisi tersebut di atas. Jadi itu membentuk sesuatu seperti rantai sertifikasi.
Guildenstern
Perbarui di atas: ternyata saya melewatkan sesuatu di balasan terakhir saya, jadi saya meremehkan jawaban ini. Penulis sebagian benar tentang "menyesuaikan kode", tetapi menempatkan penekanan yang salah pada trailer "sign-off". Dokumentasi mengatakan bahwa Anda harus menambahkan trailer yang diberi tanda kurung (seperti pada contoh dalam jawaban) yang menginformasikan tentang itu. Jadi sign-off bersamaan dengan itu dapat digunakan untuk menambahkan perubahan kecil oleh orang-orang seperti integrator / pengelola. Tetapi sign-off masih berfungsi terutama seperti yang saya jelaskan.
Guildenstern
30

git 2.7.1 (Februari 2016) mengklarifikasi bahwa dalam commit b2c150d (05 Jan 2016) oleh David A. Wheeler ( david-a-wheeler) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 7aae9ba , 05 Feb 2016)

git commithalaman manual sekarang termasuk:

-s::
--signoff::

Tambahkan Signed-off-bybaris oleh committer di akhir pesan log komit.
Arti penandatanganan tergantung pada proyek, tetapi biasanya menyatakan bahwa pengendara memiliki hak untuk mengirimkan karya ini di bawah lisensi yang sama dan setuju dengan Surat Keterangan Asal Pengembang (lihat https://developercertificate.org untuk informasi lebih lanjut).


Luaskan dokumentasi yang menjelaskan --signoff

Ubah berbagai file dokumen (halaman manual) untuk menjelaskan secara lebih terperinci apa --signoffartinya.

Ini terinspirasi oleh " artikel lwn 'Bottomley: Sebuah proposal sederhana tentang DCO' " (Sertifikat Pengembang Asal) di mana paulj mencatat:

Masalah saya dengan DCO adalah bahwa ada menambahkan " -s" argumen untuk git commit tidak benar-benar berarti Anda bahkan mendengar tentang DCO ( yang git commithalaman manual tidak menyebutkan di mana saja DCO ), tidak pernah keberatan benar-benar melihat hal itu.

Jadi bagaimana bisa kehadiran " signed-off-by" dengan cara apa pun menyiratkan pengirim setuju dan berkomitmen ke DCO? Digabungkan dengan fakta, saya telah melihat balasan pada daftar ke tambalan tanpa SOB yang mengatakan tidak lebih dari "Kirim ulang ini dengan signed-off-bysehingga saya dapat melakukan itu".

Memperluas dokumentasi git akan membuatnya lebih mudah untuk berargumen bahwa pengembang mengerti --signoffketika mereka menggunakannya.


Perhatikan bahwa signoff ini sekarang (untuk Git 2.15.x / 2.16, Q1 2018) juga tersedia git pull.

Lihat komit 3a4d2c7 (12 Okt 2017) oleh W. Trevor King ( wking) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit fb4cd88 , 06 Nov 2017)

pull: lolos --signoff/--no-signoffke " git merge"

penggabungan dapat mengambil --signoff, tetapi tanpa menarik melewati --signoff, itu tidak nyaman untuk digunakan; izinkan ' pulluntuk mengambil opsi dan meneruskannya.

VONC
sumber
2
Bahkan dengan dokumentasi git commit (akhirnya) referensi dokumen, flag -s berniat untuk menunjukkan pengetahuan dan persetujuan / persetujuan / ??? untuk, saya percaya SOB secara hukum sangat lemah. SOB adalah, saya pikir paling tidak, diciptakan oleh Linus untuk menyelesaikan masalah sosial di mana orang lain mengadvokasi birokrasi yang mahal. Linus tidak menginginkan apa-apa, tetapi muncul dengan itu untuk membuat mereka diam. Sejauh yang saya tahu, pengacara tidak akan menyarankan Anda untuk berinvestasi banyak, jika ada, percaya padanya. (Saya 'paulj' di LWN).
paulj
3
VONC, Anda seorang kurator Git yang sesungguhnya. Anda selalu memiliki jawaban yang terstruktur, informatif, dan direferensikan dengan baik pada pertanyaan-pertanyaan seperti ini - menelusuri sejarah pengembangan Git ke alat dan dokumentasi yang akhirnya menghadap pengguna. Jadi terimakasih untuk itu.
Guildenstern
3
@Guildenstern Terima kasih atas komentar yang bagus ini.
VonC
17

Ada beberapa jawaban yang bagus untuk pertanyaan ini. Saya akan mencoba menambahkan jawaban yang lebih luas, yaitu tentang apa jenis garis / header / trailer ini dalam praktik saat ini. Tidak terlalu banyak tentang header sign-off pada khususnya (itu bukan satu-satunya).

Header atau trailer (↑ 1) seperti "sign-off" (↑ 2) adalah, dalam praktik saat ini dalam proyek-proyek seperti Git dan Linux, terstruktur metadata yang efektif untuk komit. Ini semua ditambahkan ke akhir pesan komit, setelah bagian "bentuk bebas" (tidak terstruktur) dari tubuh pesan. Ini adalah pasangan token-value (atau key-value ) yang biasanya dibatasi oleh titik dua dan spasi ( :␣).

Seperti yang saya sebutkan, "sign-off" bukan satu-satunya trailer dalam praktik saat ini. Lihat misalnya komit ini , yang berkaitan dengan "Sapi Kotor":

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

Selain cuplikan "sign-off" di atas, ada:

  • "Cc" (diberitahu tentang tambalan)
  • “Acked-by” (diakui oleh pemilik kode, “terlihat bagus untuk saya”)
  • “Ditinjau oleh” (diulas)
  • “Dilaporkan-dan-diuji-oleh” (melaporkan dan menguji masalah ini (saya berasumsi))

Proyek-proyek lain, seperti misalnya Gerrit, memiliki header sendiri dan makna yang terkait untuk mereka.

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

Pesan moral dalam cerita

Adalah kesan saya bahwa, meskipun motivasi awal untuk metadata khusus ini adalah beberapa masalah hukum (dilihat dari jawaban lain), praktik metadata tersebut telah berkembang melampaui hanya berurusan dengan kasus pembentukan rantai kepenulisan.

[↑ 1]: man git-interpret-trailers
[↑ 2]: Tampaknya ini juga kadang-kadang disebut “isak” (inisial).

Guildenstern
sumber
2
Kasus penggunaan yang menarik. +1
VonC