我现在已经使用Git一段时间了,但是不断要求输入密码开始让我陷入困境。
我正在使用OSX和Github,我按照GitHub Set Up Git page的指示设置了Git和我的SSH密钥。我还在我的Mac OSX钥匙串中添加了github SSH密钥,如GitHub's SSH key passphrases page所述。我的公钥已在Git注册。
然而,每当我尝试git pull时,我都要输入我的用户名和密码。我需要为此设置除SSH密钥以外的东西吗?
答案 0 :(得分:723)
我想你可能有错误的git repo url。
打开.git/config
并找到[远程“原点”]部分。确保您使用的是SSH
:
ssh://git@github.com/username/repo.git
如果点击clone or download
并选择ssh
而不是https
或git
一个:
https://github.com/username/repo.git
git://github.com/username/repo.git
您现在可以使用 SSH Key
而不是username
和password
进行验证。
[编辑:] 如果Git抱怨'origin' has already been added
,请打开.config
文件,然后在url = "..."
之后编辑[remote origin]
部分{{1} 1}}
答案 1 :(得分:515)
在OS X(现在是macOS)上,在终端
中运行它git config --global credential.helper osxkeychain
它使git能够使用Keychain.app存储用户名和密码,并从密钥链中将密码短语检索到私有ssh密钥。
对于Windows使用:
git config --global credential.helper wincred
如果正确配置了git凭证帮助程序,macOS会将密码保存在密钥链中。有时connection between ssh and the passphrases stored in the keychain会破坏。运行ssh-add -K
或ssh-add ~/.ssh/id_rsa
将密钥再次添加到钥匙串。
对于macOS 10.12 Sierra ssh-add -K
需要在每次重启后运行。为避免这种情况,请使用此内容创建~/.ssh/config
。
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
来自10.12.2的ssh_config
man
页面:
<强> UseKeychain 强>
在macOS上,指定系统在尝试使用特定键时是否应在用户的钥匙串中搜索密码。当用户提供密码短语时,此选项还指定密码短语一旦被验证为正确,是否应存储在密钥链中。论证必须是“是”或“否”。默认值为“no”。
Apple添加了Technote 2449来解释发生了什么。
在macOS Sierra之前,ssh会显示一个对话框,询问您的密码,并提供将其存储到钥匙串中的选项。此UI已在不久前弃用,已被删除。
答案 2 :(得分:120)
当我升级到macOS Sierra时发生了这种情况。看起来ssh代理在升级时已被清除。
$ ssh-add -L
The agent has no identities.
只需运行ssh-add
找到我现有的身份,输入密码即可再次使用。
答案 3 :(得分:62)
使用此选项:将github.com替换为相应的主机名
git remote set-url origin git@github.com:user/repo.git
答案 4 :(得分:39)
正如其他人所说,您可以安装密码缓存助手。我大多只想发布其他平台的链接,而不仅仅是mac。我正在运行Linux服务器,这很有帮助: https://help.github.com/articles/caching-your-github-password-in-git/#platform-linux
对于mac:
git credential-osxkeychain
视窗:
git config --global credential.helper wincred
Linux的:
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)
答案 5 :(得分:17)
还要找谁问你的密码短语。是git还是你的SSH代理?
就我而言,每次我git pull
时都会问我:
Enter passphrase for key '/work/username/.ssh/id_rsa':
所以我认为是git要求密码。所以我一直在寻找解决方案,后来才意识到我的SSH代理已经关闭了。可以使用eval $(ssh-agent)
和ssh-add
作为给定here.
此外,我会粘贴到您的〜/ .bashrc(或等效内容)下面的一小段内容,以确保您的登录时启动了ssh-agent。
在任何情况下,这都是我犯的一个非常愚蠢的错误,但是在这里发布,以防万一它可以帮助别人节省一些时间来咆哮错误的树,就像我一样。
# start the ssh-agent
function start_agent {
echo "Initializing new SSH agent..."
# spawn ssh-agent
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
echo succeeded
chmod 600 ${SSH_ENV}
. ${SSH_ENV} > /dev/null
/usr/bin/ssh-add
}
if [ -f "${SSH_ENV}" ]; then
. ${SSH_ENV} > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
答案 6 :(得分:13)
Linux
注意:虽然这很方便,但Git会将您的凭据以明文形式存储在项目目录下的本地文件(.git-credentials)中(请参阅下面的&#34; home&#34;目录)。如果您不喜欢这样,请删除此文件并切换到使用缓存选项。
如果您希望Git在每次需要连接到远程存储库时都要求您提供凭据,则可以运行以下命令:
git config credential.helper store
将密码存储在%HOME%目录中的.git-credentials中而不是项目目录中:使用--global标志
git config --unset credential.helper
答案 7 :(得分:9)
使用SSH推送/拉取git on windows和Github的指南 http://nathanj.github.io/gitguide/tour.html
答案 8 :(得分:8)
在windows for git 1.7.9+中,在命令提示符下运行以下命令,在文本编辑器中打开配置文件:
git config --global --edit
然后在文件中添加以下块(如果不存在)或相应地编辑
[credential "https://giturl.com"]
username = <user id>
helper = wincred
保存并关闭文件。 在上述更改后,您只需提供一次凭证。
答案 9 :(得分:6)
使用以下命令增加超时时间,以便您可以重新键入密码
git config --global credential.helper 'cache --timeout 3600'
我将它用于Bitbucket和Github它适用于两者。你唯一需要做的就是
3600
以秒为单位,将其增加到您想要的任何程度。我将其更改为259200
大约30天。这样我每隔30天就会重新输入一次密码。
答案 10 :(得分:4)
我认为你已经解决了问题,但是我没有看到这里的解决方案对我有帮助,所以在这里。
输入终端:
echo "" > ~/.ssh/known_hosts
这将清空您的known_hosts
文件,您必须添加您使用并连接的每个主机,但它解决了问题。
答案 11 :(得分:4)
我有同样的问题。 MacOS Mojave钥匙串不断要求输入密码。为了安全起见,您的id_rsa应该使用密码加密。
然后尝试将其添加到钥匙串ssh-add -K ~/.ssh/id_rsa
如果密钥位于〜/ .ssh以外的其他文件夹中,请替换为正确的文件夹。
Keychain现在知道您的ssh密钥,希望现在一切正常。
如果您仍然遇到问题,请尝试
1. brew install keychain
2. echo '/usr/local/bin/keychain $HOME/.ssh/id_rsa' >> ~/.bash_profile
echo 'source $HOME/.keychain/$HOSTNAME-sh' ~/.bash_profile
3. ssh-add -K ~/.ssh/id_rsa
希望它现在可以正常工作。
答案 12 :(得分:4)
如果您想stop Git from always asking来获取GitHub存储库的登录凭据,则可以轻松完成。
您可以使用SSH而不是HTTPS来更新源远程”。
git remote set-url origin git@github.com:username/your-repo.git
以下是让Git存储用户名和密码的方法:
git config --global credential.helper store
下一步,保存会话的用户名和密码:
git config --global credential.helper cache
答案 13 :(得分:3)
如上所述static_rtti,请更改
https://github.com/username/repo.git
git://github.com/username/repo.git
到
ssh://git@github.com/username/repo.git
我自己将.git / config文件中的https更改为ssh,但它仍然无效。然后我看到你必须将github.com改为git@github.com。获取实际正确URL的一个好方法是转到项目页面并单击此
Change HTTPS to SSH to get the right URL
然后将此URL添加到配置文件中。
答案 14 :(得分:3)
curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychain
sudo mv git-credential-osxkeychain /usr/local/bin
sudo chmod u+x /usr/local/bin/git-credential-osxkeychain
然后输入
git config --global credential.helper osxkeychain
如果你已经在curl之前使用git config完成了部分,那就没问题了,它会起作用
答案 15 :(得分:3)
运行macOS Cataline 10.15,钥匙串缓存方法不适用于我。我想使用https://
而不是ssh
这对我有用:
git remote rm origin
git remote add origin https://your_git_username:your_git_password@github.com/path_to_your_git.git
这也应该在GitLab上工作
请确保用户名中包含电子邮件地址,以删除@email
部分,否则您将收到错误提示URL using bad/illegal format or missing URL
。
希望这会有所帮助!
答案 16 :(得分:2)
第1步:检查您当前的配置
cat .git/config
你会得到:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = https://github.com/path_to_your_git.git
fetch = +refs/heads/*:refs/remotes/origin/*
[user]
name = your_username
email = your_email
[branch "master-staging"]
remote = origin
merge = refs/heads/master-staging
步骤2:删除远程源
git remote rm origin
步骤3:使用您的用户名和密码添加远程原点
git remote add origin https://your_git_username:your_git_password@github.com/path_to_your_git.git
答案 17 :(得分:2)
我同意“codehugger”并使用“orkoden”的说明它对我有用 - 在netbeans 7.3上 - 右键单击文件并选择上下文菜单 - 按下 - 打开“推送到远程”窗口 - 这里有2个选项
origin:https://github.com/myaccount/myproject.git/
https://github.com/myaccount/myproject.git/
正如你所看到的那样,区别在于url中的origin param - 你不想选择这个选项(1)你想检查选项(2),这对我来说很合适。我希望这有助于某人。
Dung Le。答案 18 :(得分:1)
从某种意义上讲,我觉得static_rtti提供的答案是不可靠的。不知道这是否较早可用,但是Git工具现在提供凭据存储。
缓存模式
$ git config --global credential.helper cache
使用“缓存”模式将凭据保留在内存中一定时间。密码从未存储在磁盘上,并且在15分钟后会从缓存中清除。
存储模式
$ git config --global credential.helper 'store --file ~/.my-credentials'
使用“存储”模式将凭据保存到磁盘上的纯文本文件中,它们永远不会过期。
我个人使用了商店模式。删除我的存储库,将其克隆,然后必须输入我的凭据一次。
参考:https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage
答案 19 :(得分:1)
如果您使用https
协议,Git会提示您输入密码。如果您使用ssh
,它将使用您的私钥进行身份验证,而不是要求输入密码。 (https://help.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account)
这是解决方法:
git remote -v
这将显示来源的网址。并且您会在此URL中注意到https
。 (示例:https://github.com/PrestaShop/PrestaShop.git)
现在,您只需要先删除它,然后使用ssh
git remote remove origin
git remote add origin git@github.com:PrestaShop/PrestaShop.git
答案 20 :(得分:1)
在Linux的Windows子系统(WSL)上,这是我发现可以使用的唯一解决方案:
eval
`ssh-agent` ; ssh-add ~/.ssh/id_rsa
这是ssh-agent无法在WSL中正确注册的问题。
答案 21 :(得分:1)
如果每次尝试与GitHub进行交互时Git提示您输入用户名和密码,则可能是您的存储库使用了HTTPS克隆URL。
使用HTTPS远程URL具有一些优点:它比SSH容易设置,并且通常通过严格的防火墙和代理来工作。但是,它还会提示您每次拉出或推送存储库时都输入GitHub凭据。
您可以配置Git为您存储密码。 对于Windows :
git config --global credential.helper wincred
答案 22 :(得分:1)
如果你正在使用Windows并且这突然在GitHub上突然开始发生,那可能是由于Github最近在{201} 02-22发布的disabling support for deprecated cryptographic algorithms,在这种情况下解决方案只是下载并安装完整Git for Windows的最新版本 或只是Git Credential Manager for Windows。
答案 23 :(得分:1)
在使用github密钥之前,请按照教程Testing your SSH connection中的此步骤操作:
$ ssh -T git@github.com
# Attempts to ssh to GitHub
答案 24 :(得分:0)
首先打开.git/config
文件,以确保地址看起来像:
protocol://something@url
例如.git / config for Azure DevOps:
[remote "origin"]
url = https://mystore@dev.azure.com/mystore/myproject/
fetch = +refs/heads/*:refs/remotes/origin/*
如果问题仍然存在,请打开Windows 凭据管理器,单击名为 Windows凭据的保险箱,并删除所有与git相关的凭据。
现在,下次登录git时,它将不再消失。
答案 25 :(得分:0)
如果已设置SSH代理,还可以将其添加到~/.gitconfig
中,以强制git将SSH用于所有GitHub存储库而不是HTTPS:
[url "ssh://git@github.com/"]
insteadOf = git://github.com/
insteadOf = https://github.com/
(如果您主要使用公共存储库,则也可以使用pushInsteadOf
而不是insteadOf
,因为从公共存储库读取内容无需身份验证即可完成。)
答案 26 :(得分:0)
我遇到了这个问题。一个回购协议要求我每次输入凭证。我所有其他的回购协议都不要求我提供证书。他们甚至被设置为在相同的帐户凭据下使用HTTPS跟踪GitLab,因此奇怪的是,除了一个之外,它们都工作正常。
对比.git / config文件,我发现导致问题的URL有两个主要区别:
是否要求提供凭据:
https://gitlab.com/myaccount/myproject
不要求提供凭据:
https://myaccount@gitlab.com/myaccount/myproject.git
因此,添加“ myaccount @”和“ .git”解决了我的问题。
答案 27 :(得分:0)
就我而言,当我尝试cherrypick如下所示的 URL 时,总是收到密码提示:
git fetch http://username@gerrit-domainname/repositoryname refs/changes/1/12345/1 && git cherry-pick FETCH_HEAD
当在不同的机器上挑选时,这个 URL 运行良好。但是,当我尝试使用 正确密码 abc@12345
进行挑选时,我曾经遇到以下错误:
remote: Unauthorized
remote: Authentication failed for http://username@gerrit-domainname
在我的 git 配置文件中,远程 URL 如下所示:
url = ssh://gerrit-domainname:8080/wnc
解决方案:
我通过提供在
找到的 HTTP 密码 解决了身份验证失败问题
我的 gerrit 帐户 -> 设置 -> HTTP 密码。
HTTP 密码类似于 Th+IsAduMMy+PaSS+WordT+RY+Your+OwNPaSs
,这与我的实际密码 abc@12345
注意:我的 cherrpick 网址以 git fetch ...
开头,因此,此解决方案可能适用于网址以 git fetch ...
开头的 git checkout/download