git推送需要用户名和密码

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

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

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

我不想每次与origin交互时都输入我的用户名和密码。这里缺少什么?

1770621 次浏览

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

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

您可以使用以下命令检查是否已将远程添加为HTTPS或SSH:

git remote -v

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

你基本上有两个选择。

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

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

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

ssh -vv username@github.com

了解更多SSH失败的原因。

我刚刚遇到了同样的问题,我找到的最简单的解决方案是使用SSHURL而不是HTTPS:

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

而不是这个:

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

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

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

machine github.comlogin <user>password <password>

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

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

另一个补充(参见user137717的注释),如果您有Git 1.7.10或更高版本,则可以使用它。

使用凭据助手将您的GitHub密码缓存在Git中

如果您使用HTTPS克隆GitHub存储库,您可以使用凭证助手告诉Git记住你的GitHub用户名和每次与GitHub对话时都会输入密码。

这也适用于Linux,Mac和Windows。

HTTPS更新:

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

要使用:

  • 从这里下载程序

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

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

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

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

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

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

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

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

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

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

杀了那个特工

当你完成你的终端会话,你可以关闭ssh-agent与杀死标志-k

$ ssh-agent -k

#0手动所述:

-k

杀死当前代理(由SSH_AGENT_PID环境变量给出)。

可选超时

此外,它可以接受一个可选的超时参数,如下所示:

$ ssh-add -t <timeout>

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

根据#0手动

-t life

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

查看此页了解更多时间格式

Cygwin用户的安全警告

Cygwin用户应该知道在Cygwin中使用ssh代理的潜在安全风险

人们应该认识到在Cygwin1下的ssh代理的潜在危险,尽管在本地netstat和远程portcan下,似乎没有人可以访问 /tmp/ssh-foo中指定的端口。

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

引用链接

但是,请注意Cygwin的Unix域套接字是根本没有安全感,因此我强烈失望在Cygwin下使用ssh-agent。

当您在Cygwin下运行ssh代理时,它会在/tmp/ssh-$USERNAME/目录中创建AF_UNIX套接字。在Cygwin下AF_UNIX套接字通过AF_INET套接字进行模拟。如果您通过记事本查看/tmp/ssh-$USERNAME/agent-socket-*文件,您可以很容易地看到这一点。您会看到类似

!<socket >2080

然后运行netstat -a和惊喜!你有一些程序正在监听端口2080。它是ssh代理。当ssh收到来自服务器的RSA挑战时,它引用相应的/tmp/ssh-$USERNAME/agent-socket-*(在我们的例子中,在Cygwin下,这意味着它将打开到localhost:2080的连接)并要求ssh代理使用它拥有的私钥处理RSA挑战,然后它只是将从ssh代理收到的响应传递给服务器。

在Unix下,这样的场景没有问题,因为Unix内核会在程序尝试访问AF_UNIX套接字时检查权限。然而,对于AF_INET套接字,连接是匿名的(阅读"不安全")。想象一下,你有Cygwin ssh代理运行。恶意黑客可能会扫描你的盒子,找到ssh代理使用的开放端口,打开到你的SSH服务器的连接,从它接收RSA挑战,通过他/她找到的开放端口将其发送到你的ssh代理,接收RSA响应,将其发送到SSH服务器,瞧,他/她以你的身份成功登录到你的服务器。

来源:设置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

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,* passwordoptional, 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.ggit config remote.origin.url https://eric@github.com/eric/myproject

@Update-使用ssh

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

粗糙的步骤:

  • 使用命令创建ssh密钥,例如Linux上的ssh-keygen,windowsmsysgit提供类似的命令。
  • 将私钥保存在本地计算机上的适当位置,例如~/.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.gitfetch = +refs/heads/*:refs/remotes/origin/*

对于那些对前面的答案感到困惑的初学者,你可以这样做:

git remote -v

它会做出类似这样的回应

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

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

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

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

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

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

只需按照GitHub官方留档的说明进行操作。

按照上面链接中的说明进行操作后,您应该能够推送/拉取到/从您的存储库,而无需每次输入您的用户名/密码。

使用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 credential.helper 'cache --timeout 7200'

启用凭据缓存后,它将被缓存7200秒(2小时)。43,200 s=12小时(每天登录一次)对某些人来说可能也是一个合理的选择。


正如sebastianh所评论的,也可以使用类似的命令来配置它,而不是每个存储库,而是全局:

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

我也有同样的问题。

所以我从我的项目中更改了.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

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

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

不言而喻,这是一种不安全的密码存储方式,但在某些环境/情况下,这可能不是问题。

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

如果您还没有在机器中生成SSH密钥,那么您将不得不这样做。

作为附加信息,在进行此更改后,我仍然收到相同的错误:

拒绝许可。

在我的例子中,问题是我使用Windows Shell执行ngh命令;因为这个命令应该打开一个提示符来请求SSH短语,而Windows Shell没有打开这些提示符,身份验证失败了。

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

如果SSH密钥或.netrc文件对您不起作用,那么另一个简单但不太安全的解决方案可能适用于您,即git证书库-在磁盘上存储凭据的助手:

git config --global credential.helper store

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

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

这里有另一个选择:

而不是写作

git push origin HEAD

你可以写:

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

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

您需要执行两个步骤-

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

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

在此输入图片描述

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

git config --list --show-origin

在我的例子中,在手动编辑配置文件“C:\Program Files\Git\ming w64\etc\gitconfig”并添加以下文本后,它起作用了。

[credential]helper = store

这是什么为我工作:

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

示例:

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

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

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

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

[user]name = Tuxemail = tux@gmail.comusername = happy_feet
[remote "origin"]url = https://github.com/happy_feet/my_code.gitfetch = +refs/heads/*:refs/remotes/origin/*

将URL部分更改为SSH的以下格式:

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

上述格式不会随着GitHub或BitBay等各种Git远程服务器而更改。如果您使用Git进行版本控制,情况也是如此):

备注:连接到远程Git存储库的SSH方式需要您将SSH密钥添加到Git远程服务器(像GitHub或Bitucket。在设置页面中搜索SSH密钥)。

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

 # gen  the pub and priv keys# use "strange" naming convention, because those WILL BE more than 10 ...ssh-keygen -t rsa -b 4096 -C "me@corp.com" -f ~/.ssh/id_rsa.me@corp.com@`hostname -s`
# set the git alias ONLY this shell sessionalias git='GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me@corp.com.`hostname -s`" git'
# who did what when and whygit log --pretty --format='%h %ai %<(15)%ae ::: %s'
# set the git msgexport git_msg='issue-123 my important commit msg'
# add all files ( danger !!! ) and commit them with the msggit add --all ; git commit -m "$git_msg" --author "Me <me@corp.com"
# finallygit push

如果您克隆的是HTTPS而不是SSH并且在拉、推和获取时面临用户名和密码提示问题。您可以简单地为UBUNTU解决此问题

第一步:移动到根目录

cd ~/

创建一个文件. git-凭据

将此内容添加到您的usenamepasswordgithosting URL文件中

https://user:pass@example.com

然后执行命令

git config --global credential.helper store

现在,您将能够拉出推送并从您的存储库中获取所有详细信息,而不会有任何麻烦。

如果您的Github帐户上的启用2FA,您的常规密码将无法用于此目的,但您可以生成个人访问令牌并将其用于代替。

访问GitHub中的Settings->Developer Settings->Personal Access Tokens页面(https://github.com/settings/tokens/new),并生成具有所有回购权限的新Token:

生成GitHub个人访问令牌

然后,页面将显示新的令牌值。保存此值并在推送到GitHub上的存储库时用它代替密码:

> git push origin developUsername for 'https://github.com': <your username>Password for 'https://<your username>@github.com': <your personal access token>

列出您当前的SSH键:

ls -l ~/.ssh

生成一个新的SSH密钥:

ssh-keygen -t ed25519 -C "your_email@example.com"

您应该将your_email@example.com替换为您的GitHub电子邮件地址。
当提示Enter a file in which to save the key时,按输入.
Enter passphrase (empty for no passphrase)-按一下输入(用于空密码)。
再次列出你的SSH键:

ls -l ~/.ssh

文件id_ed25519id_ed25519.pub现在应该已经添加。
在后台启动ssh代理:

eval $(ssh-agent -s)

将SSH私钥添加到ssh代理:

ssh-add ~/.ssh/id_ed25519

接下来将公钥输出到终端屏幕:

cat ~/.ssh/id_ed25519.pub

将输出复制到剪贴板(Ctrl+插入).
转到https://github.com/<your-github-username>并使用您的用户名和密码。
单击右上角的GitHub头像,然后设置。在左窗格中,单击SSH和GPG密钥。点击绿色按钮新的SSH键并将SSH键粘贴到标记为的文本区域中。使用描述性的标题,告诉你从哪台计算机使用此SSH键。单击添加SSH密钥


如果您当前的本地存储库是用超文本传输协议用户名创建的,它需要重新创建,以便成为SSH兼容。首先检查,以确保你有一个干净的工作树这样你就不会失去任何工作:

git status

然后cd ..到父目录,rm -fr <name-of-your-repo>
最后克隆一个使用SSH而不是用户名/密码的新副本:

git clone git@github.com:[your-github-username]/[repository-name].git

参考资料:
https://docs.github.com/en/free-pro-team@latest /github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
https://docs.github.com/en/free-pro-team@latest /github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account

对于mac os

  1. 转到GitHub中的GithubSettings->Developer Settings->Personal Access Tokens页面(https://github.com/settings/tokens/new),并生成具有所有Repo权限的新Token
  2. 在Mac中搜索Keychain Access->搜索github.com->单击Show password,然后粘贴您刚刚复制的token
  3. 转到CLI,它会再次询问用户名和密码,输入您的Github用户名并将令牌粘贴为密码,您应该可以在其余时间使用CLI。

检查您的git版本和更新。然后将修复问题

$ git update-git-for-windows

更新说明:当您的PC git版本和服务器git版本不匹配时,我们可以使用它。

从2021年起,HTTPS遥控器有了安全的用户友好的跨平台解决方案。不再输入密码!不再有SSH密钥!不再有个人访问令牌!

安装Git Credential Manager由GitHub开发(下载量)。它支持对GitHub、BitBucket、Azure和GitLab的无密码浏览器内OAuth身份验证。这意味着您可以启用GitHub上的双重验证和其他平台,大大提高您帐户的安全性。

推送时,系统会为您提供多种身份验证方法:

> git pushSelect an authentication method for 'https://github.com/':1. Web browser (default)2. Device code3. Personal access tokenoption (enter for default): 1info: please complete authentication in your browser...

在Linux,一点点的设置是必需的。以下将凭据缓存在内存中20小时,因此您每天最多必须进行一次身份验证。

git-credential-manager-core configuregit config --global credential.credentialStore cachegit config --global credential.cacheoptions "--timeout 72000"

熟悉gnome-keyring或KWallet的高级用户可能更喜欢更改凭据存储而不是lib秘密。

化妆品配置文档):

  1. 更喜欢在终端而不是GUI中选择身份验证方法(点击次数更少)
  2. 始终使用浏览器方法,而不是每次都被询问(甚至更少的按键)
git config --global credential.guiPrompt falsegit config --global credential.gitHubAuthModes browser

区块报价

如果您遇到$git推送代码问题,请求用户名和密码,请走流程如下:

Login to your profile.Go to settings
click developer settings->Personal access tokens--> note: access token--->Select scopes: checkbox on repo----> Generate token-----> Make sure to copy and store it safely if you intend to reuse it.
*** use the generated token as password during pushing code for next 30days ***
***HAPPY CODING***