我使用Git已经有一段时间了,但不断的密码请求开始让我感到很烦。
我使用的是Mac OS X和GitHub,我按照GitHub的设置Git页面的指示设置Git和SSH密钥。
我还将github SSH密钥添加到了我的Mac OS X密钥链中,正如github的SSH密钥密码页面中提到的那样。我的公钥已在Git中注册。
然而,每次我尝试Git拉时,我都必须输入用户名和密码。除了SSH密钥之外,我是否需要为此设置其他东西?
我使用Git已经有一段时间了,但不断的密码请求开始让我感到很烦。
我使用的是Mac OS X和GitHub,我按照GitHub的设置Git页面的指示设置Git和SSH密钥。
我还将github SSH密钥添加到了我的Mac OS X密钥链中,正如github的SSH密钥密码页面中提到的那样。我的公钥已在Git中注册。
然而,每次我尝试Git拉时,我都必须输入用户名和密码。除了SSH密钥之外,我是否需要为此设置其他东西?
当前回答
步骤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
其他回答
我觉得static_rtti提供的答案在某种意义上很粗糙。我不知道这是否在早期可用,但Git工具现在提供了凭据存储。
缓存模式
$ git config --global credential.helper cache
使用“缓存”模式将凭据保存在内存中一段时间。没有一个密码存储在磁盘上,15分钟后将从缓存中清除。
存储模式
$ git config --global credential.helper 'store --file ~/.my-credentials'
使用“存储”模式将凭据保存到磁盘上的纯文本文件中,它们永远不会过期。
我个人使用的是商店模式。我删除了存储库,克隆了它,然后必须输入一次凭据。
参考:7.14 Git工具-凭证存储
还要查找是谁向您索要密码。是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
Microsoft Stack解决方案(Windows和Azure DevOps)
首先打开.git/config文件,确保地址如下:
protocol://something@url
例如,Azure DevOps的.git/config:
[remote "origin"]
url = https://mystore@dev.azure.com/mystore/myproject/
fetch = +refs/heads/*:refs/remotes/origin/*
如果问题仍然存在,请打开Windows凭据管理器,单击名为Windows凭据的安全框并删除所有与git相关的凭据。
下次登录git时,它不会再消失。
面临着同样的问题。
请确保已正确设置远程原点:
$git remote add origin master "https://...git "
配置凭据帮助程序
在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)
OR
git config --global credential.helper store // if you want to store the credentials for ever (considered unsafe)
注意:第一种方法将在内存中缓存凭据,而第二种方法将以纯文本格式将它们存储在~/.git凭据中。
查看此处了解有关Linux方法的更多信息。查看此处以了解有关这三个方面的更多信息。
故障排除
如果Git凭据助手配置正确,macOS会将密码保存在密钥链中。有时SSH和密钥链中存储的密码之间的连接可能会中断。运行ssh-add-K或ssh-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手册页:
使用钥匙链
在macOS上,指定当尝试使用特定密钥时,系统是否应在用户的密钥链中搜索密码短语。当用户提供密码短语时,此选项还指定密码短语在验证正确后是否应存储到密钥链中。参数必须为“yes”或“no”。默认值为“no”。
苹果增加了Technote 2449,解释了发生的事情。
在macOSSierra之前,ssh将显示一个对话框,询问您的密码,并提供将其存储到密钥链中的选项。此UI在一段时间前被弃用,现已删除。