我从我的GitHub帐户克隆了一个Git存储库到我的PC。
我想使用我的PC和笔记本电脑,但有一个GitHub帐户。
当我尝试使用我的电脑推送或拔出GitHub时,它需要用户名和密码,但在使用笔记本电脑时则不需要!
每次与原点交互时,我都不想输入用户名和密码。我在这里错过了什么?
常见的错误是使用默认值(HTTPS)而不是SSH进行克隆。您可以转到存储库,单击“克隆或下载”,然后单击URL字段上方的“使用SSH”按钮并更新原始远程URL,如下所示:
git remote set-url origin [email protected]:username/repo.git
这在GitHub记录:Switching remote URLs from HTTPS to SSH。
这是另一种选择:
而不是写作
git push origin HEAD
你可以写:
git push https://user:[email protected]/path HEAD
显然,对于大多数shell,这将导致密码在历史记录中被缓存,因此请记住这一点。
对我有用的是编辑.git/config
并使用
[remote "origin"]
url = https://<login>:<password>@gitlab.com(...).git
毫无疑问,这是一种存储密码的不安全方式,但有些环境/情况可能不是问题。
你基本上有两个选择。
如果您在两台计算机上使用相同的用户,则需要将.pub密钥复制到PC,因此GitHub知道您是同一个用户。
如果您为PC创建了一个新的.pub文件,并希望将这些计算机视为不同的用户,则需要在GitHub网站上注册新的.pub文件。
如果这仍然不起作用,可能是因为没有正确配置ssh并且ssh无法找到密钥的位置。尝试
ssh -vv [email protected]
获取更多信息SSH失败的原因。
HTTPS更新:
GitHub推出了一个新的Windows程序,可以在您使用HTTPS时存储您的凭据:
使用:
.gitconfig
文件。如果您有多个.gitconfig
,请重新检查它是否已编辑正确的.gitconfig
。如果它没有编辑正确的,请将以下内容添加到[credential]
helper = !'C:\\Path\\To\\Your\\Downloaded\\File\\git-credential-winstore.exe'
[credential]
请注意git push origin master
之后的换行符。这是必需的。.git/config
一次。如果它要求您输入密码,请输入密码即可。密码已保存!我遇到过同样的问题。
所以我从我的项目中更改了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
对于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
如果SSH密钥或git-credential-store文件不适合您,那么可能适用于您的另一个简单但不太安全的解决方案是git config --global credential.helper store
- Helper将凭据存储在磁盘上:
~/.git-credentials
默认情况下,凭据将保存在文件git remote remove origin
中。它将被创建和写入。
请注意,使用此帮助程序会将未加密的密码存储在磁盘上,仅受文件系统权限的保护。如果这可能不是可接受的安全权衡。
你需要执行两个步骤 -
git remote add origin [email protected]:NuggetAI/nugget.git
请注意,Git URL是一个SSH URL而不是HTTPS URL ...您可以从这里选择:
.git/config
直接更新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
运行以下命令以启用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小时)。
如果你在Windows下使用Git(例如,Git Bash)(如果你不想从HTTPS切换到SSH),你也可以使用qazxswpoi
此应用程序将保留您的用户名和密码...
正如许多用户所说,您只需将Git存储库URL从HTTPS更改为SSH。
如果您尚未在计算机中生成SSH密钥,那么您将不得不这样做。
就像一个额外的信息,在做这个改变后,我仍然得到同样的错误:
没有权限。
就我而言,问题是我使用Windows Shell执行ngh命令;由于此命令应打开请求SSH短语的提示,并且Windows Shell不会打开这些类型的提示,因此身份验证失败。
所以,我只需要打开Git shell并在那里执行ngh命令,每次要求它时都会在提示符中输入SSH短语并且“voilà”......它工作得很好!
我遇到了同样的问题,我发现最简单的解决方案是使用SSH URL而不是HTTPS URL:
ssh://[email protected]/username/repo.git
而不是这个:
https://github.com/username/repo.git
您现在可以使用SSH密钥而不是username
和password
进行验证。
除了更改为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。
对于那些对以前的答案感到困惑的外行人,您可以这样做:
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
如果您使用SSH并且您的私钥使用密码加密,那么当您使用Git(如push
,pull
和fetch
)进行网络操作时,仍会提示您输入私钥的密码/密码。
如果您想避免每次都输入密码,您可以使用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
的私钥,这是默认名称,但您可以将文件路径传递给具有不同名称的密钥。
完成终端会话后,可以使用kill flag ssh-agent
关闭-k
:
$ ssh-agent -k
如ssh-agent
manual所述:
-k
终止当前代理(由SSH_AGENT_PID环境变量给出)。
此外,它可以采取可选的超时参数,如下所示:
$ ssh-add -t <timeout>
其中<timeout>
的格式为<n>h
为<n>
小时,<n>m
为<n>
分钟,依此类推。
-t life
为添加到代理的身份的最长生命周期设置默认值。寿命可以以秒或以sshd_config(5)中指定的时间格式指定。使用ssh-add(1)为标识指定的生命周期会覆盖此值。如果没有此选项,则默认的最长生命周期是永
See this page for more time formats。
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
但请注意,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服务器,然后他/她成功登录到您的服务器。
资料来源: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)
当您使用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
ssh
我认为使用ssh
协议是比https
更好的解决方案,即使设置步骤稍微复杂一点。
粗略的步骤:
ssh-keygen
,windows上的msysgit
提供类似的命令。~/.ssh
。并通过ssh-add
命令将其添加到ssh代理程序。remote.origin.url
更改为ssh
样式,例如[email protected]:myaccount/myrepo.git
提示:
https
和ssh
协议之间切换。只需更改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/*
您可以在Git中缓存GitHub密码:
只需按照GitHub的official documentation的说明操作即可。
按照上述链接中的说明操作后,您应该能够在不输入用户名/密码的情况下从/向存储库推送/拔出。