远程仓库
2021 年 6 月 10 日,作者:Brigit Murtaugh, @BrigitMurtaugh, Eric Amodio, @eamodio
注意:自本博客文章发布以来,远程仓库扩展(Remote Repositories extension)已更名为 GitHub Repositories。你也可以查阅最新文档,其中包含有关该扩展的最新信息。
我们很高兴推出适用于 Visual Studio Code 的全新 远程仓库(Remote Repositories)扩展!这是一项我们与 GitHub 团队合作构建的新体验,旨在使在 VS Code 中快速安全地处理源代码仓库成为可能。
更快地打开源代码仓库
在 VS Code 中,我们从一开始就提供了对 Git 的集成支持,并且通过扩展支持了许多其他源代码管理 (SCM) 提供商。这使得开发人员可以直接在 VS Code 中克隆和处理仓库。
然而,开发人员日常工作中有很大一部分涉及阅读他人的代码:审查拉取请求、浏览开源仓库、尝试新技术或项目、检查上游依赖项以调试应用程序等。所有这些的共同点是,作为第一步,你通常会先将仓库克隆到本地,然后在你喜欢的代码编辑器(我们希望是 VS Code!)中打开代码。然而,克隆仓库需要时间,如果你忘记拉取(pull),可能会导致你审查过时的仓库版本,并且如果你不熟悉代码,有时可能会带来安全风险。
由 GitHub 发布的全新 远程仓库(Remote Repositories)扩展,使在 VS Code 中打开源代码仓库变得即时且安全。有了它,你可以直接在 VS Code 中快速浏览、搜索、编辑和提交到任何远程 GitHub 仓库(很快也将支持 Azure Repos),无需克隆!
你可以处理任意数量的仓库,而无需在你的机器上保存任何源代码。远程仓库为你节省了时间与本地磁盘空间,并使你能够完全在 VS Code 中完成所有源代码管理任务。
在这篇博客文章中,我们将探讨如何轻松开始使用远程仓库、打开第一个远程仓库后你可以做什么、支持此虚拟环境的技术细节,以及你今天如何向我们提供反馈。
在 VS Code 中打开你的第一个远程仓库
让我们在 VS Code 中打开一个远程仓库。首先,请确保你已安装远程仓库(Remote Repositories)扩展。
目前,远程仓库支持 GitHub 仓库,即将支持 Azure Repos。在这篇博客文章中,我们将从打开 VS Code 仓库 (microsoft/vscode) 开始。
安装远程仓库扩展后,点击 VS Code 左下角的远程指示器(以及你安装的任何其他远程开发扩展中的命令),即可立即访问其打开远程仓库命令。
如果你之前没有从 VS Code 登录 GitHub,系统会提示你对 GitHub 帐户进行身份验证。登录后,搜索仓库或 PR,选择你想要的,然后就可以开始了。
在下面的短视频中,我们搜索并选择了 VS Code 仓库,VS Code 重新加载,然后仓库内容加载,就像我们在本地克隆了一样。
你无需离开 VS Code 即可浏览和贡献仓库。你感觉就像在处理本地代码一样,使用熟悉的 VS Code 界面,并且可以使用 VS Code 资源管理器、搜索、时间线视图、快速打开等功能,当然还有源代码管理。
你现在已连接到一个所谓的虚拟工作区(有关虚拟工作区的更多信息,请参阅下文);远程指示器显示“GitHub”。当你将鼠标悬停在远程指示器上时,会收到提示,说明在虚拟工作区中某些功能不可用。
虚拟工作区是一种特殊设置,某些功能(如扩展)被禁用或功能受限。你可以通过点击鼠标悬停在远程指示器上时显示的“某些功能”链接,轻松找出哪些扩展被禁用。
点击链接会显示哪些扩展被禁用以及哪些功能受限。当鼠标悬停在扩展上时,可以看到受限的功能。
如果你想在虚拟工作区中手动启用某个扩展,你可以在用户 `settings.json` 文件中使用 `extensions.supportVirtualWorkspaces` 设置。
"extensions.supportVirtualWorkspaces": { "<extensionID>": true }
请记住,扩展可能未实现处理无法访问本地文件系统的虚拟工作区,因此扩展可能无法按预期工作。
你打开了一个仓库,接下来呢?
当你的仓库打开时,远程仓库让你轻松地为项目做贡献。
简化的 Git 工作流,让你的项目保持最新
远程仓库(Remote Repositories)可帮助你每次都保持在仓库的最新版本,无需任何复杂的 Git 命令。
每次你打开一个新仓库时,你都会打开最新版本。每当远程仓库检测到 GitHub 上有新更改时,它会在状态栏中列出你需要拉取多少提交。
并在资源管理器中高亮显示修改过的文件。
当你提交更改时,它们会自动显示在 GitHub 上——你不需要推送你的更改或发布你创建的任何新分支。
创建或检出拉取请求
远程仓库(Remote Repositories)与 GitHub 拉取请求和问题扩展配合良好,该扩展允许你直接在 VS Code 中审查和管理 GitHub 上的拉取请求和问题。并行使用这两个扩展,可以快速检出 PR 并处理问题,而无需在本地克隆代码或离开 VS Code。
你可以更改代码,根据该更改创建一个新分支和一个拉取请求(PR),然后检出该 PR,所有这些只需点击几下即可完成。
你可以在我们的使用 GitHub 文章中了解有关 GitHub 拉取请求和问题扩展的更多信息。
将更改隔离到分支
你可能需要在完成工作时在分支之间切换。在典型的环境中,当你需要决定要暂存或提交哪些更改时,这可能会变得很棘手。
远程仓库(Remote Repositories)让你能够轻松地同时处理不同的分支。当你暂停在一个分支上的工作并切换到新分支时,你不会被询问是否暂存更改——它们会自动保留在之前的分支上。当你返回到之前的分支时,你的更改仍然会在那里,你可以从上次中断的地方继续。
让我们探讨如何将更改推送到分支。
在状态栏中,选择你当前的分支以打开分支列表,例如“main”
选择+ 创建新分支...并为你的分支键入一个名称
然后你可以切换到那个新分支。
新分支将不包含你之前分支的任何更改。
限制
使用远程仓库存在某些限制
- 调试、终端和任务 - 目前不支持。终端在本地文件系统上打开,并且无法访问远程仓库的虚拟文件系统。
- 有限的语言智能 - 诸如 IntelliSense 和转到定义等功能可能会受到影响,因为许多语言尚不理解远程仓库的虚拟化环境。
- 搜索 - GitHub 搜索本身存在限制,例如不索引分支。远程仓库可以通过启用索引来避免此限制并执行全文搜索。索引会从 GitHub 拉取仓库的浅克隆并在本地执行全面搜索,提供比 GitHub 模糊的默认分支原生搜索更强大的功能。你可以在搜索视图中启用远程仓库的索引。
- 扩展限制 - 并非所有扩展都支持在虚拟工作区中运行,但随着时间的推移,会有更多扩展支持它。严重依赖本地文件访问的扩展无法支持此设置。有关更多详细信息,请参阅下文的虚拟工作区部分。
我们才刚刚踏上这段旅程,所以随着我们不断开发,预计功能集会增长,限制会减少。
在更强大的环境中继续工作
使用远程仓库时,VS Code 在一个并非所有功能都可用的环境中运行,因为没有物理文件系统。这非常适合快速浏览仓库,但当你准备进行更“高级”的工作时,例如:
- 你希望积极处理该仓库并获得 VS Code 的全部功能。
- 你需要通过定期从远程拉取来主动跟踪仓库的更改。
为了转向更高级的工作流程,远程仓库提供了一种“升级”你的环境并继续工作的方式,从你当前所在的位置继续。
点击左下角的远程指示器,然后选择继续工作...。
你将看到三个选项:
- 在本地克隆仓库:将当前仓库克隆到你的本地机器。一个本地文件浏览器将弹出,允许你选择一个磁盘位置来克隆远程仓库。
- 在容器卷中克隆仓库:使用 Dev Containers 扩展在 Docker 容器卷中克隆当前仓库(你需要安装 Dev Containers 扩展和 Docker)。VS Code 将重新加载并使用 Dev Containers 进行连接,远程指示器现在将显示开发容器:{镜像名称}。
- 在 Codespaces 中打开:在 GitHub Codespace 中继续你的工作。当你选择此选项时,浏览器将打开并引导你到此仓库的 Codespaces 列表。
现在我们已经探讨了如何在 VS Code 中使用远程仓库,我们想描述一下支持该体验的一些技术细节,以及你如何确保你的扩展在远程仓库会话中正常工作。
虚拟文件系统和工作区
驱动这种远程工作的核心概念是虚拟文件系统和虚拟工作区。
作为最终用户,你只需要知道你想处理哪个仓库或 PR——VS Code 会为你处理虚拟文件系统并管理你的工作区。作为扩展开发人员,你将需要采用虚拟文件系统 API 以确保你的扩展行为符合预期。
虚拟文件系统的工作原理
当你以传统 Git 工作流方式工作时,你“git clone”一个仓库,副本会保存到你电脑的本地文件系统。但当使用远程仓库时,代码并不在你的本地电脑上;它仍然只在 GitHub 上。
你通过虚拟文件系统与代码交互,虚拟文件系统是对物理磁盘上存在的文件的抽象。虚拟文件系统可以从 GitHub 等代码托管服务、从云存储或从数据库提供内容,并无缝地将这些内容作为文件提供给 VS Code 中的用户。
当你在虚拟文件系统上打开一个工作区时,它被称为虚拟工作区。在虚拟工作区中工作时,你仍然可以访问 VS Code 功能,包括扩展。
确保你的扩展在虚拟工作区中工作
为了使扩展正常运行,它们必须支持虚拟文件系统。
当扩展没有代码而只是纯粹的颜色主题、快捷键绑定、代码片段或语法扩展时,它可以在虚拟工作区中运行,无需进行任何适配。
运行实际代码的扩展,即定义主入口点的扩展,需要检查并可能需要进行适配。
通过 `FileSystemProvider` 接口,可以API 支持虚拟文件系统。文件系统提供程序为新的 URI 方案注册(例如,`vscode-vfs`),并且该文件系统上的资源将由使用该方案的 URI 表示(`vscode-vfs://github/microsoft/vscode/package.json`)。
扩展的 `package.json` 中有一个 `capabilities` 属性,其中 `virtualWorkspaces` 子属性用于指示扩展是否适用于虚拟工作区。
你可以在虚拟工作区扩展作者指南中了解有关虚拟文件系统、工作区以及如何为扩展实现它们的更多信息。
反馈和延伸阅读
我们非常期待你试用远程仓库,并迫不及待地等待你的反馈。
请安装 远程仓库 扩展。你可以提出任何问题或功能请求,或在 Twitter 上向我们发表你的看法:@code。
你还可以查看我们关于如何使用远程仓库扩展的最新YouTube 视频。
如果你是扩展作者,请查阅扩展作者的虚拟工作区支持指南,并在我们的跟踪问题中分享任何问题或反馈。你也可以加入扩展作者社区的 Slack 群组。
编码愉快!
Brigit Murtaugh, VS Code 项目经理 @BrigitMurtaugh
Eric Amodio, VS Code 首席软件工程师 @eamodio