我正在尝试连接到驻留在我的web服务器上的远程Git存储库,并将其克隆到我的机器上。

我使用以下格式的命令:

git clone ssh://username@domain.example/repository.git

这对我的大多数团队成员来说都很有效。通常运行此命令后Git会提示输入用户密码,然后运行克隆。然而,当在我的机器上运行时,我得到以下错误:

主机密钥验证失败。 致命的:无法从远程读取 存储库。

我们没有使用SSH密钥连接到这个存储库,所以我不确定Git为什么要在这台特定的机器上检查SSH密钥。


当前回答

在构建期间,我在DockerFile内部也遇到了同样的错误,而映像是公共的。我在Dockerfile中做了一些修改。

 RUN git clone  https://github.com/kacole2/express-node-mongo-skeleton.git /www/nodejs

这是因为使用git@github.com:…语法最终使用SSH克隆为>,并且在容器中,您的私钥不可用>。你应该使用RUN git克隆> https://github.com/edenhill/librdkafka.git。

其他回答

当远程服务器想要连接到私有回购时,它将通过ssh进行身份验证。 使用ssh-keygen创建公私密钥对(如果您已经拥有公私密钥)。在私有回购的设置中复制并粘贴公钥。

YourPrivateRepo -> Settings ->部署密钥->添加部署密钥->粘贴公钥。

现在远程服务器将能够连接到私有回购。

注意:部署键仅具有读取repo的访问权限。需要显式地允许写访问。

对我来说有用的是首先添加我的新计算机的SSH密钥,我遵循GitLab的这些说明-添加SSH密钥。注意,因为我在Win10上,我必须在Windows上的Git Bash中执行所有这些命令(它在常规DOS cmd Shell中不起作用)。

然后再次在Git Bash中,我必须对我有问题的回购做一个Git克隆,在我的情况下,我必须将它克隆到一个不同的名称,因为我已经在本地拥有它,不想失去我的提交。例如

git clone ssh://git@gitServerUrl/myRepo.git myRepo2

然后我得到了将其添加到已知主机列表的提示,问题可能是这样的:

您确定要继续连接(是/否)?

我输入了“yes”,它最终工作了,你通常会得到类似这样的消息:

警告:永久添加'[您的回购链接]' (ECDSA)到已知主机列表。

注意:如果你是在Windows上,确保你使用Git Bash来执行所有命令,这在常规的cmd shell或powershell中不起作用,我真的不得不在Git Bash中这样做。

最后,我删除了第二个克隆repo (myRepo2在例子中),回到我的第一个repo,我终于可以在我最喜欢的编辑器VSCode中做所有Git的东西。

这里提到的解决方案很好,唯一缺少的一点是,如果您的公钥和私钥文件名与默认文件名不同怎么办?

在~/下创建一个名为“config”的文件。SSH并添加以下内容

Host github.com
    IdentityFile ~/.ssh/github_id_rsa

将github_id_rsa替换为您的私钥文件。

如果你正在使用git for Windows。

打开git GUI。 在git GUI中打开本地git存储库。 添加远程或推送(如果远程已经存在)。 对于你是否想继续的问题,回答“是”。

GUI客户端为您将密钥添加到~/.ssh/known_hosts。如果你不经常这样做,这更容易记住,也避免了使用git命令行(标准的Windows命令行没有ssh-keyscan可执行文件)。

还要检查known_hosts文件的权限——包括用户的(~/.ssh/known_hosts)和全局的(/etc/ssh/ssh_known_hosts)。

在我的例子中,旧主机在/etc/ssh/ssh_known_hosts中。当我用sudo ssh-keygen -f /etc/ssh/ssh_known_hosts -R THE_HOST将其作为根删除时,它将该文件的权限更改为0600,因此SSHing到THE_HOST作为根工作,但对于任何其他用户来说,它失败了“主机密钥验证失败”。解决方案是:

sudo chmod 644 /etc/ssh/ssh_known_hosts