如何从Git任意工作树中定位带.git目录的主工作树
解决方案
Git原生提供了更简洁的实现方式,不需要手动解析git worktree list的输出,核心是利用Git工作树共享的公共Git目录特性:
核心命令
适用于所有支持工作树特性的Git版本(Git 2.5+),在任意工作树的任意路径下执行以下命令即可直接获取主工作树的绝对路径:
dirname "$(git rev-parse --path-format=absolute --git-common-dir)"
原理说明
- 所有关联的Git工作树共享同一个公共Git目录,这个目录就是你所说的「主工作树」下的
.git目录 git rev-parse --git-common-dir会返回当前工作树对应的公共Git目录路径,加上--path-format=absolute参数可以强制返回绝对路径,避免相对路径带来的解析问题- 对返回的
.git目录路径取父目录,得到的就是主工作树的根路径
验证示例
假设主工作树路径为/home/user/dev/project,你在附属工作树/tmp/project-feature下执行命令:
# 首先执行git rev-parse命令获取公共Git目录路径 $ git rev-parse --path-format=absolute --git-common-dir /home/user/dev/project/.git # 取父目录得到主工作树路径 $ dirname "$(git rev-parse --path-format=absolute --git-common-dir)" /home/user/dev/project
即使你在主工作树本身执行该命令,返回结果也完全正确,符合你的需求。
为什么git rev-parse --show-toplevel不符合需求
这个命令返回的是当前所在工作树的根路径,如果你在附属工作树中执行,返回的是附属工作树的根目录,自然无法得到主工作树路径。
低版本Git兼容方案
如果你的Git版本低于2.31,不支持--path-format参数,可以使用以下兼容性更好的命令,同样可以返回主工作树的绝对路径:
cd "$(dirname "$(git rev-parse --git-common-dir)")" && pwd
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

