git clone时出现fatal: could not fetch refs from的错误
在自建的git服务器上新建了一个空的git仓库, 当在windows客户端克隆这个空仓库时, 出现了下列错误:
$ git clone git@127.0.0.1:/srv/gitrep/develop_ln.git develop_ln
Cloning into 'develop_ln'...
The authenticity of host '[127.0.0.1]:22000 ([127.0.0.1]:22000)' can't be established.
ECDSA key fingerprint is SHA256:bsptoI7gQ6z9FSo+8ZS/Nl0BPoHwnHzhd7ph68+8yXg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:22000' (ECDSA) to the list of known hosts.
fatal: could not fetch refs from git@127.0.0.1:/srv/gitrep/develop_ln.git
通过ai搜索是因为空仓库不能直接被远程克隆, 需要往空仓库随便添加一点内容, 我就在git服务器上克隆并添加了一个读我文件, 然后再在windows平台上使用git克隆就顺利完成了.
现在还有一个问题, 为什么我在git服务器上可以克隆空仓库, 却在远程无法克隆, 继续搜索答案中, 等有结果了继续追加在本文中.
以下是从deepseek得到的答案, 基本回答我的疑问.
这个问题很典型,通常是空仓库缺少默认分支导致的。你在服务器本地克隆走的是文件协议,而远程克隆走的是SSH或HTTP等网络协议,两者对空仓库的处理方式不同。
核心原因:空仓库没有默认分支
一个刚用 git init --bare 创建的裸仓库,还没有任何分支和提交。当远程克隆时,Git客户端需要询问服务器“默认分支是什么?”,空仓库无法回答,就会报错“fatal: No matching remote head”或警告“You appear to have cloned an empty repository”。而本地克隆通常能直接处理这个情况。
其他可能原因
· 权限问题:远程克隆用的SSH公钥没添加到服务器,或仓库目录权限不足。 · 网络与防火墙:服务器防火墙阻止了SSH(22端口)或HTTP/HTTPS(443等)端口。 · 仓库路径错误:远程URL中的仓库路径写错了。 · SSH服务器配置:~/.ssh/authorized_keys 里的命令限制了访问,或配置了非标准路径。
解决方案
最简单有效的方法是先给空仓库创建一个初始提交,有了分支和HEAD引用,远程克隆就能正常工作了。
操作步骤:
-
在服务器本地,找一个临时目录,将裸仓库克隆下来:
git clone /path/to/your-repo.git temp-repo cd temp-repo -
创建一个初始文件并提交:
echo "# My Repository" > README.md git add README.md git commit -m "Initial commit" -
将更改推送回裸仓库:
git push origin main注意:新版本Git默认分支是 main,旧版可能是 master,请根据实际情况调整。
-
清理临时目录:
cd .. rm -rf temp-repo
完成以上步骤后,仓库就不再是空的了,远程客户端就可以正常克隆。
备用方案:手动设置 HEAD(不推荐)
如果因为某些原因不能创建提交,可以手动在裸仓库里设置HEAD指向一个不存在的分支:
cd /path/to/your-repo.git
git symbolic-ref HEAD refs/heads/main
但这只是“欺骗”客户端,克隆下来的仓库依然没有任何代码,之后推送时可能还会遇到问题,因此不推荐作为首选方案。
如果问题依旧,可以按这个顺序排查:先确认服务器防火墙是否放行,再检查SSH密钥和仓库目录权限。