使用 SSH 密钥进行 git 身份验证然后使用 HTTP 进行克隆时会发生什么情况?

What happens when using an SSH key for git authentication then HTTP for clone?

可能是我从根本上误解了一些东西,但是当我执行以下操作时,网络协议和身份验证方面发生了什么:

在 git 客户端和服务器(例如 Bitbucket)中添加 SSH 密钥对,然后 git clone http://example.git

因此,您根本没有使用 ssh 密钥,要使用 ssh 密钥,您需要传递用户名。

如果您在默认目录中没有任何 ssh 密钥,在这种情况下它可能是 ~/.ssh/id_rsa.

然后你的客户端会和public键一起校验,如果匹配,就让你克隆。

为了使用 ssh,您需要做 username@whatever.whatever:/whatever/whatever.git.。 whatever.whatever 是指向 ip 地址的域名。这就是使用 SSH。并将查找 SSH 密钥。

您可以使用 SSH 或 HTTP 克隆和推送 - 只要服务器支持(Bitbucket 都支持)。

SSH 密钥仅用于 SSH 身份验证

Git 可以使用不同的协议。本地文件、ssh、http(s)(智能或非智能)和 git 协议。您选择的协议由您选择URL。

每个协议都使用自己的身份验证方法,或者根本 none。 ssh 密钥仅在您使用 ssh 协议时使用。如果您使用 http.

则不会

https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols

这取决于您用来与远程存储库通信的url。

通过git clone http://example.git,url是http://example.git,所以使用了http协议和认证。 git clone 中使用的 url 将存储为默认远程 origin 的值。命令 git remote 可以创建、删除、编辑和列出遥控器,包括 origin。一个remote有两个值,一个push,一个fetch,但大多数情况下两者是一样的

在需要url的场合,例如git fetchgit pushgit ls-remote,存储了url的遥控器即可使用。它更短,更容易记住。如果没有remote存储url,那么你需要创建一个然后使用它,或者直接使用url。在克隆的存储库中,git pull origin master 等同于 git pull http://example.git master.

只要远程仓库允许,您可以使用其他协议。在克隆的存储库中,如果 ssh url 是 ssh://$username@$host:29418/example.git,那么您可以 运行 git remote add sshori ssh://$username@$host:29418/example.git 创建一个新的远程 sshori。现在git pull sshori master等同于git pull ssh://$username@$host:29418/example.git master,并且使用了ssh协议和认证。同时现有的origin免费使用。在实际情况下,通常使用不同的远程在本地存储库和不同的多个远程存储库之间建立隧道。