Tính năng Đăng xuất trong Git để làm gì?


Câu trả lời:


536

Đăng xuất là một yêu cầu để nhận các bản vá vào nhân Linux và một vài dự án khác, nhưng hầu hết các dự án không thực sự sử dụng nó.

Nó được đưa ra sau vụ kiện SCO , (và các cáo buộc khác về vi phạm bản quyền từ SCO , hầu hết trong số đó họ chưa bao giờ thực sự đưa ra tòa), như một Chứng nhận Xuất xứ của Nhà phát triển . Nó được sử dụng để nói rằng bạn xác nhận rằng bạn đã tạo ra bản vá được đề cập hoặc bạn chứng nhận rằng theo hiểu biết tốt nhất của bạn, nó được tạo ra theo giấy phép nguồn mở thích hợp hoặc do ai đó cung cấp cho bạn khác theo các điều khoản đó. Điều này có thể giúp thiết lập một chuỗi những người chịu trách nhiệm về tình trạng bản quyền của mã được đề cập, để giúp đảm bảo rằng mã bản quyền không được phát hành theo giấy phép phần mềm miễn phí (nguồn mở) thích hợp không được đưa vào kernel.


91
Cần lưu ý rằng ý nghĩa được mô tả là ý nghĩa được gán cho các Signed-off-by:dòng thông báo cam kết của dự án nhân Linux (và chính dự án Git). Tuy nhiên, đối với các dự án khác, các dòng như vậy là vô nghĩa trừ khi chuyển nhượng dự án có nghĩa đối với họ (ví dụ bằng cách mô tả chúng trong tài liệu của dự án; ví dụ như Linux SubmittingPatches hoặc Git của SubmittingPatches ).
Chris Johnsen

39
Vậy tại sao điều này cần phải được thực hiện trong thông điệp cam kết? Tôi nghĩ rằng các cam kết có một tác giả gắn liền với chúng, và chúng là một phần của hàm băm SHA1?
Leif Andersen

34
@Leif Thông tin về quyền tác giả chỉ là không đủ. Tôi có thể đã viết một bản vá, nhưng nếu tôi dựa trên một số mã từ Unix, tôi sẽ không được phép phát hành nó theo GPL (ít nhất là không có sự đăng xuất từ ​​ai đó cao hơn). Hoặc, một bản vá có thể làm cho nó giữa một số bảo trì khác nhau trước khi cuộn lên trong cây nhân; dấu hiệu cho thấy chuỗi quyền nuôi con. Đọc giấy chứng nhận xuất xứ mà tôi liên kết đến; đó là những gì nó có nghĩa là khi bạn thêm một dòng đăng nhập. Tiêu đề "Tác giả" có thể không chính xác và không nhất thiết có nghĩa là đồng ý với mọi thứ trong chứng nhận xuất xứ.
Brian Campbell

68
Không có khóa PGP, làm thế nào để xác minh rằng việc đăng xuất là chính hãng?
HRJ

7
@HRJ Tính xác thực của việc ký tắt thực sự thuộc về bạn (người đi làm). Không phải trên tác giả, không phải trên bản thân đã ký tắt. Nếu sau này ai đó (chủ yếu là đã ký tắt) tranh chấp không hợp lệ, tốt nhất bạn nên gửi cho bạn một email hoặc một cái gì đó chứng tỏ anh ta đồng ý với nó. Commiter có thể nói rằng anh ta đã không phạm phải blob như vậy NẾU blob không được ký GPG (IMHO phòng thủ yếu, nhưng ...). Trong trường hợp này, commiter có thể sử dụng -S để đóng vòng tròn. Bây giờ với -S và -s bạn có một chuỗi quyền giám sát dựa trên từ của người đi làm, rằng mã được viết bởi một số tác giả được ủy quyền để được sử dụng bởi một số người đã ký tắt cao hơn.
Bác sĩ Beco

70

Đăng xuất là một dòng ở cuối thông báo cam kết xác nhận ai là tác giả của cam kết. Mục đích chính của nó là để cải thiện việc theo dõi ai đã làm gì, đặc biệt là với các bản vá.

Cam kết ví dụ:

Add tests for the payment processor.

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

Nó phải chứa tên thật của người dùng nếu được sử dụng cho một dự án nguồn mở.

Nếu người bảo trì chi nhánh cần sửa đổi một chút các bản vá để hợp nhất chúng, anh ta có thể yêu cầu người nộp để xác định lại, nhưng nó sẽ phản tác dụng. Anh ta có thể điều chỉnh mã và đặt dấu ở cuối để tác giả ban đầu vẫn nhận được tín dụng cho bản vá.

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>

Nguồn: http://gerrit.googlecode.com/svn/documentation/2.0/user-signoffby.html


38
Không phải là dư thừa bởi authorlĩnh vực của một cam kết git? Tôi luôn luôn nghĩ rằng đó là lý do có là một riêng authorcommitterlĩnh vực. Tác giả là người viết bản vá và người đi làm là người áp dụng và đẩy bản vá.
Leif Gruenwoldt

10
Liệu nó thực sự xác nhận ai là tác giả của một cam kết? Ý tôi là, nhiều như -S (--gpg-sign), bởi vì tôi không nghĩ vậy. Tôi nghĩ rằng bất kỳ ai cũng có thể thêm một dòng "Đã ký tắt" với bất kỳ tên và e-mail nào, trong khi chữ ký GPG đáng tin cậy hơn nhiều, nhưng có lẽ tôi đã nhầm.
hdl

1
Đăng nhập tắt là một dòng ở cuối thông báo cam kết xác nhận ai là tác giả của cam kết. Mục đích chính của nó là cải thiện việc theo dõi ai đã làm gì, đặc biệt là với các bản vá. - Điều đó gần như chắc chắn sai (cụ thể là câu đầu tiên). Để làm ví dụ ngược lại, hãy xem ví dụ b2c150d3aa (được liên kết với câu trả lời của VonC) , có hai tiêu đề được ký tắt; một bởi tác giả , và một bởi người duy trì. Đây là thực tế phổ biến trong các dự án Git và Linux.
Guildenstern

(Tiếp tục từ nhận xét trước.) Để đăng xuất có nghĩa là bạn đã tạo ra cam kết trong một số điều kiện nhất định hoặc bạn đang truyền lại một cái gì đó đã được tác giả bởi một người nào đó (đã đưa ra) hoàn thành điều kiện nói trên. Vì vậy, nó tạo thành một cái gì đó giống như một chuỗi chứng nhận.
Guildenstern

Cập nhật ở trên: hóa ra tôi đã bỏ lỡ điều gì đó trong câu trả lời cuối cùng của mình, và vì vậy tôi đã đánh giá thấp câu trả lời này. Tác giả đã đúng một phần về việc điều chỉnh mã mã hóa, nhưng đặt sự nhấn mạnh sai vào đoạn giới thiệu đăng nhập của YouTube. Tài liệu nói rằng bạn nên thêm một đoạn giới thiệu có dấu ngoặc (như trong ví dụ trong câu trả lời) để thông báo về điều đó. Vì vậy, việc đăng xuất kết hợp với đó có thể được sử dụng để thêm các thay đổi nhỏ của những người như nhà tích hợp / bảo trì. Nhưng việc đăng xuất vẫn phục vụ chủ yếu như những gì tôi đã mô tả.
Guildenstern

30

git 2.7.1 (tháng 2 năm 2016) làm rõ rằng trong cam kết b2c150d (ngày 5 tháng 1 năm 2016) của David A. Wheeler ( david-a-wheeler) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 7aae9ba , ngày 5 tháng 2 năm 2016)

git committrang man bây giờ bao gồm:

-s::
--signoff::

Thêm Signed-off-bydòng bởi committer ở cuối thông điệp nhật ký cam kết.
Ý nghĩa của việc đăng nhập tùy thuộc vào dự án, nhưng thông thường xác nhận rằng người ủy quyền có quyền gửi tác phẩm này theo cùng giấy phép và đồng ý với Chứng nhận xuất xứ của nhà phát triển (xem https: // developercert ve.org để biết thêm thông tin).


Mở rộng tài liệu mô tả --signoff

Sửa đổi các tệp tài liệu (trang man) khác nhau để giải thích chi tiết hơn những gì --signoff ý nghĩa của nó.

Điều này được lấy cảm hứng từ " bài báo lwn 'bottomley: Một đề xuất khiêm tốn về DCO' " (Chứng nhận xuất xứ của nhà phát triển) nơi paulj lưu ý:

Vấn đề tôi có với DCO là có thêm "một -s" lập luận để git commit không thực sự có nghĩa là ngay cả khi bạn đã nghe nói về DCO ( các git committrang người đàn ông làm cho không có đề cập đến bất cứ nơi nào DCO ), không bao giờ phiền thực sự nhìn thấy nó.

Vậy làm thế nào có thể có sự hiện diện của " signed-off-by" theo bất kỳ cách nào có nghĩa là người gửi đồng ý và cam kết với DCO? Kết hợp với thực tế tôi đã thấy trả lời trên các danh sách cho các bản vá mà không có SOB không nói gì hơn là "Gửi lại cái này với signed-off-byđể tôi có thể cam kết".

Mở rộng tài liệu của git sẽ giúp dễ dàng tranh luận rằng các nhà phát triển đã hiểu --signoffkhi họ sử dụng nó.


Lưu ý rằng hiện tại đăng nhập này (đối với Git 2.15.x / 2.16, Q1 2018) cũng có sẵn git pull.

Xem cam kết 3a4d2c7 (12 tháng 10 năm 2017) của W. Trevor King ( wking) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết fb4cd88 , ngày 06 tháng 11 năm 2017)

pull: chuyển --signoff/--no-signoffđến "git merge "

hợp nhất có thể mất --signoff, nhưng không kéo --signoffxuống, nó là bất tiện để sử dụng; cho phép ' pull' nhận tùy chọn và chuyển qua.


2
Ngay cả với tài liệu cam kết git (cuối cùng) tham chiếu tài liệu, cờ -s đang có ý định chỉ ra kiến ​​thức và thỏa thuận / xác nhận / ??? tôi tin rằng SOB rất yếu về mặt pháp lý. SOB, tôi nghĩ rằng ít nhất, được Linus phát minh ra để giải quyết một vấn đề xã hội trong đó những người khác đang ủng hộ cho bộ máy quan liêu trên cao. Linus không muốn bất cứ điều gì, nhưng đã nghĩ ra điều đó để khiến họ im lặng. Theo như tôi có thể nói, luật sư sẽ không khuyên bạn đầu tư nhiều, nếu có, hãy tin vào nó. (Tôi là 'paulj' trên LWN).
paulj

3
VonC, bạn là một người quản lý Git thực sự. Bạn luôn có các câu trả lời được tham khảo chéo có cấu trúc tốt, nhiều thông tin và độc đáo cho các câu hỏi như thế này - truy tìm lịch sử phát triển Git đến các công cụ và tài liệu hướng tới người dùng cuối cùng. Vì vậy, cảm ơn bạn vì điều đó.
Guildenstern

3
@Guildenstern Cảm ơn bạn đã nhận xét tốt đẹp này.
VonC

17

Có một số câu trả lời hay cho câu hỏi này. Tôi sẽ cố gắng thêm một câu trả lời rộng hơn, cụ thể là về những loại dòng / tiêu đề / đoạn giới thiệu này trong thực tế hiện nay. Nói riêng về tiêu đề đăng xuất không quá nhiều (không phải là tiêu đề duy nhất).

Các tiêu đề hoặc đoạn giới thiệu (↑ 1) như Đăng nhập tắt ((2)), trong thực tế hiện tại trong các dự án như Git và Linux, được cấu trúc siêu dữ liệu một cách hiệu quả cho cam kết. Tất cả đều được thêm vào phần cuối của thông điệp cam kết, sau phần miễn phí hình thức (không cấu trúc) của cơ thể của tin nhắn. Đây là các cặp giá trị mã thông báo (hoặc giá trị khóa ) thường được phân tách bằng dấu hai chấm và dấu cách ( :␣).

Giống như tôi đã đề cập, Đăng nhập vào ra không phải là trailer duy nhất trong thực tế hiện nay. Xem ví dụ về cam kết này , có liên quan đến với Dir Dir Cow 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>

Ngoài đoạn giới thiệu đăng nhập trên đường cao tốc ở trên, còn có:

  • Ccvv (đã được thông báo về bản vá)
  • Cấm Acked-by Cảnh (được thừa nhận bởi chủ sở hữu của mã, có vẻ tốt với tôi)
  • Được đánh giá bởi -vv (đánh giá)
  • Báo cáo và kiểm tra bởi báo cáo của tôi (đã báo cáo và kiểm tra vấn đề (tôi giả sử)

Các dự án khác, như Gerrit, có tiêu đề riêng và ý nghĩa liên quan đến chúng.

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

Đạo đức của câu chuyện

Tôi ấn tượng rằng, mặc dù động lực ban đầu cho siêu dữ liệu cụ thể này là một số vấn đề pháp lý (đánh giá bằng các câu trả lời khác), thực tế của siêu dữ liệu đó đã tiến triển vượt ra ngoài việc xử lý trường hợp hình thành chuỗi tác giả.

[↑ 1]: man git-interpret-trailers
[2]: Đôi khi chúng còn được gọi là Sob sob (tên viết tắt).


2
Trường hợp sử dụng thú vị. +1
VonC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.