GitHub Codespaces 是一种即时的基于云的开发环境,使用容器为您提供常用的语言、工具和实用程序进行开发。GitHub Codespaces 也是可配置的,允许您为项目创建自定义的开发环境。通过为项目配置自定义开发环境,您可以为项目的所有用户提供可重复的代码空间配置。
创建代码空间
有多种入口点可用于创建代码空间。
- 从 GitHub 模板或任何 GitHub 上的模板仓库开始一个新项目
- 从您仓库中的分支进行新功能开发
- 从打开的拉取请求中探索进行中的工作
- 从仓库历史中的一次提交,以在特定时间点调查错误
您可以在 GitHub、Visual Studio Code 或使用 GitHub CLI 创建代码空间。
如果您只需测试某些内容,代码空间可以是临时的;或者您可以返回同一代码空间进行长期的功能开发。
欲了解更多信息,请参阅 为仓库创建代码空间、从模板创建代码空间,以及 打开现有代码空间。
注意
您可以为每个仓库甚至每个分支创建多个代码空间。不过,您可以创建的代码空间数量以及同时运行的代码空间数量都有上限。如果您已达到代码空间的最大数量并尝试再创建一个,系统会显示提示信息,要求您先删除已有的代码空间才能创建新的。
代码空间创建过程
创建代码空间时,会在后台执行多个步骤,直至代码空间可供您使用。
步骤 1:为您的代码空间分配 VM 和存储
创建代码空间时,会使用稳定版或公开预览版的 VM 主机镜像来创建虚拟机(VM)。更多信息请参阅 选择稳定版或 Beta 主机镜像。主机镜像定义了 VM 所使用的 Linux 版本。该 VM 完全专属且私有给您。拥有专用 VM 可确保您获得该机器的全部计算资源。如有需要,这也允许您对容器拥有完整的 root 访问权限。
随后会对您的仓库(或若是从模板创建,则对模板仓库)执行浅克隆。这会克隆到 VM 的 /workspaces 目录,并随后挂载到开发容器中。更多信息请参见下文的 关于代码空间的目录结构。
步骤 2:创建开发容器
GitHub Codespaces 使用 Docker 容器作为开发环境。该容器基于您在 devcontainer.json 文件中定义的配置以及(可选的)Dockerfile 创建。如果您使用 GitHub 的空白模板或来自没有 devcontainer.json 文件的仓库创建代码空间,GitHub Codespaces 将使用默认镜像,该镜像已预装多种语言和运行时。更多信息请参阅 Dev 容器简介。有关默认开发容器镜像的详细内容,请查看 devcontainers/images 仓库。
注意
如果您希望在代码空间中使用 Git 钩子并将 git 模板目录 中的内容应用到代码空间,则必须在容器创建后、步骤 4 中设置钩子。
由于您的仓库在容器创建之前已经克隆到主机 VM 上,git 模板目录中的内容在代码空间中不会自动生效,除非您在 devcontainer.json 配置文件中使用 postCreateCommand 于步骤 4 中设置钩子。更多信息请参见 步骤 4:创建后设置。
步骤 3:连接到代码空间
当容器创建完成且其他初始化已完成后,您将连接到代码空间。您可以通过以下方式连接:
- 您的网络浏览器
- Visual Studio Code
- GitHub CLI
步骤 4:创建后设置
连接到代码空间后,系统可能会继续根据您在 devcontainer.json 文件中指定的配置进行自动化设置。您可能会看到 postCreateCommand 和 postAttachCommand 被执行。
如果您想在代码空间中使用 Git 钩子,请通过 devcontainer.json 生命周期脚本(如 postCreateCommand)设置钩子。有关生命周期脚本的详细信息,请参阅 开发容器规范(Development Containers 网站)。
如果您有公开的 GitHub Codespaces dotfiles 仓库,可为新代码空间启用它。启用后,dotfiles 将被克隆到容器中,并调用安装脚本。更多信息请参阅 为您的账户个性化 GitHub Codespaces。
最后,如果您是从仓库创建代码空间,则会完整克隆仓库的全部历史。如果您是从模板创建代码空间,则不会保留模板仓库的完整历史;相反,除非使用空白模板,否则您将从模板仓库的内容开始,带有一个初始提交。
在创建后设置期间,您仍然可以使用集成终端并编辑文件,但请注意避免您的工作与正在运行的命令之间出现竞争条件。
Codespaces 生命周期
在代码空间中保存文件
根据您使用的编辑器,以常规方式保存文件更改。
如果您在 Visual Studio Code 中使用代码空间,可以启用 自动保存,以确保始终保存您的更改。
关闭或停止代码空间
只要您在使用代码空间,它会保持运行,但在一段时间不活动后会超时退出。编辑器的文件更改和终端输出都会计为活动,所以如果终端仍在输出,代码空间不会超时。默认的不活动超时时间为 30 分钟。您可以为自己创建的代码空间设定个人超时设置,但组织的超时策略可能会覆盖此设置。更多信息请参见 设置 GitHub Codespaces 的超时期限。
如果代码空间超时,它将停止运行,但您可以从浏览器标签页(若在浏览器中使用代码空间)、VS Code 内部或在 https://github.com/codespaces 的代码空间列表中重新启动它。
要停止代码空间,您可以
- 在浏览器中:在 https://github.com/codespaces 的代码空间列表中,点击想要停止的代码空间右侧的省略号(...),然后点击 停止代码空间。
- 在 VS Code 中:打开 Visual Studio Code 命令面板——例如,通过按下 Ctrl+Shift+P(Windows/Linux)或 Shift+Command+P(Mac)——输入
Codespaces: stop,然后按 Enter。更多信息请参见 在 GitHub Codespaces 中使用 Visual Studio Code 命令面板。 - 在终端窗口中:使用 GitHub CLI 命令
gh codespace stop。更多信息请参见 使用 GitHub CLI 的 GitHub Codespaces。
如果您在未运行停止命令的情况下退出代码空间(例如关闭浏览器标签页),或在未进行交互的情况下让代码空间保持运行状态,则代码空间及其运行的进程会持续直到不活动超时期限结束。
当您关闭或停止代码空间时,所有未提交的更改会被保留,直至您再次连接到该代码空间。
运行您的应用程序
端口转发让您能够访问代码空间内部运行的 TCP 端口。例如,如果您在代码空间内的 4000 端口运行一个 Web 应用程序,系统会自动转发该端口,使其可从浏览器访问。
端口转发决定了哪些端口对您(从远程机器)可访问。即使您未转发某个端口,该端口仍可被代码空间内部的其他进程访问。

当 GitHub Codespaces 中的应用程序在控制台输出端口时,系统会检测到 localhost URL 模式并自动转发该端口。您可以点击终端中的 URL,或点击 VS Code 右下角弹出的 “toast” 通知中的链接,以在浏览器中打开该端口。默认情况下,GitHub Codespaces 使用 HTTP 来转发端口。有关端口转发的更多信息,请参阅 在代码空间中转发端口。
虽然端口可以自动转发,但默认情况下它们不对互联网公开。所有端口默认是私有的,您可以手动将端口设为对组织可用或公开,并通过 URL 分享访问。更多信息请参阅 在代码空间中转发端口。
首次进入代码空间运行应用程序可以实现快速的内部开发循环。编辑时,您的更改会自动保存并在转发的端口上实时可见。要查看更改,请返回浏览器中的运行应用程序标签页并刷新页面。
提交并推送更改
Git 默认已在代码空间中安装,您可以继续使用已有的 Git 工作流。您可以在终端中使用 Git,或通过 VS Code 的源代码管理功能使用 Git。
如果您使用已有的仓库,可以从仓库的任意分支、提交或拉取请求创建代码空间,或在已激活的代码空间内切换到新分支或已有分支。由于 GitHub Codespaces 设计为临时的,您可以将其用作隔离环境,以进行实验、检查团队成员的拉取请求或解决合并冲突。
如果您仅拥有对仓库的只读访问权限,只要能够 fork(派生)该仓库,仍可为其创建代码空间。当您在代码空间中提交或推送新分支时,GitHub Codespaces 会自动为您创建该仓库的 fork,或在您已有上游仓库的 fork 时将代码空间关联到该 fork。
如果您在从模板创建的代码空间中工作,Git 默认已安装,但您需要将代码空间发布到远程仓库才能持久化工作并与他人共享。如果您使用 GitHub 的空白模板,首先需要将工作区初始化为 Git 仓库(例如运行 git init),才能在代码空间中使用源代码管理。
欲了解更多信息,请参阅 在代码空间中使用源代码管理。
注意
您在代码空间的提交将归属为在 https://github.com/settings/profile 中配置的姓名和公开电子邮件。系统会使用作为仓库作用域的 GITHUB_TOKEN 令牌以及您的 GitHub 凭证进行身份验证。
使用扩展个性化代码空间
您可以在代码空间内添加扩展,以个性化在 VS Code 中的使用体验。
VS Code 扩展
如果您在 VS Code 桌面应用或 Web 客户端中使用代码空间,可从 Visual Studio Code 市场 (Marketplace) 添加所需的任意扩展。有关扩展在 GitHub Codespaces 中的运行方式,请参阅 VS Code 文档中的 支持远程开发与 GitHub Codespaces。
如果您已经使用 VS Code,可以通过 设置同步 在本地实例与您创建的任何代码空间之间自动同步扩展、设置、主题和键盘快捷键。
关于代码空间的目录结构
创建代码空间时,您的仓库会被克隆到代码空间中的 /workspaces 目录。该目录是持久化的,并挂载到容器中。您在此目录内所做的任何更改,包括编辑、添加或删除文件,在停止并重新启动代码空间以及在代码空间中重建容器时都会被保留。
在 /workspaces 目录之外,代码空间包含一个 Linux 目录结构,具体取决于用于构建代码空间的开发容器镜像。您可以在 /workspaces 目录之外添加文件或修改文件。例如,您可以安装新程序,或在像 ~/.bashrc 这样的文件中设置 shell 配置。作为非 root 用户,您可能没有对某些目录的自动写入权限,但大多数镜像允许使用 sudo 命令获取 root 权限进行写入。
除 /tmp 目录外,/workspaces 之外的其他目录都与容器的生命周期绑定。这意味着您所做的任何更改在停止并重新启动代码空间后仍会保留,但在重建容器时则不会保留。有关 /tmp 目录的更多信息,请参阅 持久化环境变量和临时文件。
清理 /workspaces 之外的目录有助于确保重建的容器与新创建的代码空间处于相同状态。如果您重建容器以在正在使用的代码空间中应用配置更改,则可以确信对配置所做的任何修改在使用相同配置创建的新代码空间中同样有效。更多信息请参阅 Dev 容器简介。
如果您希望对代码空间所做的更改在重建后以及不同代码空间之间更为稳健,您有多种选择。
- 要在所有从仓库创建的代码空间中安装程序和工具,可在 dev 容器配置中使用生命周期命令属性(如
postCreateCommand)运行自定义安装命令,或使用称为 “features” 的预写安装命令。更多信息请参阅 Development Containers 网站上的 dev 容器规范以及 向 devcontainer.json 文件添加 features。 - 要在每个创建的代码空间中安装工具或自定义设置(例如配置
bash配置文件),可以将 GitHub Codespaces 与 dotfiles 仓库关联。dotfiles 仓库也会被克隆到持久化的/workspaces目录中。更多信息请参阅 为您的账户个性化 GitHub Codespaces。 - 如果您希望在重建后保留特定文件,可使用
devcontainer.json文件在文件与/workspaces内的持久目录之间创建符号链接。更多信息请参阅 在代码空间中重建容器。