关于身份验证:Git push需要用户名和密码

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 Key而不是usernamepassword进行验证。


除了改为ssh,如果你不介意把密码放在明文中,你还可以继续使用https。把它放在你的~/.netrc中,它不会要求你的用户名/密码(至少在Linux和Mac上):

1
2
3
machine github.com
       login <user>
       password <password>

添加(参见VONC的第二条评论):在Windows上,文件名是%HOME%\_netrc

如果您想加密,还可以阅读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。


对于那些对之前的答案感到困惑的未经启蒙的人,你可以这样做:

git remote -v

会有类似的反应

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,并且您的私钥使用密码短语加密,那么在使用诸如pushpullfetch等git进行网络操作时,仍然会提示您输入私钥的密码/密码。

使用ssh代理保存私钥密码短语/密码凭据

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

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

在windows msysgit bash中,您需要评估ssh-agent的输出,但我不确定您是否需要在其他开发环境和操作系统中这样做。

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

杀死特工

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

1
$ ssh-agent -k

ssh-agent手册所述:

1
-k

Kill the current agent (given by the SSH_AGENT_PID environment variable).

可选超时

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

1
$ ssh-add -t <timeout>

其中格式为h表示小时,m表示分钟,以此类推。

根据ssh-agent手册:

1
-t life

Set 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 >2080

then 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时,只需为您的项目配置remote.origin.url,以避免每次推送时都输入用户名(或/和密码)。

如何配置remote.origin.url

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

我认为使用ssh协议比https协议更好,尽管设置步骤有点复杂。

粗略步骤:

  • 使用命令创建ssh密钥,例如Linux上的ssh-keygen,Windowsmsysgit上的ssh-keygen提供类似的命令。
  • 将本地计算机上的私钥保存在适当的位置,例如~/.ssh。并通过ssh-add命令添加到ssh代理。
  • 将公钥上载到Git服务器。
  • 将git库的remote.origin.url改为ssh样式,如[email protected]:myaccount/myrepo.git
  • 然后拉或推时,不需要输入用户名或密码。

提示:

  • 如果您的ssh密钥有一个密码短语,那么缺省情况下,您需要在每次重新启动计算机后首次使用该密钥时输入它。

@更新-在httpsssh协议之间切换。

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

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

例如

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。


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

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时存储您的凭据:

使用:

从这里下载程序

运行程序后,它将编辑您的.gitconfig文件。如果您有多个.gitconfig,请重新检查它是否编辑了正确的.gitconfig。如果没有编辑正确的,请将以下内容添加到您的.gitconfig

1
2
[credential]
    helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe'

注意[credential]后的换行符。这是必需的。

打开您的命令行客户机,尝试一次git push origin master。如果它要求您输入密码,请输入密码,然后通过。密码已保存!


你基本上有两个选择。

如果在两台计算机上使用同一个用户,则需要将.pub密钥复制到您的PC上,因此Github知道您是同一个用户。

如果您已经为您的PC创建了一个新的.pub文件,并且希望将这些计算机视为不同的用户,则需要在Github网站上注册新的.pub文件。

如果这仍然不起作用,可能是因为ssh配置不正确,并且ssh找不到密钥的位置。尝试

获取有关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用户,在运行git config --global credential.helper store之后,如果它仍然提示输入密码,您最好检查配置的写入位置。使用此命令

git config --list --show-origin

在我的例子中,手动编辑配置文件"c:program filesgitmingw64etcgit config",添加以下文本,它可以工作。

[credential]
helper = store


直接更新Git配置文件:(如果不想记住花哨的命令)

在您最喜欢的文本编辑器中打开您的.git/config文件。它将在您克隆的文件夹中,或在执行git in it的repo中。去回购。.git为隐藏文件夹,按ctrl + h应显示隐藏文件夹,(ls -a在终端中)。

这里是.git/config文件的一个示例,复制并粘贴这些行,并确保使用您的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是sshurl,而不是https url。你可以从这里选择。

enter image description here


这就是我的工作:

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

默认情况下,凭证将保存在~/.git-credentials中。它将被创建并写入。

请注意,使用此帮助程序会将您的密码未加密存储在磁盘上,仅受文件系统权限保护。如果这可能不是一个可接受的安全权衡。


如果您在Windows下使用Git(例如Git bash)(如果不想从https切换到ssh)

您还可以使用https://github.com/microsoft/git-credential-manager-for-windows

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