Git推送需要用户名和密码
我从我的Github账号克隆了一个git仓库到我的电脑。
我想用我的个人电脑和笔记本电脑,但有一个Github帐户。
当我尝试使用我的电脑推送或从Github拉,它需要用户名和密码,但不是当使用笔记本电脑!
每次我与原始网站互动时,我都不想input用户名和密码。 我在这里错过了什么?
常见的错误是使用默认(HTTPS)而不是SSH进行克隆。 您可以通过转到您的存储库,点击左侧的sshbutton来更正这个URL,并像下面这样更新您的原始远程URL:
git remote set-url origin git@github.com:username/repo.git
我刚刚遇到同样的问题,我发现最简单的解决scheme是使用SSH URL而不是HTTPS:
ssh://git@github.com/username/repo.git
而不是这个:
https://github.com/username/repo.git
您现在可以使用SSH Key
而不是username
和password
。
除了更改为SSH之外,如果您不介意以明文formsinput密码,还可以继续使用HTTPS。 把它放在你的~/.netrc
,它不会要求你的用户名/密码(至less在Linux和Mac上):
machine github.com login <user> password <password>
另外 (见VonC的第二个评论):在Windows上,文件名是%HOME%\_netrc
。
如果您想encryption,请阅读VonC的第一条评论。
另一个补充 (见user137717的评论),你可以使用,如果你有git 1.7.10或更新 。
使用凭证助手在git中caching你的github密码 :
如果您使用HTTPS克隆GitHub存储库,则可以使用凭证助手来告诉Git在每次与GitHub进行通信时记住您的GitHub用户名和密码。
这也适用于Linux,Mac和Windows。
使用Git存储库进行永久身份validation,
运行以下命令启用凭证caching :
$ git config credential.helper store $ git push https://github.com/repo.git Username for 'https://github.com': <USERNAME> Password for 'https://USERNAME@github.com': <PASSWORD>
使用时还应该指定caching过期 ,
git config --global credential.helper 'cache --timeout 7200'
启用凭证caching后,它将被caching7200秒(2小时) 。
对于以前的答案感到困惑的外行人,你可以这样做:
git remote -v
这将回应类似的东西
origin https://yourname@github.com/yourname/yourrepo.git (fetch) origin https://yourname@github.com/yourname/yourrepo.git (push)
那么你可以运行许多其他build议的命令,但是现在你从上面知道你的名字和yourrepo,所以你可以从上面剪切和粘贴yourname/yourrepo.git
到
git remote set-url origin git@github.com:yourname/yourrepo.git
如果您使用ssh并且您的私钥使用密码进行encryption,那么当您使用Git(如push
, pull
和fetch
执行networking操作时 , 仍会提示您input私钥的密码/密码 。
使用ssh-agent保存私钥密码/密码凭证
如果您想避免每次都input密码,您可以使用ssh-agent
在每个terminal会话中存储您的私钥密码凭据一次,正如我在答案中所解释的: 无法打开与身份validation代理的连接 :
$ eval `ssh-agent -s` $ ssh-add
在Windows msysgit Bash中,您需要评估ssh-agent
的输出,但我不确定是否需要在其他开发环境和操作系统中执行相同的操作。
ssh-add
在您的home .ssh
文件夹中查找名为id_rsa
,这是默认名称,但您可以将文件path传递给名称不同的密钥。
杀死代理
当您完成terminal会话时,可以使用kill标志closuresssh-agent
-k
:
$ ssh-agent -k
正如在ssh-agent
手册中所解释的:
-k
杀死当前的代理(由SSH_AGENT_PID环境variables给出)。
可选超时
此外,它可以采取一个可选的超时参数,如下所示:
$ ssh-add -t <timeout>
其中<timeout>
格式为<n>h
<n>
小时, <n>m
为<n>
分钟,依此类推。
根据ssh-agent
手册 :
-t life
为添加到代理的身份的最长生命周期设置默认值。 生命周期可以以秒或以sshd_config(5)中指定的时间格式指定。 使用ssh-add(1)指定的生命周期将覆盖此值。 没有这个选项,默认的最大生命期是永远的。
看到这个页面更多的时间格式 。
Cygwin用户的安全警告
Cygwin用户应该注意在Cygwin中使用ssh-agent的潜在安全风险 :
人们应该认识到cygwin下的ssh-agent潜在的危险,尽pipe在本地netstat和远程端口扫描下,并没有出现/ tmp / ssh-foo中指定的端口可以被任何人访问…?
[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html
并在引用的链接 :
不过,请注意,cygwin的unix域套接字是基本的 INSECURE ,所以我强烈推荐在cygwin下使用ssh-agent。
当你在cygwin下运行ssh-agent时,它会在
/tmp/ssh-$USERNAME/
目录下创buildAF_UNIX套接字。 在cygwin下AF_UNIX套接字通过AF_INET套接字仿真。 你可以很容易地看到,如果你通过记事本查看/tmp/ssh-$USERNAME/agent-socket-*
文件。 你会看到类似的东西!<socket >2080
然后运行
netstat -a
并且感到惊讶! 你有一些程序监听端口2080.这是ssh-agent。 当ssh接收到来自服务器的RSA挑战时,它指的是相应的/tmp/ssh-$USERNAME/agent-socket-*
(在我们的例子中,这意味着它将打开连接到localhost:2080
)并询问ssh-agent使用私钥处理RSA挑战,然后将从ssh-agent收到的响应传递给服务器。在unix下,这种情况没有问题,因为当程序尝试访问AF_UNIX套接字时,unix内核会检查权限。 但是,对于AF_INET套接字,连接是匿名的(读取“不安全”)。 想象一下,你有cygwin ssh-agent运行。 恶意黑客可能会端口扫描你的盒子,findssh-agent使用的开放端口,打开你的ssh服务器的连接,接受RSA挑战,通过开放的端口发送给你的ssh-agent,接收RSA响应,发送给ssh服务器和voila,他成功login到你的服务器。
来源: 设置Git
以下命令会将您的密码保存在内存中一段时间。
(对于git 1.7.10或更新。)
$ 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的时候,只remote.origin.url
为你的项目configurationremote.origin.url
,避免每次input用户名(或/和密码)。
如何configurationremote.origin.url
:
url格式: HTTPS:// {用户名:密码@} github.com/ {所有者} / {回购} url中的参数: * 用户名 可选,需要authentication时使用的用户名, 如果指定,需要authentication时不需要重新input用户名, 不要使用电子邮件,使用没有“@”的用户名,否则URL不能正确parsing, *密码 可选,需要validation时使用的密码, 如果指定,需要authentication时不需要重新input密码, 小费: 这个值是以纯文本的forms存储的,所以出于安全考虑,不要指定这个参数, * 例如 git config remote.origin.url https://eric@github.com/eric/myproject
@Update – 使用ssh
我认为使用ssh
协议是比https
更好的解决scheme,即使设置步骤稍微复杂一点。
粗略的步骤:
- 使用命令创buildssh密钥,例如linux上的
ssh-keygen
,在msysgit
提供类似的命令。 - 将本地机器上的私钥保存在适当的位置,例如
~/.ssh
。 并通过ssh-add
命令将其添加到ssh代理。 - 上传公钥到git服务器。
- 将git仓库的
remote.origin.url
更改为ssh
样式,例如git@gitlab.com:myaccount/myrepo.git
- 然后当拉或推,无需input用户名或密码。
提示:
- 如果您的ssh密钥有密码,那么您需要在每次重新启动机器后首次使用密钥时input它,默认情况下。
@Update – 在https
和ssh
协议之间切换。
只需更改remote.origin.url
就足够了,或者您可以直接编辑repo_home/.git/config
来更改值(例如,在Linux上使用vi
)。
通常我为每个协议添加一行,并使用#
注释其中的一个。
例如
[远程“起源”] url = git@gitlab.com:myaccount / myrepo.git #url = https://myaccount@gitlab.com/myaccount/myrepo.git fetch = + refs / heads / *:refs / remotes / origin / *
您可以在Git中caching您的GitHub密码:
只要按照github 官方文档的指示。
按照上述链接的指示,您应该能够推/拉你的回购,而不必每次input你的用户名/密码。
什么对我来说是编辑.git/config
和使用
[remote "origin"] url = https://<login>:<password>@gitlab.com(...).git
不言而喻,这是一种不安全的存储密码的方式,但也有环境/情况,这可能不成问题。
更新HTTPS:
Github推出了一个新的Windows程序,在使用HTTPS时存储您的凭证:
使用:
从这里下载程序
一旦你运行该程序,它将编辑你的.gitconfig
文件。 如果你有几个,重新检查它是否编辑了正确的.gitconfig
。 如果没有编辑正确的,请将以下内容添加到.gitconfig
[credential] helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe'
注意[credential]
之后的换行符。 这是必需的。
打开你的命令行客户端,并尝试一次git push origin master
。 如果它要求您input密码,请input密码并通过。 保存密码!
你基本上有两个select。
如果你在两台机器上使用相同的用户,你需要将.pub密钥复制到你的PC上,这样github知道你是同一个用户。
如果您为PC创build了一个新的.pub文件,并希望将这些机器视为不同的用户,则需要在github网站上注册新的.pub文件。
如果这仍然不起作用,这可能是因为sshconfiguration不正确,并且ssh无法find您的密钥的位置。 尝试
ssh -vv username@github.com
为了获得更多的信息为什么SSH失败。
我有同样的问题。
所以从我的项目中更改.git / config文件
url = https://github.com/<your-user-here>/<your-repo-here>
至
url = git@github.com:<your-user-here>/<your-repo-here>
并将ssh公钥添加到正在设置的gitconfiguration文件中。
为ssh公钥
cat ~/.ssh/id_rsa.pub
如果你在Windows下使用git(例如git bash)(如果你不想从https切换到ssh)
你也可以使用http://gitcredentialstore.codeplex.com/
此应用程序将为您保留用户名和密码…