远程仓库
2021年6月10日,作者:Brigit Murtaugh, @BrigitMurtaugh, Eric Amodio, @eamodio
注意:自本文发布以来,“Remote Repositories”扩展已重命名为 GitHub Repositories。您也可以查看最新文档,获取有关该扩展的最新信息。
我们很高兴为 Visual Studio Code 推出全新的 Remote Repositories 扩展!这是我们与 GitHub 的伙伴们合作构建的一种新体验,旨在让您能够快速、安全地在 VS Code 内处理源代码仓库。
一种更快速的源代码仓库打开方式
在 VS Code 中,我们从一开始就提供了对 Git 的集成支持,并一直通过扩展支持许多其他源代码管理 (SCM) 提供商。这使得开发人员可以直接在 VS Code 中克隆和处理仓库。
然而,开发人员日常工作中有很大一部分涉及阅读他人的代码:审查拉取请求 (Pull Request)、浏览开源仓库、试验新技术或项目、检查上游依赖以调试应用程序等。所有这些工作的共同点是:第一步通常都是在本地克隆仓库,然后在您偏好的代码编辑器中打开代码(我们希望是 VS Code!)。然而,克隆仓库需要时间,如果忘记拉取,可能会导致您审查的是旧版本的代码,而且如果您不熟悉该代码,有时还会存在安全风险。
由 GitHub 发布的全新 Remote Repositories 扩展,让在 VS Code 中打开源代码仓库的体验变得即时且安全。有了它,您可以直接在 VS Code 内快速浏览、搜索、编辑任何远程 GitHub 仓库(不久后也将支持 Azure Repos)并进行提交,无需克隆!
您可以处理任意数量的仓库,而无需在本地机器上保存任何源代码。Remote Repositories 为您节省了时间及本地磁盘空间,使您能够完全在 VS Code 内完成所有源代码管理任务。
在本篇博客中,我们将探讨如何轻松上手 Remote Repositories、打开第一个远程仓库后可以做什么、支持这种虚拟环境的技术细节,以及您今天如何向我们提供反馈。
在 VS Code 中打开您的第一个远程仓库
让我们在 VS Code 中打开一个远程仓库。首先,请确保您已安装了 Remote Repositories 扩展。
目前,Remote Repositories 支持 GitHub 仓库,对 Azure Repos 的支持即将推出。在本篇博客中,我们将首先打开 VS Code 仓库 (microsoft/vscode)。
安装 Remote Repositories 扩展后,通过点击 VS Code 左下角的远程指示器,我们可以立即访问其 Open Remote Repository(打开远程仓库)命令(以及您已安装的其他远程开发扩展命令)。

如果您之前未从 VS Code 登录过 GitHub,系统会提示您验证 GitHub 帐户。登录后,搜索一个仓库或 PR,选择您想要的那个,即可开始操作。
在下方的短视频中,我们搜索并选择了 VS Code 仓库,VS Code 随即重新加载,仓库内容像在本地克隆一样加载出来。

您无需离开 VS Code 即可探索并为仓库做出贡献。使用熟悉的 VS Code 界面,感觉就像在处理本地代码一样,并且可以使用 VS Code 资源管理器、搜索、时间线视图、快速打开以及源代码管理等功能。
您现在已连接到所谓的“虚拟工作区”(有关虚拟工作区的更多信息,请参阅下文);远程指示器显示为“GitHub”。当您将鼠标悬停在远程指示器上时,系统会通知您在虚拟工作区中某些功能不可用。

虚拟工作区是一种特殊的设置,某些功能(如扩展)会被禁用或功能受限。通过点击悬停在远程指示器上时显示的 Some features(某些功能)链接,您可以轻松查看到哪些扩展被禁用。
点击该链接会显示哪些扩展被禁用,以及哪些扩展功能受限。悬停在扩展上时,可以看到功能受限的具体情况。

如果您想在虚拟工作区中手动启用某个扩展,可以使用用户 settings.json 文件中的 extensions.supportVirtualWorkspaces 设置。
"extensions.supportVirtualWorkspaces": { "<extensionID>": true }
请记住,如果扩展未实现对没有本地文件系统访问权限的虚拟工作区的支持,则该扩展可能无法按预期工作。
仓库打开了,接下来做什么?
打开仓库后,Remote Repositories 可以让您轻松为项目做出贡献。
简化 Git 工作流程,让您的项目保持最新
Remote Repositories 帮助您始终处于仓库的最新版本,无需任何复杂的 Git 命令。
每当您打开一个新仓库时,您打开的都是最新版本。只要 Remote Repositories 检测到 GitHub 有新的更改,它就会在状态栏中列出您需要拉取的提交数量。

并在资源管理器中高亮显示已修改的文件。

当您提交更改时,它们会自动出现在 GitHub 上——您无需推送更改,也无需发布您创建的任何新分支。
创建或检出拉取请求
Remote Repositories 与 GitHub Pull Requests and Issues 扩展配合使用效果极佳,该扩展允许您直接在 VS Code 中审查和管理来自 GitHub 的拉取请求和问题。并行使用这两个扩展,无需在本地克隆代码或离开 VS Code,即可快速检出 PR 并处理问题。
您可以对代码进行更改,基于该更改创建新分支和拉取请求 (PR),然后检出该 PR,只需几次点击即可完成。

您可以在我们的使用 GitHub 文章中了解有关 GitHub Pull Requests and Issues 扩展的更多信息。
将更改隔离在分支中
在完成工作时,您可能需要在不同分支之间切换。在典型的环境中,当您需要决定暂存或提交哪些更改时,这可能会变得很棘手。
Remote Repositories 让您可以轻松地同时处理不同的分支。当您暂停一个分支上的工作并切换到新分支时,系统不会询问您是否暂存更改——它们会自动保留在之前的分支上。当您返回之前的分支时,您的更改依然存在,您可以从中断的地方继续工作。
让我们探索一下如何将更改推送到分支。
在状态栏中,选择您当前的分支以打开分支列表,例如“main”。

选择 + Create New Branch...(创建新分支...)并输入您的分支名称。

然后,您可以切换到该新分支。

新分支将不包含您之前分支中的任何更改。
限制
在使用 Remote Repositories 时存在某些限制
- 调试、终端和任务——目前不支持。终端在您的本地文件系统上打开,无法访问远程仓库的虚拟文件系统。
- 有限的语言智能——IntelliSense 和 转到定义 等功能可能会受到影响,因为许多语言尚不了解 Remote Repositories 的虚拟化环境。
- 搜索——GitHub 搜索本身有限制,例如无法索引分支。Remote Repositories 可以通过启用索引来规避此限制并执行全文搜索。索引会从 GitHub 拉取仓库的浅层克隆并在本地执行全面搜索,从而提供比 GitHub 默认分支原生模糊搜索更强大的功能。您可以在“搜索”视图中启用 Remote Repositories 的索引功能。
- 扩展限制——并非所有扩展都能支持在虚拟工作区中运行,但随着时间的推移,会有更多的扩展提供支持。严重依赖访问本地文件的扩展无法支持此设置。有关更多详情,请参阅下文的“虚拟工作区”部分。
我们才刚刚开启这段旅程,因此随着我们继续开发,功能集将会增加,限制也会减少。
在更强大的环境中继续工作
使用 Remote Repositories 时,VS Code 在一个并非所有功能都可用的环境中运行,因为没有物理文件系统。这非常适合快速开始浏览仓库,但当您准备进行一些更“高级”的工作时,例如:
- 您想要主动处理该仓库并获得 VS Code 的全部强大功能。
- 您需要通过定期从远程拉取来主动跟踪仓库的更改。
为了迁移到更高级的工作流程,Remote Repositories 为您提供了一种“升级”环境并在其中继续工作的方法,从您当前的位置继续操作。
点击左下角的远程指示器,然后选择 Continue Working on...(继续工作于...)。

您将看到三个选项:
- Clone Repository Locally(在本地克隆仓库):将当前仓库克隆到您的本地机器。会弹出一个本地文件浏览器,允许您选择磁盘上的位置来克隆远程仓库。
- Clone Repository in Container Volume(在容器卷中克隆仓库):使用 Dev Containers 扩展在 Docker 容器卷中克隆当前仓库(您需要安装 Dev Containers 扩展并安装 Docker)。VS Code 将重新加载并使用 Dev Containers 进行连接,此时远程指示器将显示为 Dev Container: {镜像名称}。
- Open in Codespaces(在 Codespaces 中打开):在 GitHub Codespace 中继续您的工作。选择此选项时,浏览器将打开并将您导向该仓库的 Codespaces 列表。

既然我们已经探索了如何在 VS Code 中使用 Remote Repositories,我们想描述一些支持这种体验的技术细节,以及您如何确保您的扩展能在 Remote Repository 会话中正常工作。
虚拟文件系统和工作区
支持此远程工作的核心概念是虚拟文件系统和虚拟工作区。
作为最终用户,您只需要知道想要处理哪个仓库或 PR,VS Code 就会为您处理虚拟文件系统并管理您的工作区。作为扩展开发人员,您需要采用虚拟文件系统 API 以确保您的扩展表现符合预期。
虚拟文件系统的工作原理
当您使用传统的 git 工作流程时,您会“git clone”一个仓库,副本会保存在您计算机的本地文件系统中。但是当使用 Remote Repositories 时,代码并不存在于您的本地计算机上;它仍然只在 GitHub 上。
您通过虚拟文件系统处理代码,这是对磁盘上物理存在文件的抽象。虚拟文件系统可以从代码托管平台(如 GitHub)、云存储或数据库提供内容,并无缝地将这些内容作为文件提供给 VS Code 中的用户。
当您在虚拟文件系统上打开工作区时,它被称为虚拟工作区。在虚拟工作区中工作时,您仍然可以使用包括扩展在内的 VS Code 功能。
确保您的扩展在虚拟工作区中工作
为了使扩展正常运行,它们必须支持虚拟文件系统。
当扩展没有代码,而是纯颜色主题、快捷键绑定、代码片段或语法扩展时,它们可以在虚拟工作区中运行,无需进行任何适配。
运行实际代码(即定义了主入口点)的扩展,则需要进行检查并可能需要适配。
虚拟文件系统的 API 支持是通过 FileSystemProvider 接口实现的。文件系统提供程序是为新的 URI 方案(例如 vscode-vfs)注册的,该文件系统上的资源将由使用该方案的 URI 表示 (vscode-vfs://github/microsoft/vscode/package.json)。
在扩展的 package.json 中有一个 capabilities 属性,其中的 virtualWorkspaces 子属性用于表示扩展是否支持虚拟工作区。
您可以在虚拟工作区扩展作者指南中了解有关虚拟文件系统、工作区以及如何为扩展实现它们的更多信息。
反馈与进一步阅读
我们非常期待您尝试 Remote Repositories,并迫不及待地想听到您的反馈。
请安装 Remote Repositories 扩展。您可以提交任何问题或功能请求,或者在 Twitter 上给我们发送推文 @code。
您还可以查看我们关于如何使用 Remote Repositories 扩展的全新 YouTube 视频。
如果您是扩展作者,请查看虚拟工作区扩展作者指南,并在我们的跟踪问题中分享任何疑问或反馈。您也可以加入扩展作者社区 Slack 群组。
编码愉快!
Brigit Murtaugh, VS Code 项目经理 @BrigitMurtaugh
Eric Amodio,VS Code 首席软件工程师 @eamodio
