git - 為什麼要Sign Off?
某草草
某草草 2017-05-02 09:25:58
0
2
1610

為什麼很多開源專案都要求Sign Off? Git裡面已經設定使用者名稱和信箱了,再次署名的意義是什麼?

另外,怎麼進行Sign Off操作?是在提交描述最後加一行就行,還是在Pull Request的時候,還是需要用什麼其他方法?

某草草
某草草

全部回覆(2)
大家讲道理

首先,區分 sign-off 和簽名。 @nightfire 已經解釋了簽名。我來解釋(翻譯)一下 sign-off 的意義。

我並沒有看到「很多開源專案都要求」sign-off。最著名的是 linux 核心。它的文檔裡是這麼說的:

11) Sign your work

To improve tracking of who did what, especially with patches that can
percolate to their final resting place in the kernel through several
layers of maintainers, we've introduced a "sign-oned ecedly as ) .

因為在 Linux 的開發過程中,他們並沒有使用 GitHub 創造的「pull request」,而是透過(分散式的)電子郵件寄送補丁(所以 git 對郵件有著相當好的支援)。補丁寄來寄去的,就需要追蹤了,不然像 BSD 經歷過的那樣扯起皮來影響開發就不好了。 「Signed-off-by」其實是個聲明,你保證寄送的補丁符合「Developer's Certificate of Origin 1.1」裡邊那幾點。

StackOverflow 上有人說了,這只是少數幾個項目的要求,大部分項目都不使用 sign-off。

PS: 你如果看核心提交的話,有時能看到一個 commit 有一長列 sign-off 的。這種情況下僅僅一個 committer 和一個 author 怎麼夠呢?

PHPzhong

簡單的答案是為了讓你證明你就是你!

一般提交的時候會有 author 和 committer 兩個信息,通常都是一個人(私有項目,共用 central repo)。

在沒有 Github 的年代(比如說 Git 最早是用於 Linux Core 的協作開發),現在大家都習以為常的 pull request 並不是這麼簡單就能搞定的。那時候會常常使用patch 的方式分散式開發,比如說你把你的提交(此時產生author 訊息)透過郵件附件的方式發給專案管理/維護者,然後他/她再合併到中心庫(這是產生了committer 資訊)…

然而,不管是 author 還是 committer,本質上它們都無法證明那個「人」就是真實的做了那件事情的人。因為想知道一個開發者的姓名和電子郵件實在太簡單不過了,郵件附件發出去的 patch 能證明作者就是你嗎?接收到郵件並且去做了合併的人能確保就是 committer 那個人嗎? (假設一個專案有多位管理/維護者)

所以,看重這一點的人會使用 GPG 秘鑰來進行安全的簽名,也就是你問的 Sign Off ,其實就是一個電子簽名啦,很多電子郵件客戶端也用這個做數字簽名的。

我盡可能的說的簡單明了,但其實這裡面的細節多得超乎你的想像,有興趣的可以看看這篇文章:A Git Horror Story: Repository Integrity With Signed Commits,而這篇文章也還沒講完與Sign Off 相關的一切。

還有一個關注點是這樣的,很多專案都會有許可證對吧?但是你在專案內或許會用到第三方代碼,很可能這些代碼的許可政策和這個項目的許可證是互斥/衝突的。如果是開源專案(如你所問),對這方面事情就更加重視了(你想別人找你打官司嗎?)。 Git 的 Sign Off 是可以精確到行的,這就是代碼真實來源的一個考證(儘管可靠性有待商榷,但總好過沒有……)。這方面的東西就不扯了,我也就是略有耳聞罷了。

想使用簽名,最簡單需要三步驟(以 Mac 為準):

  1. 你需要 gunpg 的程序,Mac 可以用 homebrew 安裝:

  2. 你需要產生你的 GPG 秘鑰,過程省略了,上面那篇文章裡有,生成好以後是這樣的:

  3. 你需要告訴 Git 你的秘鑰 ID 是啥(因為可以同時擁有多個秘鑰):

    `git config --global user.signingkey KEY_ID`
    这个 ID 就在第二步列表里可以找到
    

    好了,至此以後 git commit 命令里加上 -S (注意大寫),提交的時候就會自動附上你的數字簽名了,你就是你,拒絕仿冒!


根據 @依雲 的提示,--sign-off--gpg-sign 是有區別的,這個是有歷史原因的,感興趣的可以看看她答案裡的評論。以下引用 Google 搜尋的答案:

-s adds a "signed off by" field to the commit. -S actually GPG signs the commit, which was added in git 1.7.9. Also, this does not sign all commits, but only oseby user directly using the git c command. In a rebase, when new commits are created, this will not sign off on (or PGP sign) the commits, unless you do an interactive rebase and manually commit everychange commit everychange

是使用 GPG 秘鑰來署名。

-S 可以两个一起做了,这是前面答案里推荐使用此选项的原因。所以 --sign-off 只是署名,而 --gpg-sign

OK,又錯了…
不能兩個一起做了,如果既要署名又要簽名,就得兩個一起用。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!