簡體   English   中英

有沒有辦法使用 GPG 密鑰在 Git 中“自動簽名”提交?

[英]Is there a way to "autosign" commits in Git with a GPG key?

有沒有一種簡單的方法可以讓 Git 始終對創建的每個提交或標簽進行簽名?

我嘗試了類似的東西:

alias commit = commit -S

但這並沒有奏效。

我不想安裝不同的程序來實現這一點。 它可以輕松實現嗎?

只是一個附帶問題,也許不應該對提交進行簽名,只應該對我從未創建的標簽進行簽名,因為我為 Homebrew 等項目提交了單個提交。

注意:如果您不想一直添加-S以確保您的提交已簽名,那么就會有一個提案(分支' pu '現在,2013年12月,所以不能保證它會進入git版本)添加一個配置,將為您處理該選項。
2014年5月更新:它在Git 2.0中( 在此補丁系列中重新發送之后)

請參閱Nicolas Vigier的 提交2af2ef3 (boklm)

添加commit.gpgsign選項以對所有提交進行簽名

如果要對所有提交進行GPG簽名,則必須始終添加-S選項。
commit.gpgsign配置選項允許自動簽署所有提交。

commit.gpgsign

一個布爾值,用於指定是否所有提交都應進行GPG簽名。
在執行諸如rebase之類的操作時使用此選項可能會導致大量提交被簽名。 使用代理可能很方便避免多次輸入GPG密碼。


該配置通常按每個倉庫設置(您不需要簽署您的私人實驗本地回購):

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true

您可以將其與用作全局設置的user.signingKey結合使用(用於您要簽名提交的所有user.signingKey唯一鍵)

git config --global user.signingkey F2C7AB29

user.signingKey是在git 1。5。0(2007年1月)中使用commit d67778e引入的

不應該要求我在我的git存儲庫和gpg密鑰中使用相同形式的名稱。
此外,我的密鑰環中可能有多個密鑰,並且可能希望使用與我在提交消息中使用的地址不匹配的密鑰。

此補丁添加了一個配置條目“ user.signingKey ”,如果存在,它將被傳遞給gpg的“-u”開關,允許覆蓋標記簽名密鑰。

這是通過commit aba9119 (git 1.5.3.2 )強制執行的,以便捕獲如果用戶在.git/config配置錯誤的user.signingKey或者他們的密鑰環上沒有任何密鑰的情況。

筆記:

git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

用您的密鑰ID替換9E08524833CB3038FDE385C54C0AFCCFED5CDE14。 請記住: 使用短ID絕不是一個好主意

更新:根據新的git edict ,所有配置密鑰都應該在camelCase中。

編輯:作為Git版本1.7.9, 可能簽署Git修訂( git commit -S )。 稍微更新答案以反映這一點。

問題標題是:

有沒有辦法用GG密鑰在Git中“自動簽名”提交?

簡答:是的,但不要這樣做。

解決問題中的拼寫錯誤: git commit -s不簽署提交。 相反,從man git-commit頁面:

-s, - 簽到
在提交日志消息的末尾由提交者添加逐行簽名。

這給出了類似於以下內容的日志輸出:


± $ git log                                                                                 [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name 
Date:   Mon Apr 16 00:43:27 2012 +0200

    Added .gitignore

    Signed-off-by: User Name 

注意“Signed-off-by:...”位; 這是由git-commit上的-s標志生成的。

引用發布公告電子郵件

  • “git commit”學會了“-S”到GPG簽署提交; 這可以通過“git log”的“--show-signature”選項顯示。

所以是的,你可以簽署提交。 但是,我個人敦促謹慎使用這個選項; 自動簽名提交旁邊沒有意義,見下文:

只是一個側面的問題,也許提交不應該簽名,只有標簽,我從來沒有創建,因為我提交單一提交。

那是對的。 提交沒有簽署; 標簽是。 其原因可以在Linus Torvalds的這條消息中找到,其中最后一段說:

簽署每個提交都是完全愚蠢的。 它只是意味着您自動化它,並使您的簽名價值更低。 它也沒有添加任何實際值,因為SHA1的git DAG鏈的工作方式,你只需要一個簽名來使那個可以從那個提交的所有提交有效地覆蓋。 所以簽署每個提交只是錯過了重點。

我鼓勵瀏覽鏈接的消息,這清楚地說明了為什么簽名提交自動不是一個好主意,而且方式要好得多。

但是 ,如果要自動簽署標記 ,則可以通過將git-tag -[s|u]包裝在別名中來實現; 如果你打算這樣做,你可能想在~/.gitconfig或項目特定的.git/config文件中設置你的密鑰ID。 有關該過程的更多信息可以在git社區書中看到。 簽名標簽比簽署每個提交更有用。

要在git 2.0版之前進行自動簽名工作,您必須為commit添加git別名。

# git config --global alias.commit commit -S
[alias]
    commit = commit -S

您需要明確指出,如果您簽署提交或標記,那么您並不意味着您批准了整個歷史記錄。 在提交的情況下,您只需簽署手頭的更改,如果是標記,那么......您需要定義它的含義。 您可能已經撤消了聲稱它來自您的更改但是沒有(因為其他人將其推送到您的遙控器)。 或者這是一個你不想進入的變化,但你剛剛簽署了標簽。

在典型的OSS項目中,這可能不太常見,但在企業場景中,您只是偶爾觸摸代碼並且您不會讀取整個歷史記錄,它可能會被忽視。

簽署提交是一個問題,如果他們將得到重新安排或挑選給其他父母。 但是,如果修改后的提交可以指向實際驗證的“原始”提交,那將是很好的。

首先設置要用於簽署所有提交、標簽和推送的公鑰。 要獲取公鑰,請使用以下命令

% gpg --list-keys --keyid-format=short
/home/blueray/.gnupg/pubring.kbx
-------------------------------
pub   rsa3072/F6EED39A 2021-12-25 [SC] [expires: 2023-12-25]

在這種情況下,公鑰是F6EED39A 現在運行以下命令。

git config --global user.signingkey F6EED39A
git config --global commit.gpgSign true // sign all commits
git config --global tag.gpgSign true // sign all tags
git config --global push.gpgSign true // sign all push

現在您所有的提交、標簽和推送都將由您給定的公鑰自動簽名。

有時您可能需要覆蓋這些設置

對於提交,使用git commit --no-gpg-sign -m "Unsigned commit"

對於標簽,使用git tag --no-sign <tag-name>

對於推送,請使用git push --no-signed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM