Git一直提示我输入密码

825

我已经使用Git有一段时间了,但是不停地要求输入密码让我感到非常烦恼。

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

我还像GitHub的SSH key passphrases页面上提到的那样,将github SSH 密钥添加到了我的Mac OS X密钥链中。我的公钥已在Git中注册。

尽管如此,每次我尝试Git pull时,都需要输入我的用户名和密码。除了SSH密钥之外,还需要设置其他内容吗?


1
有点儿傻的问题,但是你验证过使用ssh连接到git机器时SSH密钥是否有效吗? - Kurt Stutsman
4
你是说类似于 ssh -T git@github.com 这样的东西吗?没错,这个方案完全可行(虽然有点慢)。 - Catherine
2
请参阅Git push需要用户名和密码 - user456814
对于https url,你可以使用(git1.8.3+)一个git凭证助手“netrc”。在这里查看完整示例 - VonC
1
我是一名Windows用户,即使将我的公钥添加到服务器的authorized_keys文件中,我仍然遇到了密码请求问题。实际上问题在于我没有将我的公/私密钥保存在c:\program files\git文件夹下的.ssh文件夹中。如果有人面临此类问题,请将您的密钥复制到此文件夹并尝试推送/拉取操作。 - Raja Amer Khan
显示剩余6条评论
32个回答

931

我认为你可能使用了错误的Git仓库URL。

打开 .git/config 并找到 [remote "origin"] 部分。确保你正在使用SSH连接:

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

如果您点击“克隆或下载”并选择“SSH”,则可以在仓库的主页面上看到SSH URL。

而不是httpsgit

https://github.com/username/repo.git
git://github.com/username/repo.git
你现在可以使用仅SSH密钥而不是用户名和密码进行验证。
如果Git抱怨“origin已经被添加”,则打开.config文件并在[remote origin]后的url = "..."部分中将其编辑为url = ssh://github/username/repo.git。
其他服务也是如此。确保地址看起来像:protocol://something@url
例如,Azure DevOps的.git/config:
[remote "origin"]
    url = https://mystore@dev.azure.com/mystore/myproject/
    fetch = +refs/heads/*:refs/remotes/origin/*

5
可能是这样的。当我输入 git remote -v 后,出现以下内容:origin https://github.com/Foo/Bar.git (fetch)
origin https://github.com/Foo/Bar.git (push) 然而,要使用SSH,应该是如下所示:origin git@github.com:Foo/Bar.git (fetch)
origin git@github.com:Foo/Bar.git (push) 这可能是因为我最初使用GitHub的Mac应用程序(http://mac.github.com/)检出了我的项目。有什么办法可以解决吗?
- Catherine
9
可以通过以下方法之一来解决问题:修复.git/config文件中的URL、使用git-remote命令进行修复,或者删除本地仓库并使用正确的URL重新克隆。 - static_rtti
105
为了明确说明(因为我需要它):打开.git/config文件,在“[remote "origin"]”部分设置“url = ssh://git@github.com/username/Repo.git”。这对我有效。 - Greg K
17
奇怪的是,@GregK的解决方案对我不起作用,但是url = git@github.com:organization/Repo.git可以。虽然他让我朝着正确的方向前进,但还是要为这个解决方案点赞!成功了! - jamesmortensen
3
使用ssh://git@github/[username]/[reponame].git克隆存储库非常重要,如果您想使用密钥访问GIT而不必每次输入用户名和密码。我强调这一点非常重要。如果有问题,唯一的解决方法是删除本地存储库并重新克隆$ git clone ssh://git@github/[username]/[reponame].git。 - Gene Myers
显示剩余8条评论

657

配置credential.helper

在OS X(现在的macOS)中,在终端(Terminal)中运行此命令:

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 yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_rsa

来自10.12.2的ssh_config man页面:

UseKeychain

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

苹果已经添加了Technote 2449,解释了发生了什么。

在macOS Sierra之前,ssh会弹出一个对话框询问您的密码短语,并提供将其存储到钥匙串中的选项。这个UI已经被弃用了很长时间,现在已经被移除。


34
这绝对是最好的方法,因为Github应用程序(也许Windows版也一样)默认使用git repos的https路径。而且,使用https而不是ssh/git也有很好的理由,因为许多企业网络出于安全原因只允许在端口80和443上进行通信。 - codehugger
2
你需要使用 Git 1.7.10 或更高版本才能使用凭证助手。 - jbandi
3
对于keychain.app解决方案给予+1支持。对我来说这非常好,因为我的雇主的git服务器仅支持通过apache提供的http,并且他们强烈反对使用将密码以明文放置的.netrc文件方法。 - Josh
3
注意,我得到了错误提示'credential-osxkeychain' is not a git command.,因为我没有安装凭证助手。我按照这里的说明进行安装:https://help.github.com/articles/set-up-git#password-caching - Hugh
2
@AndreyLuiz 你知道在Linux中怎么做吗? - Tommaso Thea Cioni
显示剩余12条评论

161

我在升级到macOS v10.12 (Sierra)后遇到了这个问题。看起来是SSH代理在升级时被清除了。

$ ssh-add -L
The agent has no identities.

运行ssh-add,找到了我的现有身份验证信息。我输入密码,然后就可以再次使用了。


10
由于 Sierra 升级导致 +1 (软件)出现问题。请注意,这里的密码是您的 SSH 密钥密码,而非您的 Mac 用户密码。 - mbonness
1
执行ssh-add命令是有效的,但似乎在关闭终端窗口后会被重置。也许这是一个新的“特性”。 - joshd
我收到了同样的消息,但我的电脑在上周末更新OSX后出现了故障。 - Jonathan Escobedo
在升级macOS Sierra后,这对我也起作用了。 - Azul
1
我刚刚将我的MacBook Pro更新到了10.12.2,结果它破坏了我的Git。使用ssh-add完全解决了我的问题。感谢@amcc! - jimmyplaysdrums
显示剩余4条评论

76

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

对于Mac:

git credential-osxkeychain

Windows:

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)

11
我不得不向下滚动到第三个答案才看到Linux的说明,由于这是一个常被引用的问题,应该将这些说明放在主要答案中。 - KoldBane

74
使用这个:将github.com替换为适当的主机名
git remote set-url origin git@github.com:user/repo.git

1
我在查看git remote -v时已经设置过了,但是仍然要求我输入密码。 - IgorGanapolsky
1
一样的,我已经按照他建议的设置了,但是我仍然会收到密码提示,我该如何防止这种情况发生? - code-8
1
@IgorGanapolsky:你找到解决方案了吗? - code-8
2
这个正常工作。奇怪的是,使用 git@** 的远程 URL 不会提示凭据,而使用 https@** 的 URL 则会 :). 因此,我找到了这篇文档 - Sujit Kumar Singh

29

同时找出要求您输入密码短语的来源是谁。是Git还是您的SSH代理?

在我的情况下,每次我执行git pull都会询问我:

为密钥'/work/username/.ssh/id_rsa'输入密码短语:

所以我假设是Git要求输入密码短语。于是我不断寻找解决方案,直到后来我意识到我的SSH代理已关闭。可以使用eval $(ssh-agent)ssh-add修复,如此处所示。

此外,我在下面粘贴了一小段代码,您可以将其添加到您的~/.bashrc文件(或等价文件)中,以确保在登录时启动您的SSH代理。

无论如何,这是我犯的一个相当愚蠢的错误,但我在这里发帖,以防能帮助某人节省一些时间,就像我曾经做过的那样。

SSH_ENV="$HOME/.ssh/environment"

# 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


1
很确定你在上面的代码中漏掉了一行 - 根据 https://dev59.com/iGMk5IYBdhLWcg3w5Bzy#18915067,你需要有 SSH_ENV="$HOME/.ssh/environment" - kellyfj

23
git config credential.helper store

注意: 尽管这很方便,但 Git 会以明文形式存储你的凭据于本地文件 (.git-credentials) 中,该文件位于你的项目目录下(参见下文中的“home”目录)。如果你不喜欢这种方式,请删除该文件并切换至使用缓存选项。

如果你希望每次需要连接到远程仓库时 Git 都要求你输入凭据,请运行以下命令:

git config --unset credential.helper

如果要将密码存储在位于%HOME%目录而非项目目录中的.git-credentials文件中,可以使用--global标志。

git config --global credential.helper store

11

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

git config --global --edit

如果该块不存在,请在文件中添加以下内容,或根据需要进行编辑:

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

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


这太完美了,你节省了我的时间,现在我可以集中精力工作了,非常感谢兄弟。 - Mohammed Sufian
这对我没有用。"错误:编辑器'"D:/Programs/GitExtensions/GitExtensions.exe" fileeditor'"有问题。 - bikeman868

11

使用以下命令增加超时时间,这样您就可以在一段时间内重新输入密码。

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

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


2
好的,我发现这在重启后不会持久化,所以无论超时如何,您仍然需要在重启后输入密码... - Ben Winding
这是一种很好的缓存方式 :) 至少节省了我的时间。谢谢 - ChikuMiku
因为它将凭据存储在内存中。 - z3dd

10

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

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

现在没有人应该再使用Putty了。你现在可以使用内置的Windows 10实用程序完成所有操作。让Putty只是Putty。 - Ian Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接