跳至主要内容

GitHub 代码空间的 GPG 验证故障排除

本文提供有关在代码空间中签署提交时发生的错误的相关故障排除建议。

如果启用 GPG 验证,GitHub 代码空间会自动签署您从选定存储库创建的代码空间中的提交。有关更多信息,请参阅“管理 GitHub 代码空间的 GPG 验证”。

启用 GPG 验证后,它将在您从相关存储库创建的任何新代码空间中自动生效。要使 GPG 验证在现有的活动代码空间中生效,您需要停止并重新启动代码空间。有关更多信息,请参阅“停止和启动代码空间”。

如果 GitHub Codespaces 无法签署提交,您可能会在命令行或 Visual Studio Code 弹出窗口中看到错误消息 gpg failed to sign the data

本文的以下部分提供了针对此错误常见原因的故障排除建议。

  • 如果之前已在 GitHub Codespaces 设置中启用了 GPG 验证,并且您最近禁用了 GPG 验证或从受信任存储库列表中删除了存储库,Git 仍可能尝试签署您的提交。有关更多信息,请参阅“禁用 GPG 验证后的错误”。
  • 如果为 codespace 启用了 GPG 验证,您可能已覆盖签署提交所需的 Git 配置。有关更多信息,请参阅“由冲突的 Git 配置引起的错误”。
  • 如果为 codespace 禁用了 GPG 验证,并且您在尝试从 VS Code 的“源代码管理”视图中提交时遇到此错误,这可能是由于您的 VS Code 设置造成的。有关更多信息,请参阅“VS Code“源代码管理”视图中的错误”。

禁用 GPG 验证后的错误

启用 GPG 验证后,GitHub Codespaces 默认情况下会签署您在 codespace 中进行的所有提交。它通过将 commit.gpgsign Git 配置值设置为 true 来实现这一点。

如果您已禁用 GPG 验证,并且正在现有 codespace 中工作,那么此值仍将设置为 true。这意味着 GitHub Codespaces 将尝试签署您的提交,但将无法做到,因为您已禁用 GPG 验证设置。

要继续在 codespace 中进行常规的未签名提交,请在终端中输入以下命令,将 commit.gpgsign 重置为默认值 false

Shell
git config --unset commit.gpgsign

要检查该值是否已从您的配置中正确删除,您可以输入 git config --list。您应该在列表中看不到 commit.gpgsign 的值。

由冲突的 Git 配置引起的错误

为了自动签署您的提交,GitHub Codespaces 会在您的 codespace 中设置某些 Git 配置值。如果您覆盖了 GitHub Codespaces 设置的值,您可能无法签署您的提交。

如果您将 GitHub Codespaces 与包含 Git 配置文件的 dotfiles 存储库链接,则可能会无意中覆盖这些值。有关在 GitHub Codespaces 中使用 dotfiles 的更多信息,请参阅“为您的帐户个性化 GitHub Codespaces”。

检查冲突配置

为了使用 GPG 签署您的提交,GitHub Codespaces 会在系统级别自动设置以下 Git 配置值。

配置设置所需值
user.name必须与您 GitHub 个人资料中设置的完整姓名匹配
credential.helper必须设置为 /.codespaces/bin/gitcredential_github.sh
gpg.program必须设置为 /.codespaces/bin/gh-gpgsign

要检查这些值是否在 codespace 中正确设置,可以使用 git config --list --show-origin 命令。由于 GitHub Codespaces 在系统级别设置此配置,因此所需的配置设置应来自 /usr/local/etc/gitconfig

$ git config --list --show-origin
file:/usr/local/etc/gitconfig   credential.helper=/.codespaces/bin/gitcredential_github.sh
file:/usr/local/etc/gitconfig   user.name=Mona Lisa
file:/usr/local/etc/gitconfig   gpg.program=/.codespaces/bin/gh-gpgsign

除了上面列出的值之外,如果您的 codespace 中使用的 dotfiles 包含以下任何值,您可能会遇到错误。

  • user.signingkey Git 配置值
  • commit.gpgsign Git 配置值
  • 手动设置的 GITHUB_TOKEN

删除冲突配置

如果您想保持为 GitHub Codespaces 启用自动 GPG 验证,则需要从您的 codespace 中使用的 dotfiles 中删除任何冲突配置。

例如,如果您的本地机器上的全局 .gitconfig 文件包含 gpg.program 值,并且您已将此文件推送到与 GitHub Codespaces 链接的 dotfiles 存储库,那么您可能希望从该文件中删除 gpg.program,并在您的本地机器上将其设置为系统级别。

注意:对 dotfiles 存储库的任何更改都将应用于您创建的新 codespace,但不适用于您现有的 codespace。

  1. 在您的本地机器上,打开一个终端。

  2. 要从 ~/.gitconfig(Mac/Linux)或 C:\Users\YOUR-USER\.gitconfig(Windows)中删除冲突的值,请使用 git config --global --unset 命令。

    git config --global --unset gpg.program
    
  3. 将更改推送到您在 GitHub 上的 dotfiles 仓库。

  4. 可选地,为了保留您的本地配置,请在您不会推送到 dotfiles 仓库的 Git 配置文件中再次设置该值。

    例如,您可以使用 --system 标志在系统级文件 PATH/etc/gitconfig 中设置配置,其中 PATH 是 Git 在您的系统上安装的目录。

    git config --system gpg.program gpg2
    

或者,如果您的 dotfiles 仓库包含一个在识别文件(例如 install.sh)中的安装脚本,您可以使用 $CODESPACES 环境变量添加条件逻辑,例如,仅在您不在 codespace 中时设置 gpg.program。在以下示例中,-z "$CODESPACES" 在您不在 codespace 中时返回 true

Shell
if [ -z "$CODESPACES" ]; then
  git config --global gpg.program gpg2
fi

VS Code "源代码管理" 视图中的错误

如果在您的 GitHub Codespaces 设置中禁用了 GPG 验证,或者您创建 codespace 的仓库不在您的受信任仓库列表中,那么 Git 就不应该尝试签署您的提交。如果您在尝试从 VS Code 的 "源代码管理" 视图中提交时遇到签名错误,您应该检查 codespace 中的 VS Code 设置。

  1. 在窗口的左下角,选择 ****,然后点击 **设置**。

    Screenshot of a section of the VS Code web client. A gear icon and the "Settings" option in a menu are both highlighted with an orange outline.

  2. 在“用户”选项卡上,在搜索栏中搜索“gpg”。

  3. 确认“启用使用 GPG 或 X.509 进行提交签名”设置已取消选择。

    Screenshot of the "User" settings tab. A deselected checkbox, labeled "Enables commit signing with GPG or X.509," is highlighted with an orange outline.

如果您发现此设置已启用,您应该取消选中复选框以停止 VS Code 尝试对您的提交进行签名,或者您应该为正在使用的存储库启用 GPG 验证,以便您的提交能够成功签名。

如果您更改了 VS Code 设置,则必须确保启用了设置同步,才能将更改与您创建的其他代码空间共享。您应该只在从您信任的存储库创建的代码空间中启用设置同步。有关更多信息,请参阅“个性化您的 GitHub 代码空间”。

进一步阅读