[英]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
或者他們的密鑰環上沒有任何密鑰的情況。
筆記:
signingKey
,而不是signingkey
,即使git config
密鑰不區分大小寫。 只有當你執行git config --get-regexp
時這才git config --get-regexp
,這是區分大小寫的,否則,它只是一個可讀性約定; git push --signed
無法考慮user.signingKey
配置值; user.signingKey
強制簽署帶注釋的標簽以及提交: commit 61c2fe0 。 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.