跳至主要内容

对存储库进行身份验证时进行故障排除

了解如何在 Codespace 中克隆、推送到或从存储库中提取时对常见身份验证问题进行故障排除。

当你为存储库创建 Codespace 时,通常可以使用 git pullgit push 来提取和推送对该存储库的更改,而无需任何其他身份验证。但是,有时在尝试运行这些操作时,你可能会看到身份验证错误。

如果你尝试与用于创建 Codespace 的存储库之外的其他存储库进行交互,也可能会收到错误。

对用于创建 Codespace 的存储库进行身份验证

如果你尝试推送到或从用于创建 Codespace 的存储库中提取,但身份验证失败,你可能会看到类似 [email protected]: Permission denied (publickey)Host key verification failed 的错误。

如果您使用 GitHub Codespaces 的 dotfiles 存储库,并且您已将 Git 配置为使用除 HTTPS 之外的其他协议向远程存储库传输数据,则可能会看到这些错误。例如,您可能已将 Git 配置为使用 SSH,方法是在 dotfiles 中的配置文件中包含如下行。

[url "[email protected]:"]
  insteadOf = https://github.com/

GitHub Codespaces 默认使用 HTTPS 协议,并使用从您创建 Codespace 的存储库配置了读写权限的 `GITHUB_TOKEN` 进行身份验证。我们建议您在 Codespace 中使用默认 HTTPS 和 `GITHUB_TOKEN`。`GITHUB_TOKEN` 的权限通常仅限于一个存储库,遵循最小权限的安全原则。SSH 身份验证没有细粒度的存储库权限,因此意外泄露您的 SSH 密钥可能会让其他人访问您的所有存储库。

要使用默认 HTTPS,请从 dotfiles 中删除冲突配置。如果您的 dotfiles 存储库包含已识别文件(如 `install.sh`)中的安装脚本,则可以使用以下逻辑在 Codespaces 中排除配置。

if [ -z "$CODESPACES" ]; then
  git config --global url."[email protected]".insteadOf "https://github.com"
fi

如果您在从您信任的存储库创建的 Codespace 中工作,并且需要使用 SSH,请确保您的 Codespace 设置为使用链接到您的 GitHub 帐户的 SSH 密钥进行身份验证。有关更多信息,请参阅“生成新的 SSH 密钥并将其添加到 ssh-agent”。

对您未从中创建 Codespace 的存储库进行身份验证

Codespace 中的 `GITHUB_TOKEN` 配置了从您创建 Codespace 的存储库读写权限。默认情况下,该令牌无权访问其他存储库。您可能会发现无法克隆存储库,或者无法将已克隆的存储库推送到存储库。

我们不建议手动更新 Codespace 中 `GITHUB_TOKEN` 的值。如果您的项目需要访问其他存储库,您可以通过在开发容器配置中列出其他权限,让 Codespaces 访问这些存储库。这将允许用户在创建 Codespace 时授权其他权限。但是,它不会更改现有 Codespace 的权限。有关更多信息,请参阅“管理 Codespace 中对其他存储库的访问”。

如果您需要访问现有代码空间中的另一个存储库,或者您需要的权限是针对您个人且不适用于其他贡献者,您可以创建一个具有访问存储库权限的个人访问令牌,并将该令牌添加到您的代码空间。我们建议您通过使用细粒度的个人访问令牌来限制令牌的访问权限,仅选择您需要访问的存储库,并仅向内容权限授予所需的访问权限。有关更多信息,请参阅“管理您的个人访问令牌”。

然后,您可以将令牌作为环境变量添加到代码空间中,或作为 GitHub Codespaces 的机密。如果您创建机密,则应仅允许某些受信任的存储库访问该机密。添加新机密时,系统会提示您重新加载现有的代码空间以提取新机密。有关更多信息,请参阅“管理 GitHub Codespaces 的特定于帐户的机密”。

要在代码空间中使用令牌进行身份验证,您有以下选项。

  • 创建环境变量或机密时,可以使用名称GH_TOKENGH_TOKEN变量在 GitHub CLI 操作中默认使用,因此您可以使用命令gh repo clone OWNER/REPO克隆存储库。

    但是,如果您随后尝试使用git push将内容推送到存储库,则 Git 的凭据帮助程序将尝试使用现有的GITHUB_TOKEN进行身份验证,并且身份验证将失败。您可以覆盖帮助程序,但这可能会在您尝试与创建代码空间的原始存储库进行交互时产生摩擦。

  • 您可以使用包含访问令牌的 URL 克隆存储库。将YOUR-VARIABLE替换为您创建的环境变量或机密的名称。

    git clone https://USERNAME:[email protected]/OWNER/REPO`
    

    这将存储特定存储库的访问令牌,因此您将能够在不覆盖现有凭据帮助程序的情况下将内容推送到存储库并从存储库中提取内容。

    注意:如果您以这种方式克隆,则令牌将在您的 Git 配置中可见。您应该仅在从您信任的存储库创建的代码空间中工作时使用此方法,并且应尽可能限制访问令牌的范围。