如何用单命令关联Git工作树、Subst盘符与对应分支
关联Subst映射盘符与Git工作树分支的最简实现
背景与问题
通过批处理维护Subst映射盘符,映射信息保存到Local_Map.txt并开机自动恢复。使用Git多工作树工作流时,无法直接关联Subst盘符与对应分支:git worktree list仅显示工作树路径和分支,subst仅显示盘符与路径,需要手动逐个切换盘符查看分支,效率低下。
现有文件内容
Local_Map.txt 内容
F:\: => C:\tools\dev\Tools M:\: => C:\tools\dev\Tools_Master_Worktree W:\: => C:\tools\dev\Tools_ALT_Worktree X:\: => C:\tools\dev\Tools_Xtra_Worktree
git worktree list 输出
C:/tools/dev/Tools a1a2abdf4 [reviewBranch_1.2.3] C:/tools/dev/Tools_ALT_Worktree 1ace7f077 [myBranch_in-work] C:/tools/dev/Tools_Master_Worktree 19a1277ba [myBranch_1.2.3] C:/tools/dev/Tools_Xtra_Worktree ddd960a7d [myAltBranch]
开机加载映射的批处理脚本
for /F "tokens=1,2,*" %%i in (C:\Batch_Files\Local_Map.txt) do ( if exist %%~di subst %%~di /D subst %%~di %%k )
映射管理批处理脚本
@echo off wmic logicaldisk get Name, VolumeName REM Path_Map_Boot_Up.bat runs at startup to load subst's from txt file REM for /F "tokens=1,2,*" %%i in (C:\Batch_Files\Local_Map.txt) do ( REM if exist %%~di subst %%~di /D REM subst %%~di %%k REM ) echo. subst echo. set /p new= Map Drive(m) Delete Map(d) Refresh(r) Quit(q): CALL :%new% CLS %0 :m set /p drive=Enter Drive Letter: if exist %drive%: subst %drive%: /D set /p mp= Set map path: subst %drive%: %mp% subst >"C:\Batch_Files\Local_Map.txt" EXIT /B :d set /p drive=Enter Drive Letter: REM if exist %drive%: subst %drive%: /D subst %drive%: /D subst >"C:\Batch_Files\Local_Map.txt" EXIT /B :q EXIT
需求
编写全局可调用的脚本,关联git worktree list与subst输出,生成如下格式结果:
F:\ [reviewBranch_1.2.3] M:\ [myBranch_in-work] W:\ [myBranch_1.2.3] X:\ [myAltBranch]
解决方案
方案1:Bash脚本(Git Bash环境推荐)
创建worktree-map.sh脚本,保存到Git Bash可执行路径(如C:\Program Files\Git\usr\bin)或添加到系统PATH:
#!/bin/bash # 构建路径到盘符的映射字典(统一正斜杠路径) declare -A drive_map while read -r line; do if [[ $line =~ ^([A-Z]:\\):\ =\>\ (.*)$ ]]; then drive="${BASH_REMATCH[1]}" path=$(echo "${BASH_REMATCH[2]}" | sed 's/\\/\//g') drive_map["$path"]="$drive" fi done < <(subst) # 解析Git工作树列表,匹配映射并输出 git worktree list | while read -r line; do if [[ $line =~ ^([A-Za-z:/\\]+)\ +[0-9a-f]+\ \[(.*)\]$ ]]; then wt_path=$(echo "${BASH_REMATCH[1]}" | sed 's/\\/\//g') branch="${BASH_REMATCH[2]}" [[ -n "${drive_map[$wt_path]}" ]] && echo "${drive_map[$wt_path]} [$branch]" fi done
使用:Git Bash中直接输入worktree-map.sh执行。
方案2:批处理脚本(CMD环境可用)
创建worktree-map.bat,保存到系统PATH目录(如C:\Windows\System32):
@echo off setlocal enabledelayedexpansion :: 构建路径到盘符的映射字典 for /f "tokens=1,3*" %%i in ('subst') do ( set "path=%%k" set "path=!path:\=/!" set "drive_map[!path!]=%%i" ) :: 解析Git工作树列表并输出结果 for /f "tokens=1,3*" %%a in ('git worktree list') do ( set "wt_path=%%a" set "branch=%%c" set "branch=!branch:[=!" set "branch=!branch:]=!" if defined drive_map[!wt_path!] ( echo !drive_map[!wt_path!]! [!branch!] ) ) endlocal
使用:CMD或Git Bash中输入worktree-map.bat执行。
说明
- 两个脚本均直接读取当前生效的
subst映射,无需依赖Local_Map.txt。 - Bash脚本路径格式处理更稳定,适合Git Bash环境;批处理脚本可直接在CMD运行。
内容的提问来源于stack exchange,提问作者flyingblindonarocketcycle
相关产品推荐
相关产品推荐

