我从GitHub帐户克隆了一个Git存储库到我的PC。
我想同时使用PC和笔记本电脑,但要使用一个GitHub帐户。
当我尝试使用PC推送或从GitHub拉出时,它需要用户名和密码,但当我使用笔记本电脑时则不需要!
我不想每次与进行互动时都输入用户名和密码 origin
。我在这里想念什么?
我从GitHub帐户克隆了一个Git存储库到我的PC。
我想同时使用PC和笔记本电脑,但要使用一个GitHub帐户。
当我尝试使用PC推送或从GitHub拉出时,它需要用户名和密码,但当我使用笔记本电脑时则不需要!
我不想每次与进行互动时都输入用户名和密码 origin
。我在这里想念什么?
Answers:
一个常见的原因是使用默认(HTTPS)而不是SSH进行克隆。您可以通过以下方法更正此问题:转到存储库,单击“克隆或下载”,然后单击URL字段上方的“使用SSH”按钮,然后像这样更新源远程的URL:
git remote set-url origin git@github.com:username/repo.git
这在GitHub上有记录:将远程URL从HTTPS切换到SSH。
git remote set-url origin git://new.url.here
)
git remote set-url origin https://name:password@github.com/repo.git
:(摘自此处的评论)
Permission denied (publickey)
使用此指南的问题:help.github.com/articles/generating-ssh-keys。
运行以下命令以启用凭据缓存:
$ 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小时)。
git remote set-url origin https://git@github.com/<owner>/<repo>.git
这也适用于2FA
fatal: protocol 'https' is not supported
我遇到了同样的问题,发现的最简单的解决方案是使用SSH URL而不是HTTPS:
ssh://git@github.com/username/repo.git
而不是这样:
https://github.com/username/repo.git
现在,您可以仅使用SSH密钥而不是username
and进行验证password
。
除了更改为SSH之外,如果您不介意以明文形式输入密码,也可以继续使用HTTPS。将其放在您的文件中~/.netrc
,它不会要求您输入用户名/密码(至少在Linux和Mac上如此):
machine github.com
login <user>
password <password>
添加(请参阅VonC的第二条注释):在Windows上,文件名为%HOME%\_netrc
。
如果您想加密,还请阅读VonC的第一条评论。
如果您拥有Git 1.7.10或更高版本,则可以使用另一个添加项(请参阅user137717的注释)。
如果要使用HTTPS克隆GitHub存储库,则可以使用凭据帮助程序告诉Git每次与GitHub对话时都要记住自己的GitHub用户名和密码。
这也适用于Linux,Mac和Windows。
%HOME%\_netrc
(而不是~/.netrc
)。另请参阅stackoverflow.com/a/18362082/6309以对该文件进行加密。
对于那些对以上答案感到困惑的新手,您可以执行以下操作:
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
paraphrase
。我没有设立一个
yourrepo
什么?
git remote -v
,看看结果如何
如果您使用SSH,你的私有密钥使用密码加密,那么你还是会被提示输入私钥当你做网络操作使用Git来输入密码/密码一样push
,pull
和fetch
。
如果您不想每次都输入密码,则可以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中使用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服务器,瞧,他/她已成功登录到您的服务器。
资料来源: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)
当您使用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
ssh
我认为使用ssh
协议是比更好的解决方案https
,即使设置步骤稍微复杂一些。
粗略的步骤:
ssh-keygen
在Linux上,在Windows上msysgit
提供类似的命令。~/.ssh
。并通过ssh-add
命令将其添加到ssh代理。remote.origin.url
将Git储存库更改为ssh
样式,例如git@gitlab.com:myaccount/myrepo.git
提示:
https
和ssh
协议之间切换。只需更改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 / *
git-fetch(1)
仅提及基于git
/ ssh
的URL。
https://username:password@github.com/
是安全的。见stackoverflow.com/questions/4980912/...
这是另一个选择:
而不是写作
git push origin HEAD
您可以这样写:
git push https://user:pass@yourrepo.com/path HEAD
显然,对于大多数shell,这将导致密码被缓存在历史记录中,因此请记住这一点。
如果SSH密钥或.netrc
文件对您不起作用,那么另一种简单但安全性较低的解决方案可能对您有用,那就是git-credential- store-帮助程序将凭据存储在磁盘上:
git config --global credential.helper store
默认情况下,凭据将保存在file中~/.git-credentials
。它将被创建并写入。
请注意,使用此帮助程序会将密码未加密地存储在磁盘上,仅受文件系统权限保护。如果这可能不是可接受的安全性折衷。
我遇到过同样的问题。
所以我.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
cat ~/.ssh/id_rsa.pub
rsa键并粘贴到git Web门户设置中。
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配置文件(如果您不想记住高级命令):
.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密钥
这对我有用:
git remote set-url origin https://username@github.com/username/reponame.git
例:
git remote set-url origin https://jsmith@github.com/jsmith/master.git
如果您克隆了HTTPS而不是SSH,并且在pull,push和fetch上遇到用户名和密码提示的问题。您可以简单地为UBUNTU解决此问题
步骤1:移至根目录
cd ~/
创建一个文件.git-credentials
这些内容加进该文件与你usename
password
和githosting URL
https://user:pass@example.com
然后执行命令
git config --global credential.helper store
现在,您可以轻松地从存储库中进行推送并获取所有详细信息。
如果您在Windows下使用Git(例如Git Bash)(并且不想从HTTPS切换到SSH),则也可以使用Windows的Git Credential Manager
此应用程序将为您保留用户名和密码...
# 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