git clone时出现fatal: could not fetch refs from的错误

Author: laowang - Posted:13小时前 - View:29

在自建的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引用,远程克隆就能正常工作了。

操作步骤:

  1. 在服务器本地,找一个临时目录,将裸仓库克隆下来:

    git clone /path/to/your-repo.git temp-repo
    cd temp-repo
  2. 创建一个初始文件并提交:

    echo "# My Repository" > README.md
    git add README.md
    git commit -m "Initial commit"
  3. 将更改推送回裸仓库:

    git push origin main

    注意:新版本Git默认分支是 main,旧版可能是 master,请根据实际情况调整。

  4. 清理临时目录:

    cd ..
    rm -rf temp-repo

完成以上步骤后,仓库就不再是空的了,远程客户端就可以正常克隆。

备用方案:手动设置 HEAD(不推荐)

如果因为某些原因不能创建提交,可以手动在裸仓库里设置HEAD指向一个不存在的分支:

cd /path/to/your-repo.git
git symbolic-ref HEAD refs/heads/main

但这只是“欺骗”客户端,克隆下来的仓库依然没有任何代码,之后推送时可能还会遇到问题,因此不推荐作为首选方案。

如果问题依旧,可以按这个顺序排查:先确认服务器防火墙是否放行,再检查SSH密钥和仓库目录权限。

0 人点赞  ∙  0 人收藏  
加入收藏 点赞 我要评论
目前尚无回复