我从我的GitHub帐户克隆了一个Git存储库到我的电脑。
我想使用我的电脑和笔记本电脑,但只有一个GitHub帐户。
当我尝试使用我的电脑推送到GitHub或从GitHub中拉取时,它需要用户名和密码,但当我使用笔记本电脑时不需要!
我不想每次与origin交互时都键入用户名和密码。我在这里缺少什么?
我从我的GitHub帐户克隆了一个Git存储库到我的电脑。
我想使用我的电脑和笔记本电脑,但只有一个GitHub帐户。
当我尝试使用我的电脑推送到GitHub或从GitHub中拉取时,它需要用户名和密码,但当我使用笔记本电脑时不需要!
我不想每次与origin交互时都键入用户名和密码。我在这里缺少什么?
当前回答
正如许多用户所说,您只需将Git存储库URL从HTTPS更改为SSH即可。
如果您尚未在计算机中生成SSH密钥,那么您将不得不执行此操作。
作为补充信息,在进行此更改后,我仍然收到相同的错误:
权限被拒绝。
在我的案例中,问题是我使用的是Windows Shell来执行ngh命令;由于该命令应打开一个提示以请求SSH短语,而Windows Shell没有打开这些提示,因此身份验证失败。
所以,我只需要打开Gitshell并在那里执行ngh命令,每次它请求时都在提示符中输入SSH短语,然后“voilà”。。。它工作得很好!
其他回答
这就是对我有用的:
git remote set-url origin https://username@github.com/username/reponame.git
例子:
git remote set-url origin https://jsmith@github.com/jsmith/master.git
我也有同样的问题。
所以我从项目中更改了.git/config文件,
url = https://github.com/<your-user-here>/<your-repo-here>
to
url = git@github.com:<your-user-here>/<your-repo-here>
并将SSH公钥添加到正在设置的Git配置文件中。
对于SSH公钥:
cat ~/.ssh/id_rsa.pub
直接更新Git配置文件(如果不想记住花哨的命令):
在您喜爱的文本编辑器中打开.git/config文件。它将在您克隆的文件夹中或执行git init的存储库中。进入该存储库。git是一个隐藏的文件夹,按Ctrl+H应该会显示隐藏的文件夹(终端中的ls-a)。
下面是.git/config文件的示例。复制并粘贴这些行,并确保使用Git信息更新这些行。
[user]
name = Tux
email = tux@gmail.com
username = happy_feet
[remote "origin"]
url = https://github.com/happy_feet/my_code.git
fetch = +refs/heads/*:refs/remotes/origin/*
将SSH的URL部分更改为以下格式:
url = git@github.com:happy_feet/my_code.git
(以上格式不会随GitHub或Bitbucket等各种Git远程服务器而改变。如果您使用Git进行版本控制,则相同):
注意:连接到远程Git存储库的SSH方式将要求您将公共SSH密钥添加到Git远程服务器(如GitHub或Bitbucket。在设置页面搜索SSH密钥)。
要了解如何生成SSH密钥,请参阅:创建SSH密钥
如果您使用的是SSH,并且您的私钥是用密码短语加密的,那么在使用Git进行推送、拉取等网络操作时,仍会提示您输入私钥的密码短语/密码。
使用ssh代理保存私钥密码/密码凭据
如果您想避免每次都输入密码,可以使用ssh代理在每个终端会话中存储一次私钥密码凭据,正如我在回答“无法打开与身份验证代理的连接”时所解释的:
$ eval `ssh-agent -s`
$ ssh-add
在WindowsmsysgitBash中,您需要评估ssh代理的输出,但我不确定是否需要在其他开发环境和操作系统中执行同样的操作。
ssh-add在您的home.ssh文件夹中查找名为idrsa的私钥,这是默认名称,但您可以将文件路径传递给具有不同名称的密钥。
杀死特工
完成终端会话后,可以使用kill标志-k关闭ssh代理:
$ ssh-agent -k
如ssh代理手册中所述:
-克终止当前代理(由SSH_agent_PID环境变量给定)。
可选超时
此外,它可以采用一个可选的超时参数,如下所示:
$ ssh-add -t <timeout>
其中<timeout>的格式为<n>h表示<n>小时,<n>m表示<n<分钟,依此类推。
根据ssh代理手册:
-t寿命设置添加到代理的标识的最大生存期的默认值。可以以秒或sshdconfig(5)中指定的时间格式。使用ssh-add(1)为标识指定的生存期将覆盖此值。如果没有此选项,默认的最长生存期为永久。
有关更多时间格式,请参阅本页。
Cygwin用户的安全警告
Cygwin用户应该意识到在Cygwin中使用ssh代理存在潜在的安全风险:
人们应该认识到Cygwin 1下ssh代理的潜在危险,尽管在本地netstat和远程portscan下,似乎任何人都无法访问/tmp/ssh-foo中指定的端口。。。?[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html
在引用的链接中:
然而,请注意Cygwin的Unix域套接字是基本上不安全的,因此我强烈发现Cygwin下ssh代理的使用。当您在Cygwin下运行ssh代理时,它会在/tmp/ssh-$USERNAME/目录中创建AF_UNIX套接字。在Cygwin下,AF_UNIX套接字通过AF_INET套接字进行模拟。如果您通过记事本查看/tmp/ssh-$USERNAME/agent-socket-*文件,您可以很容易地看到这一点。你会看到类似的东西!<插座>2080然后运行netstat-a并惊喜!您有一些程序正在侦听端口2080。这是ssh代理。当ssh从服务器接收到RSA质询时,它会引用相应的/tmp/ssh-$USERNAME/agent socket-*(在本例中是在Cygwin下,这意味着它将打开到localhost:2080的连接),并要求ssh代理使用其拥有的私钥来处理RSA质询,然后简单地将从ssh代理接收到的响应传递给服务器。在Unix下,这样的场景运行起来没有问题,因为当程序试图访问AF_Unix套接字时,Unix内核会检查权限。然而,对于AF_INET套接字,连接是匿名的(读取“不安全”)。想象一下,您正在运行Cygwin ssh代理。恶意黑客可能会对您的设备进行端口扫描,找到ssh代理使用的开放端口,打开与ssh服务器的连接,从中接收RSA质询,通过他/她找到的开放端口将其发送给ssh代理,接收RSA响应,将其发送到ssh服务器,瞧,他/她成功地以您的身份登录到您的服务器。
对于Windows Git用户,在运行Git-config--globalcredential.helper store后,如果仍然提示输入密码,最好使用以下命令检查配置文件的写入位置
git config --list --show-origin
在我的例子中,在手动编辑配置文件“C:\Program Files\Git\mingw64\etc\gitconfig”并添加以下文本后,它就工作了。
[credential]
helper = store