【问题标题】:VSCode: How to open repositories that have been cloned to a local volumeVSCode:如何打开已克隆到本地卷的存储库
【发布时间】:2021-04-19 04:43:17
【问题描述】:

使用 VSCode 中的远程容器扩展,我在开发容器中打开了一个存储库。我在 windows/wsl2 中使用 vscode/docker 在 linux 容器中进行开发。为了提高磁盘性能,我选择将存储库克隆到 docker 卷中,而不是从 Windows 绑定安装它。这很好用,我做了一些编辑,但在我的更改完成之前,我关闭了我的 VSCode 窗口以执行一些其他任务。现在我在克隆到 docker 卷中的 git 存储库中有一些未提交的状态,我可以使用 docker 扩展检查卷。

我的问题是,如何重新连接到该项目?

一种方法是,如果容器仍在运行,我可以重新连接到它,然后执行文件>打开文件夹并导航到安装在容器内的卷。但是如果容器本身已经被删除了呢?如果文件在我的 Windows 文件系统上,我可以在 Windows 目录上说“打开文件夹”,然后运行“远程容器:在开发容器中重新打开”或其他什么,但我不能在卷中打开文件夹可以吗?

【问题讨论】:

    标签: visual-studio-code vscode-remote


    【解决方案1】:

    如果我理解正确,您使用 "Clone Repository in Container Volume..." 选项将存储库直接克隆到容器卷中。 选项。 假设本地卷仍然存在,您应该仍然能够恢复保存在其中的未提交更改。

    首先确保该卷仍然存在:除非您特别命名它,否则它通常命名为 -。使用此 docker 命令列出卷及其标签:

    docker volume ls --format "{{.Name}}:\t{{.Labels}}"
    

    注意我包含了 Labels 属性,这应该可以帮助您找到正确的卷,该卷的标签应该类似于 vsch.local.repository=。如果您记得最初用于克隆的确切 URL,您甚至可以使用上一个命令的过滤模式,如下所示:

    docker volume ls --filter label=vsch.local.repository=<your-repository-clone-url>
    

    如果您仍然难以找到确切的卷,您可以在Official docker documentation 中找到有关 docker volume ls 命令的更多信息,也可以使用 docker volume inspect 来获取有关卷的详细信息。

    一旦您知道卷的名称,请在本地计算机上打开一个空文件夹并创建必要的 devcontainer 文件 .devcontainer/devcontainer.json。选择最适合您的开发环境的镜像,但是为了通过执行简单的 git commit 恢复您的工作,任何安装了 git 的镜像都应该这样做(即使是那些不是专门设计为开发容器的镜像,在这里我正在使用 Alpine,因为它占用的空间相对较小)。 然后设置 workspaceFolderworkspaceMount 变量以将卷挂载到新的开发容器中,如下所示:

    {
      "image": "mcr.microsoft.com/vscode/devcontainers/base:0-alpine-3.13",
      "workspaceFolder": "/workspaces/<your-repository-name>",
      "workspaceMount": "type=volume,source=<your-volume-name>,target=/worskpaces"
    }
    

    如果您需要更具体的内容,可以在 devcontainer.json reference page 中找到有关可能的 devcontainer 配置的详尽文档。

    您现在可以使用 VSCode git 工具,甚至可以从上次“持久化”文件内容时离开的位置继续工作。

    顺便说一句,如果您通过 TCP 或 SSH 使用带有非本地上下文的 Docker(也就是 docker VM 未在您的本地计算机上运行),那么这是我所知道的使用 VSCode 开发容器的唯一方法,因为您的本地文件系统不能直接用于 docker 机器。

    如果您查看当您要求 VSCode 为您启动 devcontainer 时生成的容器日志,您会发现 IDE 执行的实际 docker run 命令类似于以下内容:

    docker run ... type=bind,source=<your-local-folder>,target=/workspaces/<your-local-folder-or-workspace-basename>,consistency=cached ...
    

    意味着如果你在 devcontainer.json 中省略指定 workspaceMount 变量,VSCode 实际上会像你这样写:

    // file: .devcontainer/devcontainer.json
    {
      // ...
      "workspaceFolder": "/worspaces/${localWorkspaceFolderBasename}",
      "workspaceMount": "type=bind,source=${localWorkspaceFolder},target=/worspaces/${localWorkspaceFolderBasename},consistency=cached"}
      // ...
    }
    

    其中 ${localWorkspaceFolder}${localWorkspaceFolderBasename} 是 VSCode devcontainer.json 上下文中可用的动态变量。

    或者

    如果您只是想提交更改并在之后丢弃卷,您可以简单地启动一个安装了 git 的 docker 容器(即使是小型 Alpine linux 也应该这样做):

    docker run --rm -it --name repo-recovery --mount type=volume,source=<your-volume-name>,target=/workspaces --workdir /workspaces/<your-repository-name> mcr.microsoft.com/vscode/devcontainers/base:0-alpine-3.13 /bin/bash
    

    然后,如果你熟悉 git 命令行工具,你可以 git add 和 git commit 你所有的修改。或者,您可以直接运行 git 命令,而不是手动使用容器内的 shell:

    docker run --rm -t --name repo-recovery --mount type=volume,source=<your-volume-name>,target=/workspaces --workdir /workspaces/<your-repository-name> mcr.microsoft.com/vscode/devcontainers/base:0-alpine-3.13 /bin/bash -c "git add . && git commit -m 'Recovered from devcontainer'"
    

    您可以在VSCode devcontainers repository 中找到 MS 提供的开发容器的完整列表。

    Devcontainers 是一个了不起的工具,可以帮助您保持环境清洁和灵活,我希望这个答案能够理解并帮助您解决问题并扩展您对该工具的了解。

    干杯

    【讨论】:

      【解决方案2】:

      你也可以使用 remote-contianer: 再次在卷中克隆存储库

      卷和您的更改仍然存在

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-22
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 2022-01-22
        • 2020-12-04
        相关资源
        最近更新 更多