我已经使用 Git 有一段时间了,但是不断要求输入密码的请求开始让我难以接受。
我正在使用 Mac OS X 和 GitHub,并按照 GitHub 的 Set Up Git page 的指示设置了 Git 和我的 SSH 密钥。
如GitHub's SSH key passphrases page所述,我还将 github SSH 密钥添加到我的 Mac OS X 钥匙串中。我的公钥已在 Git 中注册。
尽管如此,每次我尝试 Git pull 时,我都必须输入我的用户名和密码。除了 SSH 密钥之外,我还需要为此设置什么吗?
netrc
”。请参阅 full example here。
我认为您可能有错误的 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' has already been added
,请打开 .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/*
配置 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
中。
检查 here 了解有关 Linux 方法的更多信息。
检查 here 了解有关这三种方法的更多信息。
故障排除
如果 Git 凭证助手配置正确,macOS 会将密码短语保存在钥匙串中。有时 connection between SSH and the passphrases stored in the keychain 可能会中断。运行 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
man
页面:
使用钥匙串
在 macOS 上,指定系统在尝试使用特定密钥时是否应在用户的钥匙串中搜索密码。当用户提供密码短语时,此选项还指定一旦验证正确密码短语是否应存储到钥匙串中。参数必须是“是”或“否”。默认值为“否”。
Apple 添加了 Technote 2449 来解释发生了什么。
在 macOS Sierra 之前,ssh 会显示一个对话框,询问您的密码,并提供将其存储到钥匙串中的选项。此 UI 已在一段时间前被弃用,并已被删除。
.netrc
文件方法,该方法将您的密码以明文形式保存。
'credential-osxkeychain' is not a git command.
,因为我没有安装凭证助手。我按照此处的说明进行安装:help.github.com/articles/set-up-git#password-caching
git config --global credential.helper osxkeychain
时 github 一直要求 pw 我的 .ssh
目录中的配置文件修复了我。
当我升级到 macOS v10.12 (Sierra) 时,这发生在我身上。看起来 SSH 代理在升级时被清除了。
$ ssh-add -L
The agent has no identities.
只需运行 ssh-add
即可找到我现有的身份。我输入了密码,很高兴再去一次。
使用这个:用适当的主机名替换 github.com
git remote set-url origin git@github.com:user/repo.git
git remote -v
时,我已经有了该设置。然而,我仍然被提示输入密码。
正如其他人所说,您可以安装密码缓存助手。我主要只是想发布其他平台的链接,而不仅仅是 Mac。我正在运行 Linux 服务器,这很有帮助:Caching your GitHub password in Git
对于 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 还是您的 SSH 代理?
就我而言,每次我执行 git pull
时,它都会问我:
Enter passphrase for key '/work/username/.ssh/id_rsa':
所以我认为是 Git 要求输入密码。所以我一直在寻找解决方案,后来才意识到我的 SSH 代理已经关闭。可以使用给定 here. 的 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
SSH_ENV="$HOME/.ssh/environment"
git config credential.helper store
注意:虽然这很方便,但 Git 会将您的凭据以明文形式存储在项目目录下的本地文件 (.git-credentials) 中(“主”目录见下文)。如果您不喜欢这样,请删除此文件并切换到使用缓存选项。
如果您希望 Git 在每次需要连接到远程存储库时继续询问您的凭据,您可以运行以下命令:
git config --unset credential.helper
要将密码存储在 %HOME% 目录而不是项目目录中的 .git-credentials 中:使用 --global 标志
git config --global credential.helper store
使用以下命令增加超时时间,以便您可以重新输入密码一段时间
git config --global credential.helper 'cache --timeout 3600'
我将它用于 Bitbucket 和 GitHub,它适用于两者。您唯一需要做的是 3600
在几秒钟内。将其增加到您想要的任何程度。我将其更改为 259200
大约 30 天。这样我每 30 天左右重新输入一次密码。
在 Windows for Git 1.7.9+ 中,在命令提示符处运行以下命令以在文本编辑器中打开配置文件:
git config --global --edit
然后在文件中,添加以下块(如果不存在)或相应地对其进行编辑:
[credential "https://giturl.com"]
username = <user id>
helper = wincred
保存并关闭文件。在进行上述更改后,您只需提供一次凭据。
Windows 和 GitHub 上使用 SSH 推送/拉取 Git 的指南:An Illustrated Guide to Git on Windows
下载并安装 PuTTY 设置环境变量 'GIT_SSH' = 'path\to\plink.exe' (在安装的 putty 文件夹中) - 非常重要!!!重启 Windows Explorer 使环境变量生效(不能只重启命令提示符) 运行 puttygen.exe 生成新密钥,将公钥复制到 GitHub 站点 将此新私钥保存在磁盘上安全的地方(最好不要 Dropbox) 运行 putty .exe 并将 SSH 连接到 github.co 通过运行“shell:startup”快速进入启动文件夹。通过选美使您的私钥在 Windows 上启动。在 Startup 文件夹中创建一个快捷方式,语法为 "path\to\pageant.exe" "path\to\privatekey" 我们不需要在我们的存储库的 .git/config 中设置 'puttykeyfile' 设置非常重要的是“SSH使用 GitHub 的克隆 URL”而不是 HTTPS。
如果您想stop Git from always asking获取 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
我觉得 static_rtti 提供的答案在某种意义上是 hacky。我不知道这是否在早期可用,但 Git 工具现在提供凭证存储。
缓存模式
$ git config --global credential.helper cache
使用“缓存”模式将凭据保存在内存中一段时间。没有任何密码存储在磁盘上,并且在 15 分钟后从缓存中清除。
商店模式
$ git config --global credential.helper 'store --file ~/.my-credentials'
使用“存储”模式将凭据保存到磁盘上的纯文本文件中,并且它们永不过期。
我个人使用的是商店模式。我删除了我的存储库,克隆了它,然后不得不输入我的凭据一次。
参考:7.14 Git Tools - Credential Storage
credential.helper cache
不起作用。它应该是 git config --global credential.helper wincred
。
git config --local credential.helper store
。在我的情况下,我通过 HTTPS,这样我只输入一次用户名/密码,之后,我的凭据被重用从 ~/.git-credentials
如果每次您尝试与 GitHub 交互时,Git 都会提示您输入用户名和密码,那么您可能正在为您的存储库使用 HTTPS 克隆 URL。
使用 HTTPS 远程 URL 有一些优点:它比 SSH 更容易设置,并且通常可以通过严格的防火墙和代理工作。但是,它还会在每次拉取或推送存储库时提示您输入 GitHub 凭据。
您可以配置 Git 为您存储密码。对于 Windows:
git config --global credential.helper wincred
我想你解决了你的问题,但我没有看到对我有帮助的解决方案,所以就在这里。
输入终端:
echo "" > ~/.ssh/known_hosts
这将清空您的 known_hosts
文件,并且您必须添加您使用并连接到的每个主机,但它解决了问题。
cat /dev/null > ~/.ssh/known_hosts
也会这样做。
> ~/.ssh/known_hosts
更短:)
在适用于 Linux 的 Windows 子系统 (WSL) 上,这是我发现的唯一可行的解决方案:
eval `ssh-agent`; ssh-add ~/.ssh/id_rsa
这是 ssh-agent 没有在 WSL 中正确注册的问题。
我有同样的问题。 MacOS Mojave 钥匙串不断要求输入密码。为了安全起见,您的 id_rsa 应使用密码进行加密。然后尝试将其添加到钥匙串 ssh-add -K ~/.ssh/id_rsa
如果您的密钥位于 ~/.ssh 以外的另一个文件夹中,则替换为正确的文件夹。
Keychain 现在知道您的 ssh 密钥,希望现在一切正常。
如果您仍然面临问题,请尝试
1. brew install keychain
2. echo '/usr/local/bin/keychain $HOME/.ssh/id_rsa' >> ~/.bash_profile
echo '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
ssh-add
最终为我解决了这个问题。
运行 macOS Cataline 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
的错误。
希望这可以帮助!
如果您使用 https
协议,Git 会提示您输入密码。如果您使用 ssh
,它将使用您的私钥进行身份验证,而不是询问密码。 (https://help.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account)
以下是解决此问题的方法:
git remote -v
这将显示来源的 url。您会注意到此网址中的 https
。 (例如:https://github.com/PrestaShop/PrestaShop.git)
现在,您必须先删除它并添加带有 ssh
的 url
git remote remove origin
git remote add origin git@github.com:PrestaShop/PrestaShop.git
orkoden 关于在终端中使用带有 Git 的钥匙串的答案不完整并引发错误。这是您必须执行的操作,以将您在终端中输入的用户名和密码保存在您的钥匙串中:
curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychain
sudo mv git-credential-osxkeychain /usr/local/bin
sudo chmod u+x /usr/local/bin/git-credential-osxkeychain
然后输入
git config --global credential.helper osxkeychain
如果你在 curl 之前已经完成了 Git 配置,那没问题;它会工作的。
正如上面的static_rtti所说,改变
https://github.com/username/repo.git
git://github.com/username/repo.git
至
ssh://git@github.com/username/repo.git
我自己将 .git/config 文件中的 https
更改为 ssh
,但它仍然无法正常工作。然后我看到您必须将 github.com
更改为 git@github.com
。获取实际正确 URL 的一个好方法是转到您的项目页面并单击:
Change HTTPS to SSH to get the right URL
然后将此 URL 添加到配置文件中。
我同意“codehugger”并使用“orkoden”的指令对我有用 - 在 NetBeans 7.3 上 - 当您右键单击文件并选择上下文菜单 - 推送 - 打开“推送到远程”窗口 - 有两个这里的选项:
来源:https://github.com/myaccount/myproject.git/ https://github.com/myaccount/myproject.git/
如您所见,不同之处在于 URL 中的 origin 参数 - 您不想选择此选项 (1) 您想检查选项 (2),这对我来说很好用。
第 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
git branch --set-upstream master origin/master
根据您的配置,有不同类型的身份验证。这里有几个:
git 凭证-osxkeychain。如果您的凭据无效,请通过以下方式将其删除: git credential-osxkeychain erase 或: printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain erase 所以 Git 不会再向你询问钥匙串权限。然后重新配置。请参阅:从 GitHub 上的 OS X 钥匙串更新凭据 Your SSH RSA key。为此,您需要将您的 SSH 密钥与您添加的内容进行比较,如果您使用的是正确的身份,请通过 ssh-add -L/ssh-add -l 检查。您的 HTTPS 身份验证(如果您使用 https 而不是 ssh 协议)。使用 ~/.netrc(Windows 上的 %HOME%/_netrc),提供您的凭据,例如机器 stash1.mycompany.com login myusername password mypassword
了解详情:Syncing with GitHub 在 Stack Overflow。
在您可以将密钥用于 GitHub 之前,请按照教程中的以下步骤操作,Testing your SSH connection:
$ ssh -T git@github.com
# Attempts to ssh to GitHub
如果您使用的是 Windows,并且突然在 GitHub 上开始出现这种情况,可能是由于 GitHub 在 2018-02-22 上最近的 disabling support for deprecated cryptographic algorithms,在这种情况下,解决方案只是下载并安装最新版本完整的 Git for Windows 或只是 Git Credential Manager for Windows。
如果您设置了 SSH 代理,您还可以将其添加到您的 ~/.gitconfig
以强制 git 对所有 GitHub 存储库使用 SSH 而不是 HTTPS:
[url "ssh://git@github.com/"]
insteadOf = git://github.com/
insteadOf = https://github.com/
(如果您主要使用公共存储库,您也可以使用 pushInsteadOf
而不是 insteadOf
,因为无需身份验证即可从公共存储库读取)。
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 时,它就不会消失了。
我有这个问题。回购要求我每次都输入凭据。我所有其他的回购都没有要求我提供凭据。他们甚至被设置为在相同的帐户凭据下使用 HTTPS 跟踪 GitLab,所以奇怪的是,除了一个之外,它们都运行良好。
比较 .git/config 文件,我发现导致问题的 URL 有 2 个关键差异:
是否要求提供凭据:
https://gitlab.com/myaccount/myproject
不要求提供凭据:
https://myaccount@gitlab.com/myaccount/myproject.git
因此,添加“myaccount@”和“.git”解决了我的问题。
就我而言,当我尝试挑选如下 URL 时,总是会收到密码提示:
git fetch http://username@gerrit-domainname/repositoryname refs/changes/1/12345/1 && git cherry-pick FETCH_HEAD
在另一台机器上挑选时,此 URL 运行良好。但是,当我尝试使用 正确的密码 abc@12345
进行挑选时,我曾经遇到以下错误:
remote: Unauthorized
remote: Authentication failed for http://username@gerrit-domainname
在我的 git 配置文件中,远程 URL 如下所示:
url = ssh://gerrit-domainname:8080/wnc
解决方案:我通过提供在我的 gerrit 帐户 -> 设置 -> HTTP 密码中找到的 HTTP 密码解决了身份验证失败问题。
HTTP 密码类似于 Th+IsAduMMy+PaSS+WordT+RY+Your+OwNPaSs
,与我的实际密码 abc@12345
完全不同
注意:我的 cherrpick 网址以 git fetch ...
开头因此,此解决方案可能适用于网址以 git fetch ...
开头的 git checkout/download
面临同样的问题。
请确保您已正确设置远程来源:
$git remote add origin master "https://...git "
[remote "origin"]
部分设置url = ssh://git@github.com/username/Repo.git
。这对我有用。url = git@github.com:organization/Repo.git
确实有效。 +1 引导我走上正确的道路!成功!