Git push需要用户名和密码

问题描述 投票:1252回答:21

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

我想使用我的PC和笔记本电脑,但有一个GitHub帐户。

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

每次与原点交互时,我都不想输入用户名和密码。我在这里错过了什么?

authentication github git-push git-pull git-clone
21个回答
1777
投票

常见的错误是使用默认值(HTTPS)而不是SSH进行克隆。您可以转到存储库,单击“克隆或下载”,然后单击URL字段上方的“使用SSH”按钮并更新原始远程URL,如下所示:

git remote set-url origin [email protected]:username/repo.git

这在GitHub记录:Switching remote URLs from HTTPS to SSH


9
投票

这是另一种选择:

而不是写作

git push origin HEAD

你可以写:

git push https://user:[email protected]/path HEAD

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


8
投票

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

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

毫无疑问,这是一种存储密码的不安全方式,但有些环境/情况可能不是问题。


4
投票

你基本上有两个选择。

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

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

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

ssh -vv [email protected]

获取更多信息SSH失败的原因。


4
投票

HTTPS更新:

GitHub推出了一个新的Windows程序,可以在您使用HTTPS时存储您的凭据:

使用:

  • here下载该程序
  • 运行程序后,它将编辑您的.gitconfig文件。如果您有多个.gitconfig,请重新检查它是否已编辑正确的.gitconfig。如果它没有编辑正确的,请将以下内容添加到[credential] helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe' [credential] 请注意git push origin master之后的换行符。这是必需的。
  • 打开命令行客户端并尝试.git/config一次。如果它要求您输入密码,请输入密码即可。密码已保存!

2
投票

我遇到过同样的问题。

所以我从我的项目中更改了url = https://github.com/<your-user-here>/<your-repo-here> 文件,

url = [email protected]:<your-user-here>/<your-repo-here>

cat ~/.ssh/id_rsa.pub

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

对于SSH公钥:

git config --global credential.helper store

2
投票

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

[credential]
    helper = store

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

git remote set-url origin https://[email protected]/username/reponame.git

1
投票

这对我有用:

git remote set-url origin https://[email protected]/jsmith/master.git

例:

.netrc

1
投票

如果SSH密钥或git-credential-store文件不适合您,那么可能适用于您的另一个简单但不太安全的解决方案是git config --global credential.helper store - Helper将凭据存储在磁盘上:

~/.git-credentials

默认情况下,凭据将保存在文件git remote remove origin中。它将被创建和写入。

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


1
投票

你需要执行两个步骤 -

  1. git remote add origin [email protected]:NuggetAI/nugget.git
  2. Enter image description here

请注意,Git URL是一个SSH URL而不是HTTPS URL ...您可以从这里选择:

.git/config


1
投票

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

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

以下是[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/* 文件的示例。复制并粘贴这些行,并确保使用您的Git信息更新这些行。

url = [email protected]:happy_feet/my_code.git

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

Creating SSH keys

(以上格式不会随着各种Git远程服务器(如GitHub或Bitbucket)而改变。如果您使用Git进行版本控制,则相同):

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

要了解如何生成SSH密钥,请参阅:Git Credential Manager for Windows


294
投票

Permanently authenticating with Git repositories

运行以下命令以启用credential caching

$ 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>

您还应该指定缓存过期,

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

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


0
投票

如果你在Windows下使用Git(例如,Git Bash)(如果你不想从HTTPS切换到SSH),你也可以使用qazxswpoi

此应用程序将保留您的用户名和密码...


0
投票

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

如果您尚未在计算机中生成SSH密钥,那么您将不得不这样做。

就像一个额外的信息,在做这个改变后,我仍然得到同样的错误:

没有权限。

就我而言,问题是我使用Windows Shell执行ngh命令;由于此命令应打开请求SSH短语的提示,并且Windows Shell不会打开这些类型的提示,因此身份验证失败。

所以,我只需要打开Git shell并在那里执行ngh命令,每次要求它时都会在提示符中输入SSH短语并且“voilà”......它工作得很好!


128
投票

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

ssh://[email protected]/username/repo.git

而不是这个:

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

您现在可以使用SSH密钥而不是usernamepassword进行验证。


116
投票

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

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

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

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

另一个补充(参见user137717的评论),如果你有Git 1.7.10或更新版本,你可以使用。

Cache your GitHub password in Git using a credential helper

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

这也适用于Linux,Mac和Windows。


79
投票

对于那些对以前的答案感到困惑的外行人,您可以这样做:

git remote -v

哪个会回复类似的东西

origin    https://[email protected]/yourname/yourrepo.git (fetch)
origin    https://[email protected]/yourname/yourrepo.git (push)

然后你可以运行许多其他人建议的命令,但现在你知道你的名字和你的回复,所以你可以从上面切割和粘贴yourname/yourrepo.git到:

git remote set-url origin [email protected]:yourname/yourrepo.git

53
投票

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

Use ssh-agent to save the private key passphrase/password credentials

如果您想避免每次都输入密码,您可以使用ssh-agent在每个终端会话中存储一次私钥密码凭证,正如我在my answer to Could not open a connection to your authentication agent中解释的那样:

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

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

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

Killing the agent

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

$ ssh-agent -k

ssh-agent manual所述:

-k

终止当前代理(由SSH_AGENT_PID环境变量给出)。

Optional timeout

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

$ ssh-add -t <timeout>

其中<timeout>的格式为<n>h<n>小时,<n>m<n>分钟,依此类推。

根据ssh-agent manual

-t life

为添加到代理的身份的最长生命周期设置默认值。寿命可以以秒或以sshd_config(5)中指定的时间格式指定。使用ssh-add(1)为标识指定的生命周期会覆盖此值。如果没有此选项,则默认的最长生命周期是永

See this page for more time formats

Security warning for Cygwin users

Cygwin用户应该知道potential security risk with using ssh-agent in Cygwin

人们应该认识到在Cygwin 1下ssh-agent的潜在危险,虽然在本地netstat和远程portscan下,似乎没有人可以访问/ tmp / ssh-foo中指定的端口......?

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

cited link

但请注意,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下,这样的场景没有问题,因为Unix内核在程序试图访问AF_UNIX套接字时检查权限。但是,对于AF_INET套接字,连接是匿名的(读为“不安全”)。想象一下,你运行了Cygwin ssh-agent。恶意黑客可以端口扫描您的盒子,找到ssh-agent使用的开放端口,打开与SSH服务器的连接,从它接收RSA质询,通过他/她找到的开放端口将其发送到您的ssh-agent,接收RSA响应,将其发送到SSH服务器,然后他/她成功登录到您的服务器。


47
投票

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

30
投票

当您使用https进行Git pull&push时,只需为您的项目配置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://[email protected]/eric/myproject

@Update - 使用ssh

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

粗略的步骤:

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

提示:

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

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

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

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

EG

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

15
投票

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

只需按照GitHub的official documentation的说明操作即可。

按照上述链接中的说明操作后,您应该能够在不输入用户名/密码的情况下从/向存储库推送/拔出。

© www.soinside.com 2019 - 2024. All rights reserved.