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而不是usernamepassword

除了更改为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(pushpullfetch 执行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 – 在httpsssh协议之间切换。

只需更改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/

此应用程序将为您保留用户名和密码…