Git Push 需要用户名和密码

我从 GitHub 帐户克隆了一个 Git 存储库到我的 PC。

我想同时使用 PC 和笔记本电脑,但要使用一个 GitHub 帐户。

当我尝试使用 PC 推送或从 GitHub 拉出时,它需要用户名和密码,但在使用笔记本电脑时则不需要!

我不想每次与 Origin 交互时都输入用户名和密码。我在这里想念什么?

答案

一个常见的错误是使用默认(HTTPS)而不是 SSH 进行克隆。您可以通过以下方法更正此问题:转到您的存储库,单击 “克隆或下载”,然后单击 URL 字段上方的 “使用 SSH” 按钮,并按如下所示更新源远程服务器的 URL:

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

这在 GitHub 上有记录:将远程 URL 从 HTTPS 切换到 SSH

使用 Git 存储库进行永久身份验证

运行以下命令以启用凭据缓存

$ git config credential.helper store
$ git push https://github.com/owner/repo.git

Username for 'https://github.com': <USERNAME>
Password for 'https://USERNAME@github.com': <PASSWORD>

您还应该指定缓存到期

git config --global credential.helper 'cache --timeout 7200'

启用凭据缓存后,它将缓存7200 秒(2 小时)

我遇到了同样的问题,发现的最简单的解决方案是使用 SSH URL 而不是 HTTPS:

ssh://git@github.com/username/repo.git

而不是这样:

https://github.com/username/repo.git

现在,您可以使用 SSH 密钥而不是usernamepassword

除了更改为 SSH 之外,如果您不介意以明文形式输入密码,也可以继续使用 HTTPS。将其放在您的~/.netrc ,它不会询问您的用户名 / 密码(至少在 Linux 和 Mac 上如此):

machine github.com
       login <user>
       password <password>

添加 (请参阅 VonC 的第二条注释):在 Windows 上,文件名为%HOME%\_netrc

如果您想加密,还请阅读 VonC 的第一条评论。

如果您拥有Git 1.7.10 或更高版本,则可以使用另一个添加项 (请参阅 user137717 的注释)。

使用凭证助手将 GitHub 密码缓存在 Git 中

如果您要使用 HTTPS 克隆 GitHub 存储库,则可以使用凭据帮助程序告诉 Git 每次与 GitHub 对话时都记住您的 GitHub 用户名和密码。

这也适用于 Linux,Mac 和 Windows。

对于那些对以前的答案感到困惑的新手,您可以执行以下操作:

git remote -v

哪个会回应类似

origin    https://yourname@github.com/yourname/yourrepo.git (fetch)
origin    https://yourname@github.com/yourname/yourrepo.git (push)

然后,您可以运行许多其他建议的命令,但是现在您已经从上面知道了您的名字和 yourrepo,因此您只需将上面的yourname/yourrepo.git剪切并粘贴到:

git remote set-url origin git@github.com:yourname/yourrepo.git

如果您使用的是 SSH,并且您的私钥已使用密码进行了加密,那么当您使用 Git 进行 pushpullfetch 进行网络操作时仍然会提示您输入私钥的密码 / 密码

使用 ssh-agent 保存私钥密码 / 密码凭证

如果您不想每次都输入密码,可以使用ssh-agent在每个终端会话中存储一次私钥密码凭证,正如我在 “ 无法打开与身份验证代理的连接” 的回答中所解释的:

$ eval `ssh-agent -s`
$ ssh-add

在 Windows msysgit Bash 中,您需要评估ssh-agent的输出,但是我不确定是否需要在其他开发环境和操作系统中执行相同的操作。

ssh-add在您的 home .ssh文件夹中查找.ssh id_rsa ,这是默认名称,但是您可以将文件路径传递给具有不同名称的密钥。

杀死代理

完成终端会话后,可以使用 kill 标志-k关闭ssh-agent

$ ssh-agent -k

ssh-agent手册中所述

-k

终止当前代理(由 SSH_AGENT_PID 环境变量提供)。

可选超时

此外,它可以采用可选的超时参数,如下所示:

$ 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 1下 ssh-agent 的潜在危险,尽管在本地 netstat 和远程端口下,似乎 / tmp / ssh-foo 中指定的端口似乎无法被任何人访问吗?

[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html

并在引用的链接处

但是,请注意 Cygwin 的 Unix 域套接字基本上不安全的 ,所以我强烈反对在 Cygwin 下的 ssh-agent 的用法。

当您在 Cygwin 下运行 ssh-agent 时,它将在/tmp/ssh-$USERNAME/目录中创建 AF_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-* (在我们的例子中,在 Cygwin 下,这意味着它将打开与localhost:2080连接)并询问 ssh -agent 使用它具有的私钥来处理 RSA 质询,然后将从 ssh-agent 收到的响应简单地传递到服务器。

在 Unix 下,这种情况可以正常工作,因为在程序尝试访问 AF_UNIX 套接字时,Unix 内核会检查权限。但是,对于 AF_INET 套接字,连接是匿名的(请参阅 “不安全”)。想象一下,您正在运行 Cygwin ssh 代理。恶意黑客可能会在您的包装箱中打开端口,找到 ssh-agent 使用的开放端口,打开与您的 SSH 服务器的连接,接收来自 RSA 服务器的 RSA 挑战,并通过他 / 她找到的开放端口将其发送到您的 ssh-agent,并接收 RSA 响应,将其发送到 SSH 服务器,瞧,他 / 她已成功登录到您的服务器。

资料来源: Setting 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 one hour (setting is in seconds)

当您使用https进行 Git 推入和推remote.origin.url ,只需为您的项目配置remote.origin.url ,以避免每次推remote.origin.url输入用户名(或密码)。

如何配置remote.origin.url

URL format:
    https://{username:password@}github.com/{owner}/{repo}

Parameters in URL:

* username 
Optional, the username to use when needed.
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, there isn't any need to enter the password again when needing authentication. Tip: this value is stored as plain text, so for security concerns, don't specify this parameter, * e.g git config remote.origin.url https://eric@github.com/eric/myproject

@Update - 使用ssh

我认为使用ssh协议是比https更好的解决方案,即使设置步骤稍微复杂一点。

粗略的步骤:

  • 使用命令创建 ssh 密钥,例如 Windows 上的ssh-keygen ,在 Windows 上, msysgit提供类似的命令。
  • 将私钥保留在本地计算机上的适当位置,例如~/.ssh 。并通过ssh-add命令将其添加到 ssh 代理中。
  • 将公钥上传到 Git 服务器。
  • 将 Git 存储库的remote.origin.url更改为ssh样式,例如git@gitlab.com:myaccount/myrepo.git
  • 然后,在拉动或推入时,就不需要输入用户名或密码了。

提示:

  • 如果您的 ssh 密钥具有密码短语,则默认情况下,您需要在每次重新启动计算机后首次使用密钥时输入它。

@Update - 在httpsssh协议之间切换。

只需更改remote.origin.url就足够了,或者您可以直接编辑repo_home/.git/config来更改值(例如,在 Linux 上使用vi )。

通常,我为每个协议添加一行,并使用#注释掉其中一个。

例如

[remote "origin"]
        url = git@gitlab.com:myaccount/myrepo.git
        # url = https://myaccount@gitlab.com/myaccount/myrepo.git
        fetch = +refs/heads/*:refs/remotes/origin/*

您可以在 Git 中缓存 GitHub 密码:

只需按照 GitHub 官方文档中的说明进行操作即可。

按照上述链接中的说明进行操作后,无需每次都输入用户名 / 密码,便应该能够将其从存储库中推入 / 拉出。

对我有用的是编辑.git/config并使用

[remote "origin"]
        url = https://<login>:<password>@gitlab.com(...).git

不用说,这是一种不安全的密码存储方式,但是在某些情况下,这可能不是问题。