如何在Git中保存用户名和密码?

2607

我想在 Git ExtensionsSourcetree 或其他 Git GUI 中自动使用 push 和 pull,无需每次手动输入用户名和密码。

那么我该如何保存我的 Git 凭据呢?


22
你也可以通过SSH进行身份验证:https://dev59.com/nmw15IYBdhLWcg3whMA1 - Anton Tarasenko
2
就GitHub而言,当前政策(截至2021年8月)是您不再能够使用用户名/密码。相反,您必须使用SSH或“个人访问令牌”:处理GitHub密码身份验证弃用 - paulsm4
3
@paulsm4 一种安全且用户友好的SSH或个人访问令牌的替代方案是通过Git凭据管理器使用OAuth,详见我的回答 https://dev59.com/PFsV5IYBdhLWcg3wrAZJ#71284566 - Colonel Panic
1
请参阅此2022 Git邮件列表线程 - VonC
33个回答

2
在 macOS 上,您可以使用系统钥匙链来保障安全。我认为这是用于像 Overleaf 这样仅提供 https 访问的网站的最安全方法(除非您链接了您的 Github 存储库)。
以下 Git 命令可启用此功能。
$ git config --global credential.helper osxkeychain

此外,正如我在下面的编辑中所写的那样,请确保禁用其他凭据助手,以便git不会保存您的密码,例如明文。

然后,您可以克隆git存储库:

$ git clone https://git.overleaf.com/blahblah

这会要求输入密码。输入后,您可以在macOS内置的KeyChain访问应用程序中看到它。

在这种情况下,您可以找到名称为git.overleaf.com的URL条目,该条目与git URL匹配。

为了更好的安全性,您可以要求所有应用程序请求您的权限。您可以从“始终允许这些应用程序访问”的列表中删除git,以便即使是git也无法在未经您允许的情况下获取密码。

Keychain Access config

注意:
但我注意到一些应用程序仍然可以在没有我的许可下进行 git pull,这很奇怪,因为在这种情况下,Overleaf 的 git 存储库只提供 https 访问(即没有通过 SSH 的漏洞)。如果我更改密码,我可以暂时阻止这些应用程序进行 pull,但是在我重新注册新密码后,这些应用程序又可以再次进行 pull... 即使我勾选了“要求 Keychain 密码”。可能是 macOS(Ventura)中的错误配置或甚至是 bug。

我在 AskDifferent 上开了一个 Q&A: https://apple.stackexchange.com/questions/459108/keychain-access-loophole-for-git-https

编辑:
我找到了问题所在。Git 仍然具有将凭据存储在全局设置(~/.git-config)中的配置。因此,您需要确保对不同分辨率进行正确的设置。这包括每个项目、全局 (git config edit --system) 和系统 (git config edit --system) 应仅将 [credential] 设置为 helper=osxkeychain

在编辑设置后,检查 ~/.git-credentials 并确保没有意外存储密码(以明文形式)。


0

对于遇到相同问题的GitLab用户-

您可以设置部署令牌以从您的存储库克隆或拉取(使用部署令牌无法将代码推送到存储库)。

在这里,您可以了解有关GitLab部署令牌的更多信息: https://docs.gitlab.com/ee/user/project/deploy_tokens/index.html

创建部署令牌后,请使用以下命令来克隆存储库:

git clone https://${username}:${deploy_token}@gitlab.com/yourusername/yourreponame.git

我认为这种方法比全局保存git用户名和git密码更好(例如,在远程共享机器上可能不安全)


1
请注意,如果您的 Git 设置了 git config --system transfer.credentialsInUrl die,那么这样的 URL 将无法工作。 - VonC
谢谢指出这一点。我明白这是一个安全漏洞。 - Tamjid Rayhan
是的,根据上下文,这些URL可能会被禁止。 - VonC

-1
你可以简单地修改~/.git-credentials,然后添加以下行:
git:https://<user>:<token/password>@gitlab.com

就是这样


似乎用户名和密码都需要进行URL编码——例如,如果您的用户名是电子邮件,则将@替换为%40等。 - tsbertalan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接