协慌网

登录 贡献 社区

Git 不断提示我输入密码

我已经使用 Git 一段时间了,但是不断要求输入密码的人开始把我推向高潮。

我使用的是 Mac OS X 和 GitHub,并按照 GitHub 的 “设置 Git” 页面的说明设置了 Git 和 SSH 密钥。

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

不过,每次我尝试 Git 拉时,都必须输入用户名和密码。我需要为此设置除 SSH 密钥以外的其他东西吗?

答案

我认为您可能使用了错误的 Git 存储库 URL。

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

ssh://[email protected]/username/repo.git

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

而不是httpsgit one:

https://github.com/username/repo.git
git://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 DevOps:

[remote "origin"]
    url = https://[email protected]/mystore/myproject/
    fetch = +refs/heads/*:refs/remotes/origin/*

## 配置 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

ssh_config man页中:

UseKeychain

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

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

在 macOS Sierra 之前, ssh将显示一个对话框,询问您的密码短语,并提供将其存储到钥匙串中的选项。此用户界面在一段时间前已过时,已被删除。

当我升级到 macOS v10.12(Sierra)时,这发生在我身上。看起来 SSH 代理已在升级时清除。

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

只需运行ssh-add找到我现有的身份。我输入了密码,很高兴再次尝试。