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 的影响。参见 仓库选择实现。
方法一:关闭当前窗口中多余的仓库
如果当前窗口只需要操作一个工作目录,可以用这个办法。
- 打开 Source Control 中的 Repositories 视图,查看当前有哪些仓库。
- 对不需要在当前窗口管理的条目执行
Close Repository,只保留目标仓库。 - 再按原来绑定的
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 支持。
备注:内容仅供参考。
