使用ssh密钥无需密码将代码推送到GitHub

364
我生成了一对不带密码的SSH密钥,并将公钥添加到GitHub。
连接方式:
user@dev:/var/www/project# ssh -T git@github.com
Hi User! You've successfully authenticated, but GitHub does not provide shell access.

当我更改密钥名称后,它会失败。但是当我想要推送我的更改时,它仍然要求输入用户名和密码组合。

有没有一种方式可以在不需要密码的情况下进行推送?


13
请确保您在远程操作中不使用 https://github... 的格式,应该使用 git@github... 的格式。 - cjc343
1
关于远程仓库,有两种类型:1. 类似于“https://github.com/user/repo.git”的HTTP协议;2. 类似于“git@github.com:user/repo.git”的SSH协议。 - Carson
9个回答

718

如果它要求您输入用户名和密码,则您的源远程指向的是 HTTPS URL 而不是 SSH URL。

将其更改为 ssh。

例如,像 Git 这样的 GitHub 项目将具有 HTTPS URL:

https://github.com/<Username>/<Project>.git

还有SSH:

git@github.com:<Username>/<Project>.git

您可以执行以下操作:

git remote set-url origin git@github.com:<Username>/<Project>.git

更改URL。


8
这解决了问题,不过我一直在问自己,为什么Github会建议你默认将新存储库的远程端点指向http URL。我刚刚从头创建了一个存储库,并提供了设置https远程URL而不是git的选项。 - Preslav Rachev
16
这是一个快速的单行shell命令,它会自动将您的https url更改为适当的git url(仅适用于github url):git remote set-url origin $(git remote show origin | grep“Fetch URL” | sed's / * Fetch URL://'| sed's / https:\/\/github.com\//git@github.com:/') - Christopher Shroba
这个程序能够适用于多个 githubbitbucket 仓库和多个账户吗?它们之间会有冲突吗? - Danish Mehmood

33

如果您确实使用SSH URL,但在推送时仍被要求输入用户名和密码:

git remote set-url origin git@github.com:<Username>/<Project>.git

你应该尝试以下故障排除:

ssh -vT git@github.com

下面是一个示例输出:

...
debug1: Trying private key: /c/Users/Yuci/.ssh/id_rsa
debug1: Trying private key: /c/Users/Yuci/.ssh/id_dsa
debug1: Trying private key: /c/Users/Yuci/.ssh/id_ecdsa
debug1: Trying private key: /c/Users/Yuci/.ssh/id_ed25519
debug1: No more authentication methods to try.
Permission denied (publickey).

事实上,我之前已经将公钥添加到GitHub中,并且我也在本地拥有私钥。然而,我的私钥的名称不同,叫做/c/Users/Yuci/.ssh/github_rsa

根据样本输出,Git 正在尝试使用/c/Users/Yuci/.ssh/id_rsa,而我没有这个文件。因此,我可以简单地将github_rsa复制到同一个目录中的id_rsa

cp /c/Users/Yuci/.ssh/github_rsa /c/Users/Yuci/.ssh/id_rsa

现在,当我再次运行ssh -vT git@github.com时,我看到:

...
debug1: Trying private key: /c/Users/Yuci/.ssh/id_rsa
debug1: Authentication succeeded (publickey).
...
Hi <my username>! You've successfully authenticated, but GitHub does not provide shell access.
...

现在我可以向 GitHub 推送代码而不需要输入用户名和密码 :-)


为什么还有人想用其他方式进行身份验证呢?太喜欢这个了,谢谢! - cregox
你可能不需要将密钥复制到其他名称,而是可以使用类似 ssh-add 'C:\Users\Yuci\.ssh\github_rsa' 的命令。 - WBT

19

通常情况下,创建一个SSH密钥并将公钥粘贴到GitHub上。将私钥添加到ssh-agent中。(我假设你已经这样做了。)

为了检查一切是否正确,请使用ssh -T git@github.com

接下来,不要忘记按以下方式修改远程指针:

git remote set-url origin git@github.com:username/your-repository.git

16

另外,对于代码片段来说,似乎必须省略用户名。

git remote set-url origin git@gist.github.com:<Project code>

10
你需要使用SSH版本,而不是HTTPS。当你从仓库克隆时,请复制带有SSH版本的链接,因为SSH易于使用且解决了访问问题。您可以为每个输入到您的帐户中的SSH设置访问权限(如push、pull、clone等)。
下面是一个链接,它说明了我们为什么需要SSH以及如何使用:逐步生成Git SSH密钥

5

如果要使用SSH,请使用$ git remote add origin git@github.com:USERNAME/REPOSITORY.git代替git remote add origin remote_repository_URL。 您可以使用$ git remote -v检查,如果您看到以下格式的2行内容,则工作将正常:

origin git@github.com:username/repo-name.git (fetch)
origin git@github.com:username/repo-name.git (push)

4
与其他用户提到的一样,您必须将其从使用HTTPS转换为SSH。我没有看到一个端到端解决方案的答案。在设置ssh密钥之后,在本地机器上执行以下操作:
$ git remote set-url origin git@github.com:username/your_repo.git  # Convert HTTPS -> SSH
$ ssh-add ~/.ssh/id_rsa_github    # add private github ssh key ssh-agent (assuming you have it already running)
$ git push

2

您已经做得很好,但是Git仍然要求输入密码,对我来说这个方法有效,在当前项目路径下执行以下命令:

~ ssh-add -K ~/.ssh/id_rsaYourIdRsa

将您的SSH私钥添加到ssh-agent,并将您的密码短语存储在密钥链中。如果您使用不同名称创建了密钥,或者如果您正在添加具有不同名称的现有密钥,请在命令中用您的私有密钥文件的名称替换id_rsaYourIdRsa。


-5

使用命令行:

输入ls -al ~/.ssh查看是否存在现有的SSH密钥。

终端显示:目录不存在

然后生成新的SSH密钥

步骤1。

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

步骤2。

Enter a file in which to save the key (/Users/you/.ssh/id_rsa): <here is file name and enter the key>

步骤三。

Enter passphrase (empty for no passphrase): [Type a password]

Enter same passphrase again: [Type password again]

1
抱歉,这个问题不是关于如何创建密钥,而是设置Git使用密钥而不是身份验证。 - Sebus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接