为啥 git 在 Windows 下记不住我的密码

Posted

技术标签:

【中文标题】为啥 git 在 Windows 下记不住我的密码【英文标题】:Why git can't remember my passphrase under Windows为什么 git 在 Windows 下记不住我的密码 【发布时间】:2010-09-27 01:39:21 【问题描述】:

我刚刚开始使用 git,但我无法记住我的密码我正在使用提升的 cmd.exe,我的 git 主机是 github,我已经创建了一个 ssh 密钥,就像 github 上的指南一样

但我还是得到了

*\subnus.mvc>git push origin master
Enter passphrase for key '/c/Users/Subnus/.ssh/id_rsa':

【问题讨论】:

我自己没有使用过 msysgit,但是pageant 身份验证代理可能会有所帮助。 我尝试了所有方法,然后我发现 this 有效。 Windows 10 附带 OpenSSH 已有一段时间了。启用 ssh-agent 服务,使用 ssh-add 将您的密钥添加到 ssh 存储,并在您的环境中设置 GIT_SSH(如果需要),git/ssh 将通过 ssh-agent 记住您的密码。请参阅下面的答案以获取更详细的说明。 2019,刚刚在windows 10上安装了git,git要求输入密码一次,记住了。 @Jean-FrançoisFabre 你可能没有使用 OpenSSL。 【参考方案1】:

窗户: 如果您通过 @d3r3kk 的步骤 还是有问题,试试这个:

Windows:

删除 .bashrc 文件 此文件通常位于 C:\Users\myusername

【讨论】:

【参考方案2】:

确保您的~/.ssh/config 确实包含

UseKeychain yes

这会阻止ssh-add 持续到ssh-agent

【讨论】:

【参考方案3】:

每次设置新桌面时,我都会忘记这些说明,所以我在这里添加另一个答案,因为我同样经常偶然发现它!


像我这样不耐烦的用户的快速步骤

    启用OpenSSH Authentication Agent 服务并使其自动启动。 ? 更新 ? 使用最新的 Windows 更新 Version 10.0.19042.867 我必须重新执行此步骤! 在命令行中使用ssh-add 将您的SSH 密钥添加到代理。 测试 git 集成,如果它仍然要求您输入密码,请继续。 将环境变量 $ENV:GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exe 添加到您的会话中,或永久添加到您的用户环境中。

详细步骤:概述

Windows 一直是shipping with OpenSSH for some time now. 它包含 ssh 与 Git 一起工作的所有必要位,但它似乎仍然需要一些 TLC 才能 100% 无缝工作。以下是我从 Windows 版本 10.0.18362.449 开始成功执行的步骤(您可以通过打开 cmd.exe shell 并输入 ver 来查看您的 Windows 10 版本)。

我在这里假设您已经设置了 SSH 密钥,并且位于 ~/.ssh/id_rsa

在您的 Windows 10 机器上启用 ssh-agent 服务。

    开始-> 输入“服务”并点击出现的服务应用程序。 在列表中找到OpenSSH Authentication Agent 服务。 右键单击OpenSSH Authentication Agent 服务,然后选择“属性”。 将Startup type: 更改为Automatic。 单击Start按钮将服务状态更改为Running。 单击OK 关闭对话框,然后关闭“服务”应用。

将您的密钥添加到ssh-agent

    打开您偏好的 shell(我将在本例中使用 Windows Powershell,也适用于 Powershell Core)。 将您的 SSH 密钥添加到 ssh-agentssh-add (如果密钥路径与默认值不同,您可以将密钥路径添加为第一个参数)。 在提示时输入您的密码。

试试 Git + SSH

    打开你的 shell (我再次使用 Powershell) 并克隆一个 repo。 git clone git@github.com:octocat/Spoon-Knife 如果您看到此提示,请继续下一部分:
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':

设置您的GIT_SSH 环境变量

在任何会话中,您都可以简单地设置此环境变量,您的密码提示将停止出现,ssh 将代表您使用ssh-agent。或者,您可以将密码永久设置到用户的环境中。

仅在当前 shell 中设置 GIT_SSH

    打开您偏好的外壳。 (对我来说是 Powershell) 将环境变量GIT_SSH设置为合适的ssh.exe:$Env:GIT_SSH=$((Get-Command -Name ssh).Source) 重试上述尝试 Git + SSH 中的步骤。

永久设置GIT_SSH

    打开文件资源管理器。开始-> 输入“文件资源管理器”并在列表中单击它。 右键单击“这台电脑”,然后单击“属性”。 点击“高级系统设置”。 点击“环境变量...”按钮。 在“您的用户名的用户变量”下单击新建... 将Variable name: 字段设置为 GIT_SSH 将Variable value: 字段设置为path-to-ssh.exe(通常为C:\Windows\System32\OpenSSH\ssh.exe)。 单击“确定”关闭“新建用户变量”对话框。 单击“确定”关闭“环境变量”对话框。 重试上述尝试 Git + SSH 中的步骤。

请注意,随着 Windows 10 的进展以及我了解的更多,这可能会随着新的步骤/程序而改变。我会尽量保持更新,我期待在 cmets 中提供反馈。

【讨论】:

这是截至 2020 年 1 月 31 日最完整的答案,至少对于 Windows 而言。无需安装 PUTTY 或其他任何东西。 同意。看来内置支持终于来了。 传奇!这解决了我的问题。一直在寻找解决方案,尝试不同的东西,这是解决这个问题的最完整的遮阳篷 感谢您提供了一个很好的答案,并且很可能为我节省了几个小时的时间。 +1 谢谢!我唯一缺少的是环境变量。我不知道它为什么工作,我可以 ssh-add 没有错误,并且代理正在运行,但它不会记住我的凭据!【参考方案4】:

我意识到这个问题是在两年前提出的,但我遇到了同样的问题,这里的几个答案并没有完全回答我的问题。以下是三个分步解决方案,具体取决于您是否使用 TortoiseGit 和 msysgit。

第一个解决方案假设 Windows、msysgit 和 PuTTY。

    按照说明安装 msysgit 和 PuTTY。

    (可选)将 PuTTY 添加到您的路径中。 (如果您不这样做,那么对以下 PuTTY 命令的任何引用都必须以相应可执行文件的完整路径为前缀。)

    如果您还没有这样做,请按照 GitHub 或您的 Git 主机的说明生成密钥哈希。

    同样,如果您还没有这样做,请使用 puttygen.exe 转换您的密钥以与 PuTTY 的 pageant.exe 一起使用。说明在 PuTTY 的文档、this helpful guide 以及网络空间的其他几个地方。

    运行 PuTTY 的 pageant.exe,打开您的 .ppk 文件(“添加密钥”),并为您的密钥提供密码。

    访问 Windows 的环境变量对话框(右键单击“计算机”,单击“属性”,单击“高级系统设置”或“高级”选项卡,单击“环境变量”)。添加以下环境变量:

    GIT_SSH=C:\full\path\to\plink.exe

    将“C:\full\path\to”替换为 PuTTY 的完整安装路径,其中 plink.exe 所在的位置。最好将其添加到“用户变量”部分。此外,请确保您用于 plink.exe 的路径与您用于 Pageant (pageant.exe) 的路径相匹配。在某些情况下,您可能安装了多个 PuTTY,因为它可能与其他应用程序一起安装。使用一个安装中的 plink.exe 和另一个安装中的 pageant.exe 可能会给您带来麻烦。

    打开命令提示符。

    如果您尝试连接到托管在 Github.com 的 git 存储库,请运行以下命令:

    plink.exe git@github.com

    如果您尝试连接的 git 存储库托管在其他地方,则将 git@github.com 替换为适当的用户名和 URL。 (假设 Github)你应该被告知服务器的主机密钥没有被缓存,并询问你是否信任它。用 y 回答。这会将服务器的主机密钥添加到 PuTTY 的已知主机列表中。如果没有这一步,git 命令将无法正常工作。按回车后,Github 会通知您 Github 不提供 shell 访问。没关系……我们不需要它。 (如果您正在连接到其他主机,并且它为您提供 shell 访问权限,则最好终止链接而不做任何其他事情。)

    全部完成! Git 命令现在应该可以从命令行运行。您可能需要 pageant.exe load your .ppk file automatically at boot time,具体取决于您需要它的频率。

第二种解决方案假设 Windows、msysgit 和 TortoiseGit。

TortoiseGit 带有 PuTTY 可执行文件和经过特殊修改的 plink 版本(称为 TortoisePlink.exe),这将使事情变得更容易。

    按照说明安装 msysgit 和 TortoiseGit。

    如果您还没有这样做,请按照 GitHub 或您的 Git 主机的说明生成密钥哈希。

    同样,如果您还没有这样做,请使用 TortoiseGit 的 puttygen.exe 转换您的密钥以与 TortoiseGit 的 pageant.exe 一起使用。说明在 PuTTY 的文档、第一个解决方案链接的有用指南以及网络空间的其他几个地方。

    运行 TortoiseGit 的 pageant.exe,打开您的 .ppk 文件(“添加密钥”)并为您的密钥提供密码。

    访问 Windows 的环境变量对话框(右键单击“计算机”,单击“属性”,单击“高级系统设置”或“高级”选项卡,单击“环境变量”)。添加以下环境变量:

    GIT_SSH=C:\full\path\to\TortoisePlink.exe

    将“C:\full\path\to”替换为 TortoiseGit 的完整安装路径,TortoisePlink.exe 所在的位置。最好将其添加到“用户变量”部分。此外,请确保您用于 TortoisePlink.exe 的路径与您用于 Pageant (pageant.exe) 的路径相匹配。在某些情况下,您可能安装了多个 PuTTY,因为它可能与其他应用程序一起安装。使用 TortoiseGit 安装中的 TortoisePlink.exe 和不同应用程序的另一个安装(或独立 PuTTY 安装)中的 pageant.exe 可能会给您带来麻烦。

    全部完成! Git 命令现在应该可以从命令行运行。当您第一次尝试连接到您的 git 存储库时,您可能会被告知服务器的主机密钥未缓存,并询问您是否信任该服务器。点击“是”。 (这是运行中的 TortoisePlink.exe。)

    您可能需要 pageant.exe load your .ppk file automatically at boot time,具体取决于您需要它的频率。

第三种解决方案假设 Windows、msysgit 和本机命令提示符。

    安装 msysgit 确保允许在 MS-DOS 命令提示符下使用 git 运行start-ssh-agent 输入 SSH 密码 全部完成! Git 命令现在应该可以在本机命令提示符下运行。

【讨论】:

如果你同时拥有 GitExtensions 和 TortoiseGit,每个都有自己的 putty 版本,请确保将 GIT_SSH 环境变量设置为选美的 plink 路径你实际上在使用。 以防万一其他人遇到这个愚蠢的错误:确保您使用的是 SSH 远程 URL 格式 (git@host:accountname/reponame.git) 而不是 HTTPS URL,否则它将保留在要求输入密码时... 当我运行 plink.exe git@github.com 时,我得到“致命错误:服务器意外关闭网络连接” 注意:方法三一直是upstreamed into msysgit,所以你可以在命令行中输入start-ssh-agent来保存你的SSH密码。 第三种解决方案仅在命令提示符关闭之前有效,并且仅适用于该命令提示符 - 所有其他 CMD 仍要求输入密码。此外,所有其他客户端(VS、VS Code)都无法与远程 git 通信。【参考方案5】:

假设您想使用纯 Git Bash 解决方案,而不使用 TortoiseGit 或 PuTTY。此外,您不希望永久存储您的密码,因为这几乎与您在没有密码的情况下生成 SSH 密钥一样。但是你仍然想使用一些缓存。

出于缓存目的,使用了 ssh-agent 进程,它包含在 Git Bash 发行版中。此过程默认不启动,因此需要先启动。对于要缓存的任何 SSH 密钥,应使用 ssh-add 命令将它们添加到此进程中,该命令将提示您输入密钥的密码并将其存储在内存中。

其他解决方案的缺点:

自动启动 ssh-agent 就像在 GitHub's 文章中一样,在启动 Git Bash 时从一开始就要求输入密码,无论您是否需要在此会话中使用 SSH 密钥。如果您现在使用本地存储库,您可能只想在真正需要时(例如与远程存储库交互时)提供密码。 如果您在GitLab's 文章中使用eval $(ssh-agent -s) 启动您的ssh-agent,您可能已经厌倦了每次都输入它。最终,您可能已将这两行添加到您的 .bashrc 配置中以自动启动。缺点与上述相同,还有一个额外的:每次启动新的 Git Bash 终端时,您都会获得一个额外的 ssh-agent 进程(GitHub 的 bash 脚本会检查该进程是否已经启动)。 与上述两个类似,但尤其是当您为不同的主机拥有单独的 SSH 密钥时,例如一个用于 GitHub,另一个用于 GitLab,因此一次性提供它们既烦人又不方便。

因此,此解决方案适用于那些想知道如何让 Git Bash 在每个 Windows 会话中仅在真正需要时才要求输入密码的人。它类似于使用 default-cache-ttl 的 GnuPG 提交 auto-signing 的密码短语管理行为。

将 SSH 配置为在需要时仅使用 Git Bash 请求密码短语一次

    首先,我们希望在启动 Git Bash shell 时自动启动 ssh-agent。我们将使用修改后的 GitHub 的 script 来检查进程是否已经开始,但我们不希望它立即使用 ssh-add 键。此脚本将转到您的 ~/.bashrc~/.profile~/.bash_profile~ 是您的用户主目录,例如 C:\Users\Username - 运行 cd ~ 然后运行 ​​pwd 以便 Git Bash 将其打印出来):

    ### Start ssh-agent
    
    env=~/.ssh/agent.env
    
    agent_load_env ()  test -f "$env" && . "$env" >| /dev/null ; 
    
    agent_start () 
        (umask 077; ssh-agent >| "$env")  # use -t here for timeout
        . "$env" >| /dev/null ; 
    
    agent_load_env
    
    # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
    agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
    
    if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
        agent_start
    fi
    
    unset env
    

    现在编辑或创建一个~/.ssh/config 文件,并为您希望启用缓存的每个主机节添加一个 AddKeysToAgent 选项(您也可以通过将指令置于所有主机声明之前的文件开头):

    # GitHub.com
    Host github.com
      Preferredauthentications publickey
      IdentityFile ~/.ssh/id_ed25519_github
      AddKeysToAgent yes
    
    # GitLab.com
    Host gitlab.com
      Preferredauthentications publickey
      IdentityFile ~/.ssh/id_ed25519_gitlab
      AddKeysToAgent yes
    

    来自 ssh config man page: 如果此选项设置为 yes 并且从文件加载密钥,则密钥及其密码将添加到具有默认生命周期的代理中,如如果通过 ssh-add(1).

默认的最长生命周期是永远或直到ssh-agent 进程被杀死(从任务管理器手动或在您的 PC 关闭时)。如果您希望使用有限超时,您可以使用 ssh-agent 的 -t 参数设置它。从上面的第一步更改 bash 脚本中的行,例如30 分钟的密钥缓存生命周期:

(umask 077; ssh-agent -t 30m >| "$env")

有关其他时间格式限定符,请参阅 here。

【讨论】:

【参考方案6】:

如果您在 Windows 下使用 Git bash,您可以执行以下操作:

eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa

它会在第二个命令中询问密码,就是这样。您需要执行的每个附加操作(曾经需要密码短语)都不会要求您输入密码短语(请参见下面屏幕截图中的示例):

【讨论】:

这也适用于 Windows 10 的 Ubuntu 子系统。 请注意,如果您的密钥对位于其他位置,您可以将 ~/.ssh/*_rsa 替换为 *.pem 文件的路径 第二个命令的错误:没有这样的文件或目录【参考方案7】:

您可以在您的用户的主目录中创建一个.bashrc 文件,例如C:/Users/youruser,然后放在那里:

env=~/.ssh/agent.env

agent_load_env ()  test -f "$env" && . "$env" >| /dev/null ; 

agent_start () 
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; 

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

每次 bash 运行后都会执行此脚本。因此,您只需在git-bash 启动时输入一次密码!

某些版本的 bash 需要 .bash_profile 文件而不是 .bashrc,所以以防万一克隆 .bashrc

copy .bashrc .bash_profile

【讨论】:

【参考方案8】:

我意识到这已经过了好几年了,但我偶然发现了这个问题,试图找到一个解决方案,我找到了适合所有专业水平的东西,所以我想分享一下。

GitHub 提供了一个非常有用的安装程序,让一切变得简单易用:https://help.github.com/articles/caching-your-github-password-in-git/

【讨论】:

请注意,这是在缓存您的 GitHub 密码,而不是 GPG 密钥密码。【参考方案9】:

可以尝试添加 -k arg 当你这样做;

ssh-add -k ~/.ssh/id_rsa

【讨论】:

【参考方案10】:

在问题发布后 5 年 8 个月 6 天再提供一个解决方案也不错,所以就这样吧。

注意:假设您使用的是 Windows 计算机。

    下载git-credential-winstore。 运行它!如果您的 PATH 环境变量中有 GIT,它应该可以正常工作。如果没有,请运行 git-credential-winstore -i C:\Path\To\Git.exe

下次您尝试提交到存储库时,系统会提示您输入您的凭据。应该是这样的。在您更改密码之前,系统不会再要求您提供凭据。


仅供参考...您的凭据存储在 Windows 凭据存储中

您将我的凭据存储在哪里?

此应用仅使用现有的 Windows 凭据存储来保存您的凭据。您可以通过转到控制面板 > 用户帐户 > 凭据管理器并选择“Windows 凭据”来查看存储的凭据。以“git:”开头的条目来自 git-credential-winstore。

【讨论】:

此解决方案似乎不适用于 SSH 存储库,仅适用于 HTTPS。 /愤怒的脸【参考方案11】:

[编辑 - 误读了问题,这是对相关问题的回答。为后代留下改写版本]

我的情况是我试图推送到托管在我们其中一台服务器上的存储库。每当我尝试推送时,git 都会询问我的密码(nb - 密码,而不是我私钥的密码)。

通过将我的公钥添加到服务器上的授权密钥中,我能够获得无密码推送到该服务器。而且,因为我的私钥上没有密码(顺便说一句,这是不好的做法!)我根本不需要输入任何内容。

这是将您的公钥添加到服务器的命令。它假定用户git 是服务器上的用户。

cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'

您可以通过登录服务器并手动将您的公钥附加到位于~/.ssh/authorized_keys 的文件中来实现相同的目的

【讨论】:

您能否将其转换为无法访问 shell 的人可以使用的描述?例如。我们应该使用记事本或类似工具在authorized_keys 中输入什么?【参考方案12】:

对于需要更详细说明的任何人,请参阅此页面: http://help.github.com/working-with-key-passphrases/

【讨论】:

正是我使用msysgit shell 所需要的。 在使用 Git Bash 桌面应用程序时为我工作。我使用了notepad ~/.profile 并复制粘贴了该链接中的内容,重新启动了 Git Bash,输入了我的密码,获利了... 我遵循了“在 Windows 的 Git 上自动启动 ssh-agent”部分(在 Win 10 上使用 git 2.x),但它仍然一直要求我输入密码。遵循接受答案的第一个解决方案(腻子)为我解决了这个问题。 我能够得到它,因此密码短语仅在使用Auto-launching ssh-agent on Git for Windows 的脚本启动后提示一次。但是,我确实发现,当我将其添加到~/.profile~/.bashrc 时,它不起作用。我需要将它添加到 ~/.bash_profile 以便它被 Windows 上的 Git Bash 拾取和使用。我现在看到下面的@alexander-goncharov 的answer 这么说。【参考方案13】:

如果您为密钥文件设置了密码,则在连接时始终需要输入该密码。如果您创建了一个无密码密钥,那么您不必每次都输入它,但是,任何有权访问您的密钥文件的人现在都可以连接到您的 github 帐户。

ssh-agent 也可以工作。尝试运行它,看看它是否会记住您的密码。

【讨论】:

运行 ssh-keygen -p 应该允许 OP 不设置密码 仍然提示输入密码。

以上是关于为啥 git 在 Windows 下记不住我的密码的主要内容,如果未能解决你的问题,请参考以下文章

关于【记住我的凭据】,老是记不住!!

在 Windows 上删除 Git 的缓存密码 [重复]

为啥在 Windows 和 Linux 机器之间复制 repo 后 Git 会指示更改?

idea的git提交为啥输入用户名密码不正确

为啥 git 安装在 AppData 而不是 Program Files 中?

git分支合并为啥会发生冲突