远程仓库
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 上——您不需要推送您的更改或发布您创建的任何新分支。
创建或检出 pull request
Remote Repositories 与 GitHub Pull Requests and Issues 扩展 配合得很好,该扩展允许您直接在 VS Code 中审查和管理来自 GitHub 的 pull request 和 issue。并行使用这两个扩展,可以快速检出 PR 并处理 issue,而无需在本地克隆代码或离开 VS Code。
您可以对代码进行更改,基于该更改创建一个新分支和一个 pull request (PR),然后检出该 PR,所有操作只需几次点击即可完成。
您可以在我们的“与 GitHub 协同工作”文章中了解更多关于 GitHub Pull Requests and Issues 扩展的信息。
将更改隔离到分支中
在完成工作时,您可能需要在不同分支之间切换。在典型的环境中,当您需要决定要储藏(stash)或提交哪些更改时,这可能会变得很棘手。
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: {镜像名称}。
- 在 Codespaces 中打开 (Open in 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 scheme(例如,vscode-vfs
)注册,该文件系统上的资源将由使用该 scheme 的 URI 表示(vscode-vfs://github/microsoft/vscode/package.json
)。
在扩展的 package.json
中有一个 capabilities
属性,其中的 virtualWorkspaces
子属性用于表示一个扩展是否适用于虚拟工作区。
您可以在虚拟工作区扩展作者指南中了解更多关于虚拟文件系统、工作区以及如何为扩展实现它们的信息。
反馈与进一步阅读
我们非常期待您尝试 Remote Repositories,并迫不及待地想听到您的反馈。
请安装 Remote Repositories 扩展。您可以提交任何问题或功能请求,或在 Twitter 上 @code 告诉我们您的想法。
您也可以观看我们关于如何使用 Remote Repositories 扩展的新 YouTube 视频。
如果您是扩展作者,请查看“扩展作者的虚拟工作区支持指南”,并在我们的跟踪问题中分享任何问题或反馈。您也可以加入 Extension Authors 社区的 Slack 群组。
编码愉快!
Brigit Murtaugh, VS Code 项目经理 @BrigitMurtaugh
Eric Amodio, VS Code 首席软件工程师 @eamodio