Git一直提示我输入密码

我已经使用Git一段时间了,但是不断的密码请求开始让我发疯。

我正在使用Mac OS X和GitHub,我按照GitHub设置Git页面的指示设置了Git和我的SSH密钥。

我还将githubSSH密钥添加到我的Mac OS X钥匙串中,如GitHub的SSH密钥密码页所述。我的公钥在Git中注册。

尽管如此,每次我尝试Git拉取时,我都必须输入我的用户名和密码。除了SSH密钥之外,我还需要为此设置其他东西吗?

482409 次浏览

我想你可能有错误的Git存储库URL。

打开.git/config并找到[远程“起源”]部分。确保您使用的是SSH:

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

如果单击克隆或下载并选择ssh,您可以在存储库的主页中看到SSHURL。

而不是httpsgit

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

您现在可以使用只是验证SSH密钥而不是用户名和密码。

如果Git抱怨'origin' has already been added,打开.config文件并将[remote origin]之后的url = "..."部分编辑为url = ssh://github/username/repo.git


其他服务也是如此。确保地址看起来像:protocol://something@url

例如.git/config代表Azure运营模式:

[remote "origin"]url = https://mystore@dev.azure.com/mystore/myproject/fetch = +refs/heads/*:refs/remotes/origin/*

配置credential.helper

在OS X(现在是macOS)上,在终端中运行:

git config --global credential.helper osxkeychain

它使Git能够使用文件Keychain.app来存储用户名和密码,并从钥匙串中检索SSH密钥的密码。

对于Windows使用:

git config --global credential.helper wincred

Linux使用:

git config --global credential.helper cache // If you want to cache the credentials for some time (default 15 minutes)

git config --global credential.helper store // if you want to store the credentials for ever (considered unsafe)

注意:第一种方法将在内存中缓存凭据,而第二种方法将以纯文本格式将它们存储在~/.git-credentials中。

检查这里以获取有关Linux方法的更多信息。
查看这里以获取有关所有三个的更多信息。

故障排除

如果正确配置了Git凭据助手,macOS会将密码保存在钥匙串中。有时SSH和存储在钥匙串中的密码之间的连接可能会中断。运行ssh-add -Kssh-add ~/.ssh/id_rsa以再次将密钥添加到钥匙串。

macOS v10.12(Sierra)更改为ssh

对于macOS v10.12(Sierra),每次重新启动后都需要运行ssh-add -K。要避免这种情况,请使用此内容创建~/.ssh/config

Host *AddKeysToAgent yesUseKeychain yesIdentityFile ~/.ssh/id_rsa

从10.12.2的ssh_configman页面:

使用钥匙串

在macOS上,指定系统在尝试使用特定密钥时是否应在用户的钥匙串中搜索密码。当密码由用户提供时,此选项还指定密码是否应在验证正确后存储到钥匙串中。参数必须为“是”或“否”。默认值为“否”。

Apple添加了Technote 2449来解释发生了什么。

在macOS Sierra之前,ssh会显示一个对话框,询问您的密码,并提供将其存储到钥匙串中的选项。此UI前已被弃用并已被删除。

我认为你解决了你的问题,但我看不到这里的解决方案对我有帮助,所以在这里。

输入终端:

echo "" > ~/.ssh/known_hosts

这将清空您的known_hosts文件,您必须添加您使用并连接到的每个主机,但它解决了问题。

使用:用适当的主机名替换github.com

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

我同意“codehugger”并使用“orkoden”的指令,它对我有效-在NetBeans 7.3上-当你右键单击文件并选择上下文菜单-推送-打开“推送到远程”窗口-这里有两个选项:

  1. origin:https://github.com/myaccount/myproject.git/

  2. https://github.com/myaccount/myproject.git/

如您所见,区别在于URL中的原始参数-您不想选择此选项(1)您想检查选项(2),这对我来说很好。

Windows和GitHub上使用SSH推送/拉取的Git指南:Windows上的Git图解指南

  1. 下载并安装PuTTY
  2. 设置环境变量'GIT_SSH'='path\to\plink.exe'(在已安装的油灰文件夹中)-非常重要!!!
  3. 重新启动Windows资源管理器使环境变量生效(不能只重新启动命令提示符)
  4. 运行puttygen.exe生成新密钥,将公共密钥复制到GitHub站点
  5. 将这个新的私人密钥保存在磁盘上的某个安全位置(最好不要Dropbox
  6. 运行putty.exe并将SSH连接到github.co
  7. 通过运行“shell:启动”快速进入启动文件夹。
  8. 通过pageant使用Windows启动您的私钥。在启动文件夹中创建一个语法为“path\to\pageant.exe”“path\to\Private atekey”的快捷方式
  9. 我们不需要在我们的存储库的. git/config中设置“puttykeyfile”设置
  10. 非常重要是使用GitHub的“SSH克隆URL”而不是HTTPS。

Orkoden关于在您的终端中使用带有Git的钥匙串的答案不完整并引发错误。这是您必须做的,以将您在终端中输入的用户名和密码保存在钥匙串中:

curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychainsudo mv git-credential-osxkeychain /usr/local/binsudo chmod u+x /usr/local/bin/git-credential-osxkeychain

然后输入

git config --global credential.helper osxkeychain

如果你已经在curl之前使用Git配置完成了这部分,那就没问题了;它会起作用的。

正如其他人所说,您可以安装密码缓存助手。我主要是想发布其他平台的链接,而不仅仅是Mac。我正在运行一个Linux服务器,这很有帮助:在Git中缓存您的GitHub密码

对于Mac:

git credential-osxkeychain

windows:

git config --global credential.helper wincred

Linux:

git config --global credential.helper cachegit config --global credential.helper 'cache --timeout=3600'# Set the cache to timeout after 1 hour (setting is in seconds)

windows forgit 1.7.9+中,在命令提示符上运行以下命令以在文本编辑器中打开配置文件:

git config --global --edit

然后在文件中,如果不存在,则添加以下块或相应地编辑它:

[credential "https://giturl.com"]username = <user id>helper = wincred

保存并关闭文件。在上述更改后,您只需要提供一次凭据。

第1步:检查您当前的配置

cat .git/config

您将获得:

[core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = trueignorecase = trueprecomposeunicode = true[remote "origin"]url = https://github.com/path_to_your_git.gitfetch = +refs/heads/*:refs/remotes/origin/*[user]name = your_usernameemail = your_email[branch "master-staging"]remote = originmerge = 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

如static_rtti所说,改变

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

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

我自己将. git/config文件中的https更改为ssh,但它仍然不起作用。然后我看到您必须github.com更改为git@github.com。获取实际正确URL的一个好方法是转到您的项目页面并单击以下内容:

将HTTPS更改为SSH以获取正确的URL

然后将此URL添加到配置文件中。

根据您的配置,有不同类型的身份验证。以下是一些:

  1. git credential-osxkeychain

    如果您的凭据无效,请通过以下方式将其删除:

      git credential-osxkeychain erase

    或:

      printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase

    所以Git不会再问你钥匙串权限了。然后重新配置它。

    查看:从OS X钥匙串更新凭据在GitHub

  2. 您的SSHRSA密钥。

    为此,您需要将您的SSH密钥与您添加的密钥进行比较,通过ssh-add -L/ssh-add -l检查您是否使用了正确的标识。

  3. 您的HTTPS身份验证(如果您使用的是https而不是ssh协议)。

    使用~/.netrc(Windows上的%HOME%/_netrc)来提供您的凭据,例如:

      machine stash1.mycompany.comlogin myusernamepassword mypassword

Learn more: Syncing with GitHub at Stack Overflow.

在您可以将密钥用于GitHub之前,请按照教程测试你的SSH连接中的此步骤操作:

$ ssh -T git@github.com# Attempts to ssh to GitHub

当我升级到macOS v10.12(Sierra)时发生了这种情况。看起来SSH代理在升级时被清除了。

$ ssh-add -LThe agent has no identities.

简单地运行ssh-add找到了我现有的身份。我输入了密码,可以再去一次。

git config credential.helper store

注意:虽然这很方便,但Git会将您的凭据以明文形式存储在您的项目目录下的本地文件(. git-凭据)中(请参阅下面的“home”目录)。如果您不喜欢这样,请删除此文件并切换到使用缓存选项。

如果您希望Git在每次需要连接到远程存储库时继续询问您的凭据,您可以运行以下命令:

git config --unset credential.helper

要将密码存储在%HOME%目录而不是项目目录中的. git凭据中:使用--global标志

git config --global credential.helper store

还要查找向您询问密码的人。是Git还是您的SSH代理?

在我的情况下,每次我做git pull时,它都在问我:

Enter passphrase for key '/work/username/.ssh/id_rsa':

所以我以为是Git要求密码。所以我一直在寻找解决方案,后来才意识到我的SSH代理已经关闭。可以使用eval $(ssh-agent)ssh-add修复,如给定这里。所示

我还粘贴下面的一个小片段,您可以添加到您的~/.bashrc文件(或等效文件),以确保您的SSH代理在您的登录时启动。

无论如何,这是我犯的一个非常愚蠢的错误,但是把它贴在这里,以防万一它能帮助某人节省一些时间,避免像我一样在错误的树上吠叫。

# Start the ssh-agentfunction start_agent {echo "Initializing new SSH agent..."
# Spawn ssh-agent/usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}echo succeededchmod 600 ${SSH_ENV}. ${SSH_ENV} > /dev/null/usr/bin/ssh-add}
if [ -f "${SSH_ENV}" ]; then. ${SSH_ENV} > /dev/nullps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {start_agent;}elsestart_agent;fi

使用以下命令增加超时时间,以便您可以重新输入密码一段时间

git config --global credential.helper 'cache --timeout 3600'

我把它用在比特桶和GitHub上,它对两者都有效。你唯一需要做的就是3600以秒为单位。将其增加到您想要的任何程度。我将其更改为259200,大约30天。这样我每30天左右重新输入一次密码。

如果您使用的是Windows,而这突然开始在GitHub上突然发生,这可能是由于GitHub最近在2018-02-22上的禁用对不建议使用的加密算法的支持,在这种情况下,解决方案只需下载并安装最新版本的完整Git for Windows或者只是适用于Windows的Git Credential Manager

我觉得static_rtti提供的答案在某种意义上是hacky。我不知道这是否早些时候可用,但Git工具现在提供凭据存储。

缓存模式

$ git config --global credential.helper cache

使用“缓存”模式将凭据保留在内存中一段时间。没有一个密码存储在磁盘上,15分钟后它们会从缓存中清除。

存储模式

$ git config --global credential.helper 'store --file ~/.my-credentials'

使用“存储”模式将凭据保存到磁盘上的纯文本文件中,它们永远不会过期。

我个人使用了存储模式。我删除了我的存储库,克隆了它,然后不得不输入一次我的凭据。

参考:7.14 Git工具-凭证存储

如果每次您尝试与GitHub交互时,Git都会提示您输入用户名和密码,那么您可能正在为您的存储库使用HTTPS克隆URL。

使用HTTPS远程URL有一些优点:它比SSH更容易设置,并且通常通过严格的防火墙和代理工作。但是,每次拉取或推送存储库时,它也会提示您输入GitHub凭据。

您可以配置Git为您存储密码。对于windows

git config --global credential.helper wincred

在WindowsLinux子系统(WSL)上,这是我发现的唯一可行的解决方案:

eval `ssh-agent`; ssh-add ~/.ssh/id_rsa

这是一个ssh代理没有在WSL中正确注册的问题。

如果您想为GitHub存储库的登录凭据阻止Git总是问,这可以很容易地完成。

使用SSH而不是HTTPS

您可以使用SSH而不是HTTPS更新源远程”

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

配置Git以存储您的密码和用户名

以下是如何让Git存储用户名和密码:

git config --global credential.helper store

接下来,保存会话的用户名和密码:

git config --global credential.helper cache

Microsoft Stack解决方案(Windows和Azure运营模式)

首先打开.git/config文件以确保地址如下:

protocol://something@url

例如,Azure运营模式的. git/config:

[remote "origin"]url = https://mystore@dev.azure.com/mystore/myproject/fetch = +refs/heads/*:refs/remotes/origin/*

如果问题仍然存在,请打开Windows凭证管理器,单击名为Windows凭据的保险箱并删除所有与git相关的凭据。

现在下次你登录到git时,它就不会再消失了。

运行macOS Catoline 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

希望这有帮助!

如果您设置了SSH代理,您还可以将其添加到~/.gitconfig中,以强制git对所有GitHub存储库使用SSH而不是HTTPS:

[url "ssh://git@github.com/"]insteadOf = git://github.com/insteadOf = https://github.com/

(如果您主要使用公共存储库,您也可以使用pushInsteadOf而不是insteadOf,因为从公共存储库读取可以在没有身份验证的情况下完成)。

我遇到了同样的问题。MacOS Mojave钥匙串一直在询问密码。您的id_rsa应该使用密码进行加密以确保安全。然后尝试将其添加到钥匙串ssh-add -K ~/.ssh/id_rsa

如果您的密钥在~/. ssh以外的另一个文件夹中,请替换为正确的文件夹。

钥匙串现在知道你的ssh密钥,希望现在一切正常。

如果您仍然面临这个问题,请尝试

1. brew install keychain
2. echo '/usr/local/bin/keychain $HOME/.ssh/id_rsa' >> ~/.bash_profileecho 'source $HOME/.keychain/$HOSTNAME-sh' ~/.bash_profile
3. ssh-add -K ~/.ssh/id_rsa

希望它现在能起作用。

更新时间:-K标志已被弃用。请改用以下内容:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519 # path to private key

如果您使用https协议,Git会提示您输入密码。如果您使用ssh,它将进行身份验证使用您的私钥而不是要求密码

以下是如何解决这个问题:

git remote -v

这将显示原始URL。您会注意到此URL中的https。(这里的例子

现在,您必须先删除它并添加带有ssh的URL

git remote remove origin
git remote add origin git@github.com:PrestaShop/PrestaShop.git

我遇到了这个问题。一个存储库每次都要求我输入凭据。我所有的其他存储库都没有要求我的凭据。它们甚至被设置为在相同的帐户凭据下使用HTTPS跟踪GitLab,所以奇怪的是,除了一个之外,它们都工作得很好。

比较. git/config文件,我发现导致问题的URL有两个关键差异:

要求提供凭据:

https://gitlab.com/myaccount/myproject

不要求凭据:

https://myaccount@gitlab.com/myaccount/myproject.git

所以在我的案例中添加“mybank@”和“. git”解决了这个问题。

在我的情况下,当我尝试樱桃采摘一个URL时,我总是得到一个密码提示,如下所示:

git fetch http://username@gerrit-domainname/repositoryname refs/changes/1/12345/1 && git cherry-pick FETCH_HEAD

这个URL在不同的机器上使用时效果很好。然而,在我结束时,当我尝试使用正确的密码abc@12345时,我经常遇到以下错误:

remote: Unauthorizedremote: 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大不相同

说明:我的URL以git fetch ...开头,因此,此解决方案可能适用于URL以git fetch ...开头的git签出/下载

面对同样的问题。

请确保您已正确设置远程来源:

$git remote add origin master "https://...git "

在Windows机器中:安装GitHub CLI

choco install gh

然后运行命令:

gh auth login

并遵循指示

你也可以点击这个链接:

https://cli.github.com/manual/gh_auth_login