Gitolite主节点git push报错:FATAL: <host>: '<repo>' is local
Gitolite主节点本地推送gitolite-admin报错“FATAL: gitmaster: 'gitolite-admin' is local”的解决方法
问题场景
在主节点gitmaster上以服务用户gituser身份克隆gitolite-admin仓库、编辑后执行git push时,触发如下报错:
$ git push FATAL: gitmaster: 'gitolite-admin' is local fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
其他客户端系统的用户执行相同操作可正常推送,实例采用主节点gitmaster+远程从节点gitslave架构,Gitolite已默认开启镜像模式。
原因分析
- 镜像模式的本地推送拦截:Gitolite镜像模块会对来自配置的主节点(
mirror.master=gitmaster)的推送请求进行校验,当推送目标是主节点本地仓库时,为避免循环推送、镜像逻辑冲突,会直接拦截请求。 - 请求身份识别:从Gitolite日志条目
mirror,pre_git,gitolite-admin,user=,sender=gitmaster,mode=local可看出,推送请求的发送方被识别为主节点gitmaster,且模式标记为local,触发了镜像模块的拦截规则。
解决方案
方案1:直接操作本地仓库路径(推荐)
由于gitolite-admin.git仓库本身就在主节点的/home/gituser/repositories目录下,无需通过SSH远程推送,直接操作本地仓库即可:
- 若已克隆仓库,修改remote地址为本地路径:
git remote set-url origin /home/gituser/repositories/gitolite-admin.git # 或使用file协议格式 git remote set-url origin file:///home/gituser/repositories/gitolite-admin.git
- 后续执行
git push即可完成推送,此方式绕过SSH和Gitolite镜像检查逻辑,直接操作本地仓库,同时Gitolite会自动触发镜像同步到从节点gitslave。
方案2:临时调整Gitolite镜像配置(谨慎使用)
若必须通过SSH推送,可临时修改gitolite.conf中gitolite-admin仓库的镜像配置,推送完成后再恢复:
repo gitolite-admin RW+ = @admins # 临时注释镜像配置 # option mirror.master = gitmaster # option mirror.slaves = gitslave
推送完成后,立即恢复原有镜像配置,确保从节点能正常同步仓库内容。
方案3:修改SSH连接目标
避免使用.ssh/config中定义的gitmaster别名,改用localhost或127.0.0.1作为推送目标,让Gitolite识别为本地用户推送而非镜像主节点请求:
git remote set-url origin gituser@localhost:gitolite-admin # 或 git remote set-url origin gituser@127.0.0.1:gitolite-admin
需确保gituser的SSH密钥能正常连接localhost,且Gitolite不会将localhost识别为配置的master节点。
验证操作
修改remote配置后执行git push,检查推送是否成功,同时查看Gitolite日志确认镜像同步到从节点gitslave。
内容的提问来源于stack exchange,提问作者user25299556
相关产品推荐
相关产品推荐

