VSCode远程容器中Git功能异常的解决方案咨询(Docker Compose挂载场景)
我碰到过类似的场景,你的问题根源在于Git仓库的工作目录与.git目录的相对路径不匹配,下面给你两个可行的解决办法,更推荐第一个:
方案一:挂载整个Git仓库根目录,指定容器工作目录
因为你的.git在module目录(也就是sub_module的上层上层目录),直接挂载当前sub_module会丢失仓库根的上下文。正确的做法是把整个仓库根目录挂载到容器,然后让容器的工作目录指向sub_module:
修改你的docker-compose.yml:
version: '3' services: your-service-name: # 其他配置(镜像、端口等)... volumes: - ../..:/repo # 挂载整个Git仓库根目录到容器的/repo路径 working_dir: /repo/sub_module # 设置容器默认工作目录为sub_module
这样容器里的Git能完整识别仓库结构,文件路径和本地完全一致,不会出现“所有文件都被标记为变更”的问题,同时VSCode自动挂载的~/.gitconfig也能正常生效。
方案二:指定Git的仓库目录与工作目录(适合不想挂载整个仓库的场景)
如果不想挂载整个仓库,可以通过Git的参数强制指定.git目录和工作目录的位置。不过这个方法需要额外配置,要么每次执行Git命令时加参数,要么预设环境变量:
临时执行方式
在容器里执行Git命令时手动指定参数:
git --git-dir=/src/.git --work-tree=/repo/sub_module status
这里/src/.git是你挂载进来的仓库目录,/repo/sub_module是容器里对应本地sub_module的路径。
预设环境变量
可以在docker-compose.yml的environment里添加配置,让容器启动时自动设置Git的环境变量:
environment: - GIT_DIR=/src/.git - GIT_WORK_TREE=/repo/sub_module
这样后续在容器里执行Git命令就不需要每次加参数了,但还是不如方案一简洁直观。
为什么之前的配置不行?
你之前直接挂载../../.git:src/.git,容器里的工作目录是/src(对应本地的sub_module),但Git仓库的根实际是module目录。Git会默认认为工作目录应该和.git目录处于同一层级,而容器里的文件都在/src,相当于Git看到的文件路径是/src/xxx,但仓库里记录的路径是sub_module/xxx,路径不匹配就会被识别为所有文件都已变更。
内容的提问来源于stack exchange,提问作者Keisuke Nagakawa 永川 圭介

