5

gotOK 当谈到 Git 时,我还是个新手。所以我决定阅读 Scott Chacon 的 Pro Git。BTW 好书,强烈推荐。

无论如何到了关于签名标签的部分。要使用 GPG 签署标签,您必须设置一个私钥,就像我做的那样。但是,当我运行时:

git tag -s v1.6 -m "my signed 1.6 tag"

我得到以下信息:

C:\Users\Name\Desktop\git>git tag -s v1.6 -m "my signed 1.6 tag"
gpg: error loading `iconv.dll': The specified module could not be found.

gpg: please see http://www.gnupg.org/download/iconv.html for more information
gpg: skipped "Name <name@gmail.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag

所以,我按照错误消息告诉我的去做,然后转到链接并按照说明进行操作。我将 iconv.dll 复制到包含 gpg.exe (\Git\bin) 的文件夹中。再次运行命令并得到:

C:\Users\Name\Desktop\git>git tag -s v1.6 -m "my signed 1.6 tag"
gpg: skipped "Name <name@gmail.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
error: unable to sign the tag

编辑:

当我尝试列出我的密钥时,我得到了这个错误???

Name@NAME-PC ~
$ gpg --list-secret-keys
gpg: keyblock resource `c:/Users/Name/.gnupg\secring.gpg': file open error
gpg: keyblock resource `c:/Users/Name/.gnupg\pubring.gpg': file open error
gpg: fatal: c:/Users/Name/.gnupg: directory does not exist!
secmem usage: 0/0 bytes in 0/0 blocks of pool 0/32768
4

1 回答 1

9

您可以按照本教程或(更新的)官方 gpg4win 文档“ Gpg4win for Novices ”使用 gpg GUI(如gpg4win)初始化您的 gnupg 环境(密钥)。

私钥创建

请注意,此博客文章添加了以下警告:

我安装了 Gpg4win,它安装了一个很好的 GUI 来管理密钥和 GPG 命令行界面。
当我反复尝试使用 GUI(GNU 隐私助手 - 密钥管理器)来创建我的密钥时,我对这个过程的无知是显而易见的。该 GUI 似乎创建了有效的密钥,但它存储相关密钥部分文件的地方并不是 GPG 命令行期望找到它们的地方

(注意:可能在C:\Users\Name\AppData\Roaming\gnupg,目录被命名gnupg而不是.gnupg

相反,请务必使用命令行客户端。从...开始:

gpg --gen-key

如果密钥创建失败,您可能需要手动创建目录c:users<USER>.gnupg,而 GPG 显然不会自行创建

cd C:\Users\Name 
mkdir .gnupg
xcopy C:\Users\Name\AppData\Roaming\gnupg .gnupg

我一路上看到的错误是

gpg: no writable public keyring found

和:

signing failed: secret key not available

注意:一旦您的 gnupg 就位,如果您仍然有错误消息,请添加您要在签署标签时使用的 (gnupg)key-id

git tag -u 'key-id' -s -m "some comment" some-tag 

正如roguib评论中指出的那样,如果您想在远程端看到该标签,您将需要:

  • git push --tags
  • 或者,从 Git 2.4.1 开始git config --global push.followTags true,一个简单git push的就足够了。
  • 并且,仍然使用 Git 2.4.x,您可以添加git push --atomic, 以确保确实推送了所有内容(或者什么都不会推送)。
于 2013-06-01T21:16:12.133 回答