Git Push需要用户名和密码


1433

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

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

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

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


1
是的,但是我该怎么办?我生成了密钥生成器还有什么?
TooCooL 2011年

1
您需要使用您的Github帐户(github.com/account/ssh)注册pubkey,并将SSH客户端配置为使用正确的用户名。
jwodder 2011年

1
我已经完成了所有这些操作,但是仍然需要用户名和密码!一个帐户可以在两台PC上使用吗?
TooCooL 2011年

1
这个问题涵盖了这所有的选择相当不错:stackoverflow.com/questions/5343068/...
福特

2
无需再切换到ssh。HTTPS也有可能。检查我的答案。
Varun Achar

Answers:


1959

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

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

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


61
并找出如何更改URL,去这里:stackoverflow.com/a/2432799/60488(扰流板:git remote set-url origin git://new.url.here
约翰·库尔

136
如果您不能使用ssh来获得安全性限制(像我一样),则可以执行以下操作git remote set-url origin https://name:password@github.com/repo.git :(摘自此处的评论)
Bruno Berisso 2013年

134
为什么使用HTTPS克隆是一个常见错误?GitHub现在建议使用HTTPS。
丹尼斯

8
默认情况下是@smftre,但是您可以使用帮助器来缓存您的凭据
丹尼斯

28
修复了我Permission denied (publickey)使用此指南的问题:help.github.com/articles/generating-ssh-keys
voltrevo 2014年

386

使用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小时)


您可能还必须使用更改远程URL。git remote set-url origin https://git@github.com/<owner>/<repo>.git 这也适用于2FA
Bron Davies

14
这应该是公认的答案。它恰好回答了这个问题。
亚伯拉罕TS

为了安全起见,它将自动从ubuntu文件中删除到7200之后吗?
usama

或43,200,持续12小时。您每天登录一次。对于某些人来说,这可能更合理。
乌拉斯奎尔

刚刚尝试过此操作-得到了:fatal: protocol 'https' is not supported
Joel

134

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

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

而不是这样:

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

现在,您可以使用SSH密钥而不是usernameand进行验证password


1
解决该问题的最简单方法是编辑远程原始URL。就这样。做完了 谢谢!
JOM

1
这为我工作,但首先我需要解决这个问题:stackoverflow.com/questions/2643502/...
斯里达尔Sarnobat


120

除了更改为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。


3
是的,它可在Linux上运行,但不适用于Windows上的gitbash。
Dielson Sales

3
@dolmen我明白您的意思了,但是如果您介意将密码以明文形式输入,则可以...对其进行加密;)请参阅stackoverflow.com/a/18362082/6309。甚至与Github的2要素验证(2FA)兼容:stackoverflow.com/a/18607931/6309
VonC 2013年

3
@Sales可以从DOS会话或Windows上的git bash完美运行,只要您调用文件%HOME%\_netrc(而不是~/.netrc)。另请参阅stackoverflow.com/a/18362082/6309以对该文件进行加密。
VonC

1
这在Linux中非常有效,尤其是在VPN上使用git时。
Evan Hu

3
您无需将其放在明文中或对其进行加密。helper实用程序将为您缓存它,并且需要30秒来设置。help.github.com/articles/caching-your-github-password-in-git/...
user137717

86

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

git remote -v

哪个会回应类似

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

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

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

1
我试过了 它总是问我paraphrase。我没有设立一个
samayo

代替yourrepo什么?
拉斐尔

2
@Raphi跑步git remote -v,看看结果如何
Davide

1
其他答案应在此建议之前。
贝内特·布朗

57

如果您使用SSH,你的私有密钥使用密码加密,那么你还是会被提示输入私钥当你做网络操作使用Git来输入密码/密码一样pushpullfetch

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

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

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

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

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

杀死代理

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

$ 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服务器,瞧,他/她已成功登录到您的服务器。


听起来不错而且很详细。我照顾了https凭据助手,而您照顾了ssh连接!+1
VonC

49

资料来源: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)

2
我更喜欢使用“ netrc”凭证帮助(stackoverflow.com/a/18362082/6309)来缓存多个凭证(而不必记住每个密码)。但是,如果您使用的是Windows,并且想使用内存缓存,则需要winstore(stackoverflow.com/a/15310274/6309
VonC

9
这是迄今为止恕我直言的最佳答案。
Chiel 10 Brinke 2014年

35

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

如何配置remote.origin.url

网址格式:
    https:// {username:password @} github.com/ {owner} / {repo}

URL中的参数:

* username 
可选,需要时使用的用户名。
验证, 如果指定,则需要身份验证时无需再次输入用户名。 不要使用电子邮件;请使用没有“ @”的用户名,否则网址将无法正确解析, *密码 可选,需要认证时使用的密码。 如果指定,则在需要身份验证时无需再次输入密码。 小费: 此值存储为纯文本格式,因此出于安全考虑,请勿指定此参数, * 例如 git config remote.origin.url https://eric@github.com/eric/myproject

@Update-使用 ssh

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

粗略的步骤:

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

提示:

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

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

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

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

例如

[远程“来源”]
        网址= git@gitlab.com:myaccount / myrepo.git
        #网址= https://myaccount@gitlab.com/myaccount/myrepo.git
        提取= + refs / heads / *:refs / remotes / origin / *

您确定基于http [s]的URL支持用户名扩展吗?手册git-fetch(1)仅提及基于git/ ssh的URL。

@plmday是的,我正在使用它,我的git版本是1.8.2.3和1.8.4,我不确定更高版本的版本是否会对此进行更改。
Eric Wang

1
注意:在URL中提供密码(即使使用HTTPS时)也意味着您和存储库之间的所有内容都可以看到该密码。
威廉

3
不,提供密码https://username:password@github.com/是安全的。见stackoverflow.com/questions/4980912/...
slowhand

1
这就是我想要的(实现全自动化)
Joshua

16

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

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

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


5
这是最好的答案,应该是公认的一个IMO
TheZuck

1
同意,引用官方文件的答案应优先。我很高兴遵循他们的指示,并且更喜欢使用标准约定。
johnnieb

10

这是另一个选择:

而不是写作

git push origin HEAD

您可以这样写:

git push https://user:pass@yourrepo.com/path HEAD

显然,对于大多数shell,这将导致密码被缓存在历史记录中,因此请记住这一点。


1
在Bash中,添加一个或多个前导空格通常会使它脱离历史记录。但在Git Bash中却没有。
Peter Mortensen19年

这只是为我工作:)
Naveen Kumar V

9

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

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

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


6

如果SSH密钥或.netrc文件对您不起作用,那么另一种简单但安全性较低的解决方案可能对您有用,那就是git-credential- store-帮助程序将凭据存储在磁盘上:

git config --global credential.helper store

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

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


5

我遇到过同样的问题。

所以我.git/config从项目中更改了文件,

url = https://github.com/<your-user-here>/<your-repo-here>

url = git@github.com:<your-user-here>/<your-repo-here>

并将SSH公钥添加到正在设置的Git配置文件中。

对于SSH公钥:

cat ~/.ssh/id_rsa.pub

1
使用cat ~/.ssh/id_rsa.pubrsa键并粘贴到git Web门户设置中。
Anupam Maurya

4

HTTPS更新:

GitHub为Windows启动了一个新程序,该程序可以在您使用HTTPS时存储您的凭据:

使用方法:

  • 这里下载程序

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

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

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

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


谢谢瓦伦,工作的魅力!
Joyy

4

对于Windows Git用户,在运行后git config --global credential.helper store,如果仍然提示输入密码,则最好使用此命令检查配置文件的写入位置。

git config --list --show-origin

以我为例,在手动编辑配置文件'C:\ Program Files \ Git \ mingw64 \ etc \ gitconfig',并添加以下文本后,它可以工作。

[credential]
    helper = store

3

您基本上有两个选择。

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

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

如果仍然不能解决问题,可能是因为ssh配置不正确,并且ssh无法找到密钥的位置。尝试

ssh -vv username@github.com

要获取更多信息,为什么SSH失败。


3

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

.git/config在您喜欢的文本编辑器中打开文件。它将在您克隆的文件夹中或在其中执行的存储库git init中。进入该存储库。.git是一个隐藏的文件夹,按Ctrl+ H应该显示隐藏的文件夹(ls -a在终端中)。

下面是该.git/config文件的示例。复制并粘贴这些行,并确保使用您的Git信息更新这些行。

[user]
        name = Tux
        email = tux@gmail.com
        username = happy_feet

[remote "origin"]
        url = https://github.com/happy_feet/my_code.git
        fetch = +refs/heads/*:refs/remotes/origin/*

使用以下格式更改SSH的URL部分:

url = git@github.com:happy_feet/my_code.git

以上格式在GitHub或Bitbucket等各种Git远程服务器上不会更改。如果您使用Git进行版本控制,则是相同的):

注意: SSH连接到远程Git存储库的方式将要求您将公共SSH密钥添加到Git远程服务器(例如GitHub或Bitbucket。在设置页面上搜索SSH密钥)。

要了解如何生成SSH密钥,请参阅: 创建SSH密钥


2

这对我有用:

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

例:

git remote set-url origin https://jsmith@github.com/jsmith/master.git

谢谢,我赞成您的回答
Mandeep Singh,

2

您需要执行两个步骤-

  1. git remote remove origin
  2. git remote add origin git@github.com:NuggetAI/nugget.git

注意,Git URL是SSH URL,而不是HTTPS URL ...您可以从此处选择:

在此处输入图片说明


2

如果您克隆了HTTPS而不是SSH,并且在pull,push和fetch上遇到用户名和密码提示的问题。您可以简单地为UBUNTU解决此问题

步骤1:移至根目录

cd ~/

创建一个文件.git-credentials

这些内容加进该文件与你usename passwordgithosting URL

https://user:pass@example.com

然后执行命令

git config --global credential.helper store

现在,您可以轻松地从存储库中进行推送并获取所有详细信息。



0

正如许多用户所说的,您只需要将Git存储库URL从HTTPS更改为SSH。

如果您尚未在计算机中生成SSH密钥,则必须这样做。

作为其他信息,在执行此更改之后,我仍然遇到相同的错误:

没有权限。

就我而言,问题是我在使用Windows Shell执行ngh命令。由于此命令应打开一个提示以请求SSH短语,并且Windows Shell不会打开此类提示,因此身份验证只是失败了。

因此,我只需要打开Git shell并在其中执行ngh命令,就在每次要求它时都在提示中输入SSH短语,然后“瞧瞧”……就可以了!


-1
    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@git.in.corp.com:corp/project.git

    export git_msg="my commit msg with my corporate identity"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@github.com:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 

    # stop :: how-to use different ssh identity files
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.