我从我的Github帐户克隆了一个git存储库到我的电脑。
我想使用我的电脑和笔记本电脑,但有一个Github帐户。
当我尝试使用我的电脑从Github推送或拉出时,它需要用户名和密码,但在使用笔记本电脑时则不行!
每次与原点互动时,我都不想输入用户名和密码。 我在这里缺少什么?
答案 0 :(得分:1742)
常见错误是使用默认值(HTTPS)而不是SSH进行克隆。您可以通过转到存储库,单击“克隆或下载”,然后单击URL字段上方的“使用SSH”按钮并更新原始遥控器的URL来更正此问题:
git remote set-url origin git@github.com:username/repo.git
GitHub记录了这一点:Switching remote URLs from HTTPS to SSH。
答案 1 :(得分:273)
运行以下命令以启用credential caching:
$ 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小时)。
答案 2 :(得分:128)
我遇到了同样的问题,我发现最简单的解决方案是使用SSH URL而不是HTTPS:
ssh://git@github.com/username/repo.git
而不是这个:
https://github.com/username/repo.git
您现在可以使用 SSH Key
而不是username
和password
进行验证。
答案 3 :(得分:116)
除了更改为SSH之外,如果您不介意以明文形式输入密码,也可以继续使用HTTPS。把它放在你的~/.netrc
中它不会要求你的用户名/密码(至少在Linux和Mac上):
machine github.com
login <user>
password <password>
添加(请参阅VonC的第2条评论):在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。
答案 4 :(得分:77)
对于那些对以前的答案感到困惑的外行人,你可以这样做:
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
答案 5 :(得分:52)
如果您正在使用ssh并且您的私钥使用密码加密,那么 当您使用Git进行网络操作时,仍会提示您输入私钥的密码/密码< / em> ,例如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
文件夹中查找私钥,这是默认名称,但您可以将文件路径传递给具有不同名称的密钥。< / p>
完成终端会话后,您可以使用kill flag ssh-agent
关闭-k
:
$ ssh-agent -k
中所述
-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域套接字 FUNDAMENTALLY INSECURE ,因此我强烈 DISCOURAGE 使用ssh-agent cygwin的。
在cygwin下运行ssh-agent时会创建AF_UNIX套接字
之类的东西/tmp/ssh-$USERNAME/
目录。在cygwin下AF_UNIX套接字是 通过AF_INET套接字模拟。你可以很容易地看到,如果你看 通过记事本进入/tmp/ssh-$USERNAME/agent-socket-*
文件。你会看到的!<socket >2080
然后运行
在unix下,这样的场景没有问题,因为unix内核 程序尝试访问AF_UNIX套接字时检查权限。对于 但是,AF_INET套接字的连接是匿名的(读取 “不安全”)。想象一下,你运行了cygwin ssh-agent。 恶意黑客可能会端口扫描你的盒子,找到使用的开放端口 ssh-agent,打开与ssh服务器的连接,接收RSA质询 从它,通过他发现的开放端口发送给你的ssh-agent,接收RSA 响应,发送到ssh服务器,瞧,他成功登录 像你一样到你的服务器。netstat -a
并惊喜!你有一些程序在听 端口2080.它是ssh-agent。当ssh收到RSA挑战时 服务器,它指的是相应的/tmp/ssh-$USERNAME/agent-socket-*
(在cygwin下,在我们的例子中,这意味着它将打开连接到localhost:2080
)并要求ssh-agent处理RSA质询 它有私钥,然后它只是传递从中收到的响应 ssh-agent到服务器。
答案 6 :(得分:46)
来源: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 1 hour (setting is in seconds)
答案 7 :(得分:30)
使用 https 进行git pull&amp;推送,只为您的项目配置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 need 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, no need to enter password again when need authentication, tip: this value is stored as plain text, so for security concern, don't specify this param, * e.g git config remote.origin.url https://eric@github.com/eric/myproject
ssh
我认为使用ssh
协议是比https
更好的解决方案,即使设置步骤稍微复杂一些。
粗略步骤:
ssh-keygen
,在Windows msysgit
上提供类似的命令。~/.ssh
。并通过ssh-add
命令将其添加到ssh代理。remote.origin.url
更改为ssh
样式,例如git@gitlab.com:myaccount/myrepo.git
<强>提示:强>
https
和ssh
协议之间切换。只需更改remote.origin.url
就足够了,或者您可以直接编辑repo_home/.git/config
来更改值(例如在linux上使用vi
)。
通常我为每个协议添加一行,并使用#
注释掉其中一个。
<强> e.g 强>
[remote "origin"] url = git@gitlab.com:myaccount/myrepo.git # url = https://myaccount@gitlab.com/myaccount/myrepo.git fetch = +refs/heads/*:refs/remotes/origin/*
答案 8 :(得分:15)
您可以在Git中缓存GitHub密码:
只需按照github official documentation的说明进行操作。
按照上述链接中的说明操作后,您应该可以在不每次输入用户名/密码的情况下向/从您的仓库进行推/拉。
答案 9 :(得分:8)
对我有用的是编辑.git/config
并使用
[remote "origin"]
url = https://<login>:<password>@gitlab.com(...).git
不言而喻,这是一种存储密码的不安全方式,但有些环境/情况可能不是问题。
答案 10 :(得分:7)
这是另一种选择:
而不是写
git push origin HEAD
你可以写:
git push https://user:pass@yourrepo.com/path HEAD
显然,对于大多数shell,这将导致密码在历史记录中被缓存,因此请记住这一点。
答案 11 :(得分:6)
如果您已在Github帐户上启用了2FA ,则您的常规密码将无法使用,但是您可以生成一个Personal Access Token并用它代替它。< / p>
访问GitHub(https://github.com/settings/tokens/new)中的Settings
-> Developer Settings
-> Personal Access Tokens
页面,并使用所有 Repo 生成新令牌权限:
然后页面将显示新的令牌值。保存此值并在推送到GitHub上的存储库时使用它代替密码:
> git push origin develop
Username for 'https://github.com': <your username>
Password for 'https://<your username>@github.com': <your personal access token>
答案 12 :(得分:4)
你基本上有两个选择。
如果您在两台计算机上使用相同的用户,则需要将.pub密钥复制到PC,因此github知道您是同一个用户。
如果您为PC创建了一个新的.pub文件,并希望将这些计算机视为不同的用户,则需要在github网站上注册新的.pub文件。
如果这仍然不起作用,可能是因为没有正确配置ssh并且ssh无法找到密钥的位置。尝试
ssh -vv username@github.com
获取有关SSH失败原因的更多信息。
答案 13 :(得分: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
一次。如果它要求您输入密码,请输入密码即可。密码已保存!
答案 14 :(得分:3)
列出您当前的 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_ed25519
和 id_ed25519.pub
现在应该已添加。
在后台启动 ssh-agent:
eval $(ssh-agent -s)
将您的 SSH 私钥添加到 ssh-agent:
ssh-add ~/.ssh/id_ed25519
接下来将公钥输出到终端屏幕:
cat ~/.ssh/id_ed25519.pub
将输出复制到剪贴板
(Ctrl + 插入).
转到 https://github.com/<your-github-username>
并使用您的
用户名和密码。
点击右上角的 GitHub 头像,然后点击设置。
在左侧窗格中,单击 SSH 和 GPG 密钥。
点击绿色按钮新建 SSH 密钥
并将公共 SSH 密钥粘贴到标记为 Key 的文本区域中。
使用描述性的标题来说明您将使用哪台计算机
使用此 SSH 密钥。点击添加 SSH 密钥。
如果您当前的本地存储库是使用 http 和 用户名 创建的,
它需要重新创建,以便与 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
答案 15 :(得分:2)
对于Windows git用户,运行git config --global credential.helper store
后,如果仍然提示输入密码,则最好检查配置写入的位置。使用此命令
git config --list --show-origin
在我的情况下,手动编辑配置文件'C:\ Program Files \ Git \ mingw64 \ etc \ gitconfig',添加以下文本,即可使用。
[credential]
helper = store
答案 16 :(得分:2)
我也有同样的问题。
所以从我的项目中更改.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
答案 17 :(得分:1)
您需要执行两个步骤 -
1) git remote remove origin
2) git remote add origin git@github.com:NuggetAI/nugget.git
请注意,git网址是ssh
网址,而不是https网址。您可以从此处选择。
答案 18 :(得分:1)
这对我有用:
git remote set-url origin https://username@github.com/username/reponame.git
示例:
git remote set-url origin https://jsmith@github.com/jsmith/master.git
答案 19 :(得分:1)
直接更新您的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密钥,请参阅: https://confluence.atlassian.com/bitbucketserver/creating-ssh-keys-776639788.html
答案 20 :(得分:0)
如果ssh密钥或.netrc不适合您,那么另一个可以为您工作的简单但不太安全的解决方案是git-credential-store - Helper将凭据存储在磁盘上
git config --global credential.helper store
默认情况下,凭据将保存在~/.git-credentials
中。它将被创建和写入。
请注意,使用此帮助程序会将未加密的密码存储在磁盘上,仅受文件系统权限的保护。如果这可能不是一个可接受的安全权衡。
答案 21 :(得分:0)
正如许多用户所说,您只需将您的git存储库URL从https更改为SSH。
如果您尚未在计算机中生成SSH密钥,那么您将不得不这样做。
作为附加信息,在执行此更改后,我仍然遇到相同的错误:权限被拒绝。
就我而言,问题是我使用Windows Shell执行ngh命令;由于此命令应打开请求SSH短语的提示,并且Windows Shell不会打开此类提示,因此身份验证失败。
所以,我只需要打开git shell并在那里执行ngh命令,每次请求它时都会在提示符中输入SSH短语并且“voilà”......它运行正常!
答案 22 :(得分:0)
# 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
答案 23 :(得分:0)
如果您克隆了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
现在,您可以轻松地从存储库中进行推送并获取所有详细信息。
答案 24 :(得分:0)
如果您在Windows下使用git(例如git bash) (如果你不想从https切换到ssh)
你也可以使用https://github.com/Microsoft/Git-Credential-Manager-for-Windows
此应用程序将为您保留用户名和密码...