git daemon配置--base-path不生效 克隆Git仓库路径异常问题
故障根本原因
核心问题是你混淆了两种Git传输协议的生效逻辑:
- 你使用的
git@myserver.com:path/to/repo.git克隆格式,走的是SSH传输通道,全程和你启动的git daemon服务没有任何关系,你配置的--base-path参数仅对Git协议(即git://开头的克隆地址,默认走9418端口)生效,对SSH传输的路径解析完全不起作用。 - SSH传输克隆时,冒号后写的相对路径,默认会以登录用户(此处为git用户)的家目录
/home/git作为根目录解析:- 你写
gns/api.git时,服务端实际查找的路径是/home/git/gns/api.git,该路径不存在,因此报仓库不存在的错误。 - 你写
data/gns/api.git时,服务端实际查找的路径是/home/git/data/gns/api.git,和你创建裸仓库的路径完全匹配,因此可以正常克隆。
- 你写
实现短路径克隆的配置方案
根据你使用的传输协议,二选一配置即可:
方案1:继续使用SSH传输(个人仓库推荐,自带权限控制、传输加密)
不需要调整git daemon配置,直接修改git用户的家目录为你的仓库根目录即可:
- 先确认仓库目录权限归属正确,执行命令:
chown -R git:git /home/git/data - 修改git用户的默认家目录,执行命令:
usermod -d /home/git/data git
配置完成后,SSH登录git用户时的默认工作目录就是/home/git/data,此时直接执行git clone git@myserver.com:gns/api.git即可正常克隆,不需要额外拼接data/前缀。
方案2:使用git daemon提供的Git协议(仅适合公开无权限的开源仓库)
你当前的git daemon启动命令配置本身没有问题,--base-path=/home/git/data/参数已经正常生效,但需要使用Git协议格式的地址克隆,而不是SSH格式:
git clone git://myserver.com/gns/api.git
注意该方案默认不支持推送操作,且需要放开服务器防火墙的9418端口入站规则,传输过程无加密,不适合存放私有个人仓库。
补充说明
很多人初次部署Git服务时会误以为git daemon是所有Git传输的后台服务,实际上git daemon仅负责处理原生Git协议的请求,SSH、HTTP/HTTPS等其他传输协议的路径、权限配置完全独立,和git daemon的参数互不干扰。
内容的提问来源于stack exchange,提问作者Pierre Cardin
相关产品推荐
相关产品推荐

