# 管理对代码空间中其他存储库的访问权限

你可以管理 GitHub Codespaces 可以访问的存储库。

## 概述

默认情况下，codespace 分配有一个令牌，该令牌的范围限定为从中创建它的存储库，具有对该存储库的 `read` 权限或 `read` 和 `write` 权限。 此令牌的范围在以下情况下会自动更改。

* 如果为只有读取访问权限的存储库创建 codespace，然后在 codespace 中进行提交或推送到新分支，GitHub Codespaces 会自动将 codespace 链接到存储库的新分支或现有分支，并将令牌更新为具有对分支的 `read` 和 `write` 权限。 有关详细信息，请参阅“[在代码空间中使用源控制](/zh/codespaces/developing-in-a-codespace/using-source-control-in-your-codespace#about-automatic-forking)”。
* 如果您从模板创建了一个代码空间，然后将代码空间发布到新存储库，GitHub Codespaces 会更新令牌，以便它具有对新存储库的 `read` 和 `write` 权限。 有关详细信息，请参阅“[通过模板创建 codespace](/zh/codespaces/developing-in-a-codespace/creating-a-codespace-from-a-template#publishing-to-a-repository-on-github)”。

有关详细信息，请参阅“[GitHub Codespaces 中的安全性](/zh/codespaces/reference/security-in-github-codespaces#authentication)”。

如果项目需要其他仓库的其他权限，则可以在 `devcontainer.json` 文件中对此进行配置，如本文后面的[设置其他仓库权限](#setting-additional-repository-permissions)中所述。 在 `devcontainer.json` 文件中列出权限时，系统会提示你在为该存储库创建代码空间时查看并授予其他权限。 授予列出的权限后，GitHub Codespaces 将记住你的选择，除非 `devcontainer.json` 文件中的权限发生更改，否则不会提示你进行授予。

> \[!NOTE]
> 更新 `devcontainer.json` 文件中的权限不会更改现有 codespace 的权限。 如果需要在现有 codespace 中拥有其他权限，请参阅 [排查存储库身份验证问题](/zh/codespaces/troubleshooting/troubleshooting-authentication-to-a-repository#authenticating-to-repositories-that-you-didnt-create-the-codespace-from)。

## 创建具有自定义权限的代码空间

要创建具有自定义权限的 codespace，你必须使用以下项之一：

* GitHub 网页用户界面
* [GitHub CLI](https://github.com/cli/cli/releases/latest) 2.5.2 或更高版本
* [GitHub Codespaces Visual Studio Code 扩展](https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces) 1.5.3 或更高版本

## 设置其他存储库权限

在 `devcontainer.json` 文件中配置 GitHub Codespaces 的存储库权限。 你所添加或更改的任何自定义权限只应用于将更改提交到存储库以后创建的新 codespace。 如果在某个 codespace 内添加或更改权限，这些权限不会应用到当前 codespace，即使你重新生成该 codespace。

1. 如果存储库尚未包含 `devcontainer.json` 文件，请立即添加一个。 有关详细信息，请参阅“[将开发容器配置添加到存储库](/zh/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration)”。

2. 编辑 `devcontainer.json` 文件，添加 `repositories` 对象所需的存储库名称和权限：

   ```json copy
   {
     "customizations": {
       "codespaces": {
         "repositories": {
           "my_org/my_repo": {
             "permissions": {
               "issues": "write"
             }
           }
         }
       }
     }
   }
   ```

   > \[!NOTE]
   >
   > * 只能将属于同一个人帐户或组织的存储库引用为当前正在使用的存储库。
   > * 可以使用 `*` 通配符向组织中的多个存储库授予权限。 例如，若要向 `my_org` 组织中的所有存储库授予权限，请使用 `my_org/*`。 此语法仅适用于 codespaces。 在任何用于预生成的 `devcontainer.json` 文件中，必须单独为每个存储库定义权限。 有关详细信息，请参阅“[允许预构建访问其他存储库](/zh/codespaces/prebuilding-your-codespaces/allowing-a-prebuild-to-access-other-repositories)”。

   可以为列出的每个存储库授予任意数量的以下权限：

   * `actions` - 读/写
   * `checks` - 读/写
   * `contents` - 读/写
   * `deployments` - 读/写
   * `discussions` - 读/写
   * `issues` - 读/写
   * `packages` - 读取
   * `pages` - 读/写
   * `pull_requests` - 读/写
   * `repository_projects` - 读/写
   * `statuses` - 读/写
   * `workflows` - 写入

   要为组织中的存储库设置权限，必须在 `repositories` 对象中显式添加该存储库名称。

   ```json
   {
     "customizations": {
       "codespaces": {
         "repositories": {
           "my_org/my_repo": {
             "permissions": {
               "issues": "write"
             }
           }
         }
       }
     }
   }
   ```

   若要为给定存储库设置所有权限，请在存储库对象中使用 `"permissions": "read-all"` 或 `"permissions": "write-all"`。

   ```json
   {
     "customizations": {
       "codespaces": {
         "repositories": {
           "my_org/my_repo": {
             "permissions": "write-all"
           }
         }
       }
     }
   }
   ```

## 授予请求的权限

如果在 `devcontainer.json` 文件中定义了其他存储库权限，系统会提示你在为此存储库创建 codespace 或预生成配置时查看并选择性地授予权限。 为存储库授予权限后，除非为存储库请求的权限集已更改，否则 GitHub Codespaces 不会重新提示你。

![“所需权限”页的屏幕截图。 根据请求列出两个权限：元数据的读取权限和问题的写入权限。](/assets/images/help/codespaces/codespaces-accept-permissions.png)

应仅为你了解和信任的存储库授予权限。 如果你不信任请求的权限集，请单击“请继续操作，无需进行授权”以创建具有基本权限集的代码空间。 拒绝其他权限可能会影响代码空间中项目的功能，因为代码空间只能访问从中创建它的存储库。

你只能授予个人帐户已拥有的权限。 如果代码空间请求你当前无权访问的存储库的权限，请联系存储库的所有者或管理员以获取足够的访问权限，然后尝试再次创建代码空间。

## 其他阅读材料

* [设置用户首选项](/zh/codespaces/setting-your-user-preferences)
* [自定义代码空间](/zh/codespaces/customizing-your-codespace)