git worktree下执行rev-parse报not a git repository错误如何解决?
根因说明
该问题既不是特定Git版本的功能缺陷,也不是Docker与Git的兼容问题:
Git自2.20版本起新增了工作树(worktree)路径合法性校验逻辑,会校验工作树元数据中存储的绝对路径是否真实存在。宿主机创建的工作树元数据默认存储宿主机的绝对路径,将仓库目录挂载到Docker容器内时,如果容器内的挂载路径与宿主机路径不一致,就会触发校验失败,返回你遇到的报错。你本地使用的Git 2.17.1版本低于2.20,无该校验逻辑,因此可以正常执行命令。
可行解决方案
- 路径一致挂载:容器挂载仓库目录时,保持容器内路径与宿主机路径完全一致。比如宿主机仓库路径为
/home/me/git-project,容器内也挂载到相同的/home/me/git-project路径,无需修改任何配置即可正常使用。 - 手动修改路径配置:打开仓库根目录下的
.git/worktrees/worktree-master/gitdir文件,将其中的路径替换为容器内对应目录的绝对路径,同时修改worktree-master目录下.git文件中的指向路径为容器内的对应路径即可。 - 容器内重建工作树:如果不需要复用宿主机工作树的修改状态,直接在容器内执行
git worktree add命令新建工作树,新生成的工作树元数据会自动使用容器内的绝对路径,不会出现路径不匹配问题。 - 开启相对路径配置:如果使用Git 2.32及以上版本,可执行
git config --global core.worktreeRelativePaths true,开启后工作树元数据会存储相对路径,不受跨环境挂载的路径差异影响。
内容的提问来源于stack exchange,提问作者frans
相关产品推荐
相关产品推荐

