PAYATHON 2026

VS Code 更新 worktree 支持后,如何恢复通过快捷键直接切换分支?

排障赵师傅

要通过快捷键直接进入分支或 tag 选择器,可以让当前窗口只保留一个已打开的 Git 仓库,或者在快捷键中指定目标仓库路径。仅关闭 worktree 自动检测,不能保证跳过 repository 选择。

以下方案依据 VS Code 公开主线源码中的命令实现,尚未在题述的 1.118.1 上做实机验证,因此不能直接将这一现象认定为该版本的已知回归。

为什么会多出 repository 选择?

Git: Checkout to... 对应命令 git.checkout。它会先确定目标仓库,再显示 Select a branch or tag to checkout。

公开源码中的处理逻辑是:

  • 调用时传入可识别的仓库路径或资源,直接使用对应仓库。
  • 没有传入目标,且只有一个可选仓库,直接使用该仓库。
  • 有多个可选仓库时,显示 repository 选择器。当前编辑文件所属的仓库会排在前面,但仍需确认。

worktree 也可能作为独立的仓库条目出现在选择器中。因此,即使界面写的是 repositories,也不能排除 worktree 的影响。参见 仓库选择实现。

方法一:关闭当前窗口中多余的仓库

如果当前窗口只需要操作一个工作目录,可以用这个办法。

  1. 打开 Source Control 中的 Repositories 视图,查看当前有哪些仓库。
  2. 对不需要在当前窗口管理的条目执行 Close Repository,只保留目标仓库。
  3. 再按原来绑定的 Git: Checkout to... 快捷键。

关闭仓库只影响 VS Code 对它的管理,不会删除磁盘目录、分支或 worktree。需要时,可以通过 Git: Reopen Closed Repositories... 重新打开。相关行为见 Git 命令实现。

也可以在不同的 VS Code 窗口中分别打开各个 worktree,避免一个窗口同时管理多个仓库。

方法二:在快捷键中指定仓库路径

如果需要保留多个仓库,而快捷键始终操作其中一个,可以直接传入该仓库的路径。

执行 Preferences: Open Keyboard Shortcuts (JSON),将以下条目加入现有数组:

{
  "key": "ctrl+alt+b",
  "command": "git.checkout",
  "args": "/home/yourname/projects/my-project"
}

将路径替换为实际仓库或 worktree 的根目录,并按需要更换快捷键。Windows 路径可写成:

{
  "key": "ctrl+alt+b",
  "command": "git.checkout",
  "args": "C:\\Users\\yourname\\projects\\my-project"
}

这里的 args 使用字符串,普通快捷键会将它作为命令的第一个参数传入。git.checkout 支持通过路径字符串解析仓库,因此可以跳过仓库选择,直接显示分支和 tag 列表。参见 快捷键参数说明和 Git 命令实现。

使用时需要注意:

  • 目标仓库必须已在当前窗口的 Git 扩展中打开。这个参数只用于定位已有仓库,不会打开仓库。
  • 路径是固定的,不会随当前编辑文件变化。如果希望同一快捷键自动操作当前文件所属的仓库,需要由扩展或自定义命令提供相应的资源参数。

状态栏上的分支按钮调用 git.checkout 时带有仓库上下文,所以可能直接进入分支列表;无参数的快捷键仍可能要求选择仓库。参见 状态栏实现。

为什么已经尝试的设置没有解决问题?

这些设置和命令各有作用,不能互相替代:

设置或命令实际作用
git.detectWorktrees控制是否自动检测关联的 worktree
git.detectWorktreesLimit限制自动检测的 worktree 数量
git.repositoryScanMaxDepth控制工作区子目录的仓库扫描深度
git.repositoryScanIgnoredFolders排除子目录扫描中的指定目录
git.autoRepositoryDetection控制自动发现仓库的方式
git.openRepositoryInParentFolders控制是否打开父目录中的仓库
git worktree prune清理失效的 worktree 管理记录

这些操作都不能保证当前窗口只保留一个仓库。git worktree prune 清理的是失效记录,不会移除仍然有效的 worktree,也不会改变 VS Code 的仓库选择流程。参见 VS Code 设置说明和 Git worktree 文档。

git.repositoryScanIgnoredFolders 按目录名比较,不采用 .gitignore 的 glob 匹配规则。符合公开实现匹配方式的配置是:

{
  "git.repositoryScanIgnoredFolders": [".worktrees"]
}

"**/.worktrees/**"、"*" 和 "**" 在这里没有通配符含义。即使目录名配置正确,也只会影响相应的扫描过程。参见 目录扫描实现。

能否彻底禁用内置 worktree 支持?

"git.detectWorktrees": false 只关闭自动检测。在公开的 Git 扩展设置中,未找到能保留其他内置 Git 功能、同时彻底移除所有 worktree 支持的总开关。禁用整个内置 Git 扩展也会失去 Git: Checkout to...,无法满足这个需求。参见 Git 扩展配置。

建议先关闭当前窗口中多余的仓库;需要保留多个仓库时,再使用带固定路径参数的快捷键。如果只剩一个仓库后仍出现 repository 选择,应记录选择器中的完整路径和 Git: Show Git Output 日志,针对该版本继续排查。仅凭界面变化,还不能将原因归结为 worktree 支持。

备注:内容仅供参考。