我使用Git已经有一段时间了,但不断的密码请求开始让我感到很烦。

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

我还将github SSH密钥添加到了我的Mac OS X密钥链中,正如github的SSH密钥密码页面中提到的那样。我的公钥已在Git中注册。

然而,每次我尝试Git拉时,我都必须输入用户名和密码。除了SSH密钥之外,我是否需要为此设置其他东西?


当前回答

在Windows Subsystem for Linux(WSL)上,这是我发现的唯一可行的解决方案:

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

这是ssh代理未在WSL中正确注册的问题。

其他回答

我想你解决了你的问题,但我看不到能帮我的解决方案,所以就在这里。

键入终端:

echo "" > ~/.ssh/known_hosts

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

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

对于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)

如果你想阻止Git总是要求你提供GitHub存储库的登录凭据,这很容易做到。

使用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

我认为您可能有错误的Git存储库URL。

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

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

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

而不是https或git:

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@网址

例如,Azure DevOps的.git/config:

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

还要查找是谁向您索要密码。是Git还是SSH代理?

就我而言,每次我做git pull时,它都会问我:

输入密钥“/work/username/.ssh/id_rsa”的密码:

所以我假设是Git要求密码。所以我一直在寻找解决方案,后来才发现我的SSH代理已经关闭。可以使用eval$(ssh-agent)和ssh-add进行修复,如下所示。

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

无论如何,这是我犯的一个相当愚蠢的错误,但把它张贴在这里,以防有人像我一样,从找错树上节省一些时间。

# 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