Git push requires username and password
我从我的GitHub帐户克隆了一个Git存储库到我的PC。
我想同时使用我的个人电脑和笔记本电脑,但使用一个Github帐户。
当我试图用我的电脑推到GitHub或从GitHub拉到GitHub时,它需要用户名和密码,但在使用笔记本电脑时不需要!
我不想每次与源站交互时都输入用户名和密码。我这里缺少什么?
一个常见的错误是使用默认(https)而不是ssh进行克隆。您可以通过转到存储库,单击"克隆或下载",然后单击URL字段上方的"使用ssh"按钮,然后像这样更新源站远程的URL来更正此问题:
1 | git remote set-url origin [email protected]:username/repo.git |
这在Github上有记录:将远程URL从https切换到ssh。
永久验证Git存储库,
运行以下命令以启用凭据缓存:
1 2 3 4 5 | $ git config credential.helper store $ git push https://github.com/owner/repo.git Username for 'https://github.com': <USERNAME> Password for 'https://[email protected]': <PASSWORD> |
使用还应指定缓存过期,
1 | git config --global credential.helper 'cache --timeout 7200' |
启用凭据缓存后,将缓存7200秒(2小时)。
我刚刚遇到了同样的问题,我发现最简单的解决方案是使用ssh-url而不是https-one:
1 | ssh://[email protected]/username/repo.git |
而不是这样:
1 | https://github.com/username/repo.git |
现在您可以只使用
除了改为ssh,如果你不介意把密码放在明文中,你还可以继续使用https。把它放在你的
1 2 3 | machine github.com login <user> password <password> |
添加(参见VONC的第二条评论):在Windows上,文件名是
如果您想加密,还可以阅读VONC的第一条注释。
另一个添加项(参见用户137717的注释),如果您有Git 1.7.10或更高版本,则可以使用它。
使用凭据帮助器在Git中缓存GitHub密码:
If you're cloning GitHub repositories using HTTPS, you can use a
credential helper to tell Git to remember your GitHub username and
password every time it talks to GitHub.
这也适用于Linux、Mac和Windows。
对于那些对之前的答案感到困惑的未经启蒙的人,你可以这样做:
会有类似的反应
1 2 | origin https://[email protected]/yourname/yourrepo.git (fetch) origin https://[email protected]/yourname/yourrepo.git (push) |
然后你可以运行许多其他人建议的命令,但是现在你从上面知道了你的名字和你的位置,所以你可以从上面剪切粘贴到
1 | git remote set-url origin [email protected]:yourname/yourrepo.git |
如果您使用ssh,并且您的私钥使用密码短语加密,那么在使用诸如
如果您不想每次都输入您的密码,您可以使用
1 2 | $ eval `ssh-agent -s` $ ssh-add |
在windows msysgit bash中,您需要评估
完成终端会话后,可以使用kill标志
1 | $ ssh-agent -k |
如
1 -kKill the current agent (given by the SSH_AGENT_PID environment variable).
可选超时
此外,它还可以采用可选的超时参数,如:
1 | $ ssh-add -t <timeout> |
其中
根据
1 -t lifeSet a default value for the maximum lifetime of identities added
to the agent. The lifetime may be specified in seconds or in a
time format specified in sshd_config(5). A lifetime specified
for an identity with ssh-add(1) overrides this value. Without
this option the default maximum lifetime is forever.
有关更多时间格式,请参阅此页。
Cygwin用户的安全警告Cygwin用户应了解在Cygwin中使用ssh代理可能带来的安全风险:
people should be cognizant of the
potential dangers of ssh-agent under cygwin [1], though under a local
netstat and remote portscan it does not appear that the port specified in
/tmp/ssh-foo is accessible to anyone ...?
1 [1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html
在引用链接:
however, note that cygwin's unix domain sockets are FUNDAMENTALLY
INSECURE and so i strongly DISCOURAGE usage of ssh-agent under
cygwin.when you run ssh-agent under cygwin it creates AF_UNIX socket in
/tmp/ssh-$USERNAME/ directory. under cygwin AF_UNIX sockets are
emulated via AF_INET sockets. you can easily see that if you'll look
into/tmp/ssh-$USERNAME/agent-socket-* file via notepad. you'll see
the something like
1 !<socket >2080then run
netstat -a and surprise! you have some program listening to
port 2080. it's ssh-agent. when ssh receives RSA challenge from
server, it refers to corresponding/tmp/ssh-$USERNAME/agent-socket-*
(under cygwin, in our case, that means it'll open connection to
localhost:2080 ) and asks ssh-agent to process RSA challenge with
private key it has, and then it simply passes response received from
ssh-agent to server.under unix, such scenario works without problems, because unix kernel
checks permissions when program tries to access AF_UNIX socket. For
AF_INET sockets, however, connections are anonymous (read
"insecure"). Imagine, that you have cygwin ssh-agent running.
malicious hacker may portscan your box, locate open port used by
ssh-agent, open connection to your ssh server, receive RSA challenge
from it, send it to your ssh-agent via open port he found, receive RSA
response, send it to ssh server and voila, he successfully logged in
to your server as you.
来源:设置Git
下面的命令将您的密码保存在内存中一段时间。(适用于Git 1.7.10或更高版本。)
1 2 3 4 5 | $ git config --global credential.helper cache # Set git to use the credential memory cache $ git config --global credential.helper 'cache --timeout=3600' # Set the cache to timeout after 1 hour (setting is in seconds) |
当您使用https进行git pull&push时,只需为您的项目配置
如何配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Url format: https://{username:password@}github.com/{owner}/{repo} Parameters in url: * username optional, the username to use when need authentication, if specified, no need to enter username again when need authentication, don't use email, use your username that has no"@", otherwise the url can't be parsed correctly, * password optional, the password to use when need authentication, if specified, no need to enter password again when need authentication, tip: this value is stored as plain text, so for security concern, don't specify this param, * e.g git config remote.origin.url https://[email protected]/eric/myproject |
@更新-使用
我认为使用
粗略步骤:
- 使用命令创建ssh密钥,例如Linux上的
ssh-keygen ,Windowsmsysgit 上的ssh-keygen 提供类似的命令。 - 将本地计算机上的私钥保存在适当的位置,例如
~/.ssh 。并通过ssh-add 命令添加到ssh代理。 - 将公钥上载到Git服务器。
- 将git库的
remote.origin.url 改为ssh 样式,如[email protected]:myaccount/myrepo.git 。 - 然后拉或推时,不需要输入用户名或密码。
提示:
- 如果您的ssh密钥有一个密码短语,那么缺省情况下,您需要在每次重新启动计算机后首次使用该密钥时输入它。
@更新-在
只更改
通常我为每个协议添加一行,并使用
例如
1 2 3 4 | [remote"origin"] url = [email protected]:myaccount/myrepo.git # url = https://[email protected]/myaccount/myrepo.git fetch = +refs/heads/*:refs/remotes/origin/* |
您可以在git中缓存您的github密码:
只需遵循Github官方文档中的说明。
遵循上述链接的说明后,您应该能够在每次不输入用户名/密码的情况下推/拉到/从您的repo。
对我有用的是编辑
1 2 | [remote"origin"] url = https://<login>:<password>@gitlab.com(...).git |
不言而喻,这是一种不安全的密码存储方式,但在某些环境/情况下,这可能不是问题。
还有一个选择:
而不是写作
1 | git push origin HEAD |
你可以写:
1 | git push https://user:[email protected]/path HEAD |
显然,对于大多数shell,这将导致密码被缓存在历史记录中,因此请记住这一点。
更新https:
GitHub已经启动了一个新的Windows程序,在使用HTTPS时存储您的凭据:
使用:
从这里下载程序
运行程序后,它将编辑您的
1 2 | [credential] helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe' |
注意
打开您的命令行客户机,尝试一次
你基本上有两个选择。
如果在两台计算机上使用同一个用户,则需要将.pub密钥复制到您的PC上,因此Github知道您是同一个用户。
如果您已经为您的PC创建了一个新的.pub文件,并且希望将这些计算机视为不同的用户,则需要在Github网站上注册新的.pub文件。
如果这仍然不起作用,可能是因为ssh配置不正确,并且ssh找不到密钥的位置。尝试
1 | ssh -vv [email protected] |
获取有关SSH失败原因的更多信息。
我也有同样的问题。
所以从我的项目更改.git/config文件
1 | url = https://github.com/<your-user-here>/<your-repo-here> |
到
1 | url = [email protected]:<your-user-here>/<your-repo-here> |
并将ssh公钥添加到设置中的git概要文件中。
对于ssh公钥
1 | cat ~/.ssh/id_rsa.pub |
对于Windows Git用户,在运行
在我的例子中,手动编辑配置文件"c:program filesgitmingw64etcgit config",添加以下文本,它可以工作。
helper = store
直接更新Git配置文件:(如果不想记住花哨的命令)
在您最喜欢的文本编辑器中打开您的
这里是
1 2 3 4 5 6 7 8 | [user] name = Tux email = [email protected] username = happy_feet [remote"origin"] url = https://github.com/happy_feet/my_code.git fetch = +refs/heads/*:refs/remotes/origin/* |
使用以下格式更改ssh的url部分
1 | url = [email protected]:happy_feet/my_code.git |
(上述格式不会随各种Git远程服务器(如GitHub或BitBucket)而更改,如果您使用Git进行版本控制,则相同):
注意:连接到远程Git存储库的ssh方式将要求您将公共ssh密钥添加到Git远程服务器(如GitHub或BitBucket,在设置页面搜索ssh密钥)
要了解如何生成ssh密钥,请参阅:https://confluence.atlassian.com/bitbacketserver/creating-ssh-keys-776639788.html
您需要执行两个步骤-
1 2 | 1) git remote remove origin 2) git remote add origin [email protected]:NuggetAI/nugget.git |
注意,git url是
这就是我的工作:
1 | git remote set-url origin https://[email protected]/username/reponame.git |
例子:
1 | git remote set-url origin https://[email protected]/jsmith/master.git |
正如许多用户所说,您只需将git存储库URL从https更改为ssh。
如果您还没有在您的机器中生成ssh密钥,那么您将不得不这样做。
作为附加信息,在做了这个更改之后,我仍然得到相同的错误:权限被拒绝。
在我的例子中,问题是我使用Windows Shell执行ngh命令;因为这个命令应该打开一个提示来请求ssh短语,而Windows Shell没有打开这种提示,所以身份验证失败。
所以,我只需要打开git shell并在那里执行ngh命令,在每次请求时都将ssh短语放在提示符中,然后"voil_"…它工作得很好!
如果ssh密钥或.netrc对您不起作用,那么另一个简单但安全性较低的解决方案是git credential store-helper将凭据存储在磁盘上。
1 | git config --global credential.helper store |
默认情况下,凭证将保存在
请注意,使用此帮助程序会将您的密码未加密存储在磁盘上,仅受文件系统权限保护。如果这可能不是一个可接受的安全权衡。
如果您在Windows下使用Git(例如Git bash)(如果不想从https切换到ssh)
您还可以使用https://github.com/microsoft/git-credential-manager-for-windows
此应用程序将为您保留用户名和密码…