我在使用 Git 时遇到了一个非常特殊的问题。我在 Gitlab 服务器上有一个存储库,我通常在办公室的工作计算机(运行 Ubuntu)上处理它。在那里,我设置了私钥/公钥,一切正常。
现在奇怪的是,当我从家里 ssh 进入我的工作计算机并执行拉取、推送或任何其他需要连接到 Gitlab 服务器的 Git 命令时,我收到一个错误,说我的公钥错误。
$ git push
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
根据我的理解,如果我 ssh 进入我的工作计算机并在 shell 中执行命令,那么应该就像我直接坐在该计算机前运行相同的命令,不是吗?
有人知道为什么会出错吗?欢迎任何想法!
Ssh 是或者可以是相当复杂和花哨的。如果您使用 ssh 代理,请记住代理将提供密钥,除非它不提供密钥。1 如果您不使用代理,ssh 配置将始终提供密钥。
使用
ssh-add -l
查看代理可以看到的密钥。检查您的 ~/.ssh/config
文件以查看您告诉 ssh 发送哪些密钥。如果需要,可以使用 ssh -v
或多个 -v
选项(尽管通常一个就足够了),以观察 ssh 客户端实际上正在尝试哪些密钥:
ssh -Tv [email protected]
例如,显示我的 ssh 客户端向 github.com 提供我个人的 GitHub 特定 RSA 密钥。
在 Git-for-Windows 上(此处不是这种情况,但让我们将其包括在内以供其他查看者使用),在确保
ssh -Tv ...
有效后,请确保 Git 使用 Windows 原生 ssh。请参阅Flimm 的回答到如何使用 SSH 详细模式运行 git Push/pull 命令?如评论中提到的kiner_shah。
1我意识到这本身没什么帮助。这里的问题是“不”可能有很多原因。这就是
-v
技巧派上用场的地方。请注意,配置中的 IdentitiesOnly yes
意味着仅使用配置中 中列出的身份,尽管 -i
选项无论如何都会添加。
如果这对于任何遇到此问题的人来说仍然是一个问题,这对我有用:我使用下面的
git config
命令将以下设置添加到我的 .gitconfig 文件中:
git config --global core.sshcommand "ssh -i /path/to/your/private/key
因此,你的 git 配置文件应该包含如下内容:
[core]
pager = cat
sshCommand = ssh -i /path/to/your/private/key
运行
git config --list --global
应该包括这样的内容:
core.sshcommand=ssh -i /path/to/your/private/key