You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单命令关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:30:05