如何在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个回答

4237

注意:该方法会将凭据以明文形式保存在您计算机的磁盘上。您计算机上的任何人都可以访问它,例如恶意 NPM 模块。

运行

git config --global credential.helper store

然后

git pull

提供用户名和密码,这些详细信息将在以后被记住。凭证存储在磁盘上的文件中,磁盘权限为“仅用户可读/可写”,但仍然是明文。

如果您想稍后更改密码

git pull

由于密码不正确,将失败,然后git会从~/.git-credentials文件中移除有问题的用户+密码,所以现在重新运行。

git pull

提供一个新密码,以便它能像之前一样工作。


28
对于 Debian/Ubuntu,使用 libsecret。https://dev59.com/WVoV5IYBdhLWcg3wLsT5#40312117 - rofrol
212
请注意,这将会将您的用户名和密码以明文形式存储在 ~/.git-credentials 文件中。任何人都可以打开并阅读该文件。 - RoboAlex
14
如果您希望忘记保存在 Git 凭据助手中的凭据,请使用以下命令:git config --global credential.helper forget。请注意,这是一个英文命令,不要进行翻译或更改。 - jacktrade
43
值得指出的是,有时可能希望跳过使用 --global ,仅为一个存储库(在拉取和推送时)存储密码,而不是为任何其他存储库存储密码(这些存储库可能位于不同的主机上,具有不同的凭据,由于某种原因可能不想存储)。 - pseyfert
59
@RoboAlex的评论很受欢迎,但是~/.git-credentials的保护和~/.ssh/id_rsa这样的私钥没有什么不同。因此,如果您的私钥没有密码,那么~/git-credentials并不比SSH密钥更糟糕。 - Jason S
显示剩余17条评论

646
您可以使用git config在Git中启用凭据存储。
git config --global credential.helper store
运行此命令时,第一次从远程代码库pull或push时,将询问您的用户名和密码。
随后,在与远程存储库的后续通信中,您无需提供用户名和密码。
存储格式是一个纯文本的.git-credentials文件。
此外,您可以使用其他助手来管理git配置凭据帮助器,例如内存缓存。
git config credential.helper 'cache --timeout=<timeout>'

该方法可选一个超时参数,以确定凭据在内存中保留的时间长度。使用此助手,凭据将永远不会触及磁盘,并将在指定的超时时间后被擦除。 默认值900秒(15分钟)


警告:如果您使用此方法,您的Git账户密码将以明文格式保存在全局.gitconfig文件中,例如,在Linux中为/home/[用户名]/.gitconfig

如果您不希望这样做,请改用ssh密钥来管理您的账户。


3
希望您能展示.gitconfig文件 - 第一条命令已被第二条命令覆盖 :( - Adam
16
对于git config credential.helper cache,密码不会保存到文件中,只会存储在内存中。请参见:https://git-scm.com/docs/git-credential-cache - S.A.
2
无法工作。给出致命错误:身份验证失败。甚至不要求输入密码。 - Philip Rego
14
作为附注,您的私有 SSH 密钥也将以明文形式存储在用户可访问的位置,因此在本质上两种情况下的攻击面是相同的。 - Falco
1
这并没有添加超时时间,请参见下面的@Andreas Bigger评论:git config --global credential.helper 'cache --timeout=3600'。 - run_the_race
显示剩余7条评论

471

推荐且安全的方法:SSH

按照以下步骤生成密钥:更多详情

$ssh-keygen -t rsa -b 4096 -C "yourEmail@something.com"

设置一个保护密钥的密码,并将其存储在本地。
将id_rsa.pub文件的内容复制到剪贴板,以便进行下一步操作。
$ clip < ~/.ssh/id_rsa.pub

前往github.com设置SSH和GPG密钥新SSH密钥。粘贴密钥并保存。
如果私钥保存为id_rsa~/.ssh/目录中,我们将其添加为身份验证:
ssh-add -K ~/.ssh/id_rsa

一种更安全的方法:缓存

我们可以使用git-credential-cache来缓存我们的用户名和密码一段时间。只需在您的CLI(终端或命令提示符)中输入以下内容:

git config --global credential.helper cache

您还可以设置超时时间(以秒为单位),如下所示:
git config --global credential.helper 'cache --timeout=3600'

41
对我来说这个方法不起作用,git clone仍然要求输入用户名和密码。 - Oliver
16
不建议以这种方式存储密码,因为运行命令 "git config --global -l" 会在控制台上显示密码。 - CCC
3
这对我不起作用。很奇怪它能为任何人工作,因为在gitconfig的规范中没有“密码”的空间。 - Hamish Todd
6
如果您使用SSH方式,您需要开始使用SSH URL而不是git URL - https://dev59.com/f2Uq5IYBdhLWcg3wJM9A - yndolok
24
“更不安全的方法”。我不同意。有没有人在这里意识到,您无需输入密码即可使用私人ssh密钥(问题的重点是避免输入密码),该密钥以明文形式存储(默认情况下在〜/ .ssh / id_rsa中,与〜/ .git-credentials一样不安全?同时,credential.helper存储方法不会将密码/令牌放入.gitconfig文件中。另外,由于GitHub等网站的特殊性,您可以对个人访问令牌(PAT)拥有更细粒度的权限控制,而不是SSH公钥。因此,对于这种特定情况,我认为使用凭证助手的PAT更加“安全”。 - Jason S
显示剩余12条评论

183

开启凭证助手,这样Git会在内存中保存您的密码一段时间:

在终端中输入以下内容:

# Set Git to use the credential memory cache
git config --global credential.helper cache

默认情况下,Git会将您的密码缓存15分钟。

要更改默认的密码缓存超时时间,请输入以下内容:

# Set the cache to timeout after 1 hour (setting is in seconds)
git config --global credential.helper 'cache --timeout=3600'

来自GitHub 帮助中心


8
你是唯一一个建议全球版本的人,这很重要,因为每次我重新克隆存储库时都会出问题。请修改并使其更通俗易懂,但不要改变原意。 - xeruf
6
怎样将超时设置为无限大?我永远不想再输入我的密码了。 - Avamander
9
请将“缓存”部分替换为“存储”,完整的命令将是:“git config --global credential.helper store” 。请注意,这将把您的密码保存在一个明文文件中(没有任何加密措施)。 - Aleksandar
3
那在有多个账户的情况下就无法正常运作,密码不能根据电子邮件从存储中获取,而是会选择列表中的第一个。请问需要翻译哪些内容? - Avamander
2
@Avamander 嗯..那是应该这样还是可能是个bug? --timeout 参数的最大值是多少? - Aleksandar
显示剩余8条评论

119
你可以编辑~/.gitconfig文件来存储你的凭据。
nano ~/.gitconfig

应该已经有

[user]
        email = your@email.com
        user = gitUSER

你应该在这个文件的底部添加以下内容。
[credential]
        helper = store

我推荐这个选项的原因是因为它是全局的,如果你需要移除该选项,你知道去哪里修改它。
只在你的个人电脑上使用这个选项。
然后当你拉取、克隆或输入Git密码时,一般情况下,密码会以~/.git-credentials的格式保存。
https://gituser:gitpassword@domain.xxx

DOMAIN.XXX 可能是 github.com、bitbucket.org 或其他网站

请参阅文档

重新启动终端。


3
别忘了重新启动Git Bash窗口。只有这样,它才能对我起作用。 - sofs1
另一种不推荐的替代方案是将[凭据]和git凭据留在原处,并直接将密码存储在.gitconfig中,可以手动或使用git config ..进行操作。 - Timo
重启意味着执行 exec bash - Timo
诚实的问题,为什么针对特定用户文件需要sudo权限? - Petross404

107

在查阅了数十篇Stack Overflow帖子、博客等资料后,我尝试了每一种方法,最终得出了这个方案。它涵盖了所有内容。

纯净版DevOps Git凭证和私有包备忘单

以下是您可以安全地使用的所有方式和工具,通过它们可以进行Git身份验证以克隆存储库而无需交互式密码提示

  • SSH公钥
    • SSH_ASKPASS
  • API访问令牌
    • GIT_ASKPASS
    • .gitconfig insteadOf
    • .gitconfig [credential]
    • .git-credentials
    • .netrc
  • 私有软件包(免费)
  • Node.js / npm package.json
  • Python / pip / eggs requirements.txt
  • Ruby gems Gemfile
  • Go go.mod

The Silver Bullet

想要Just Works™吗?这就是神奇的银弹。

获取您的访问令牌(如果需要GitHub或Gitea的说明,请参见备忘单中的相应部分),并在环境变量中设置它(用于本地开发和部署):

MY_GIT_TOKEN=xxxxxxxxxxxxxxxx

对于 GitHub,复制并粘贴以下这些代码 verbatim(逐字翻译):

git config --global url."https://api:$MY_GIT_TOKEN@github.com/".insteadOf "https://github.com/"
git config --global url."https://ssh:$MY_GIT_TOKEN@github.com/".insteadOf "ssh://git@github.com/"
git config --global url."https://git:$MY_GIT_TOKEN@github.com/".insteadOf "git@github.com:"

恭喜。现在,任何自动化工具克隆Git存储库时都不会受到密码提示的阻碍,无论是使用HTTPS还是SSH URL的任何样式。

没有使用GitHub?

对于其他平台(Gitea、GitHub和Bitbucket),只需更改URL即可。不要更改用户名(虽然是任意的,但它们需要用于不同的配置条目)。

兼容性

这适用于macOS、Linux、Windows(在Bash中)、Docker、CircleCI、Heroku、Akkeris等本地环境。

更多信息

请参见抄袭表的“.gitconfig insteadOf”部分。

安全性

请参见抄袭表的“安全”部分。


10
我需要的是 git config --global credential."https://somegithost.com".username MyUserName 这个命令,它在你的备忘录中有提到,但在帖子的其他地方却没有。这个特定的解决方案并没有回答楼主的问题,但它回答了我的问题,所以谢谢! - TheDudeAbides
3
最终:关于在没有Jenkins凭证助手或Vault的情况下,针对流水线进行非交互式全局API访问令牌使用的文档。 - Matt Schuchard
1
不仅这样做没有起作用,而且现在我根本无法提交到Git :-( - robcarver
1
@MaxN 没有区别。每个服务只有一个配置选项集 - 因此,您不仅针对 github 有3个选项,还会有3个选项用于 gitea、3个选项用于 gitlab 和 3个选项用于 bitbucket 等等。 - coolaj86
1
天啊,它终于能用了!我为了解决这个问题已经折腾了6个小时,然后我看到了这篇文章……在我的情况下,我正在配置一个自动化安装Python库的过程,直接从GitHub中获取AWS Lambda Docker镜像。-- 感谢@coolaj86,你是拯救者。 - Marin
显示剩余11条评论

87

我认为缓存凭据比永久存储凭据更安全:

git config --global credential.helper 'cache --timeout=10800'

现在你可以输入你的用户名和密码(git pull 或者...),并且在接下来的三个小时内继续使用Git。

非常好而且安全。

超时时间单位为秒(本例中为三小时)。


67

要进行全局设置,请打开终端(无论在何处),运行以下命令:

  git config --global user.name "your username"
  git config --global user.password "your password"

因此,您在计算机上拥有的任何本地Git存储库都将使用该信息。

您可以通过执行以下操作为每个存储库单独配置:

  • 在存储库文件夹中打开终端。

  • 运行以下命令:

  git config user.name "your username"
  git config user.password "your password"

它仅影响该文件夹(因为您的配置是本地的)。


18
将这样的凭据放在简单的配置文件中对任何人都能看到,这不是很危险吗? - bool3max
2
你的问题应该属于另一个话题。在这里我们讨论如何配置全局和本地的Git用户名和密码。 - Tuananhcwrs
27
我想补充一点,询问答案可能存在的安全问题在这里是有意义的,因为它直接影响答案的质量并可能会影响成千上万个使用它的用户。 - Michael Kargl
3
对我来说不起作用,添加了--local标签,但仍然没有反应。 - PayamB.
我认为@bool3max的问题是一个公平的问题。然而,没有人真正回答。git config --global仍然只能由用户在~/.gitconfig中访问,因此从这个意义上说,它可能不比您家目录中没有密码保护的私有ssh密钥(或类似于aws cli的~/.aws/config)更糟糕。如果您对git config使用了--system,它将对计算机上的所有用户可用,因此最好不要这样做,也没有必要,尽管它仍然仅限于计算机上的其他用户。 - Jason S
嗯... user.name 用于在编写提交信息时表示作者的全名。这与用于身份验证远程服务器的用户名无关。而且,绝不能将密码存储在配置文件中(这是 git-config 的作用)。 - undefined

64
只需将您的凭据放在URL中,如下所示:
https://Username`**:**`Password`**@**`github.com/myRepoDir/myRepo.git`

你可以像这样存储它:

git remote add myrepo https://Userna...

...如何使用它的示例:

git push myrepo master`

现在要列出URL别名:

git remote -v

...而删除其中一个的命令为:

git remote rm myrepo

9
你可以在URL中省略密码,这样Git会要求你输入密码,而不是用户名和密码一起输入。 - kangaroo
1
使用SSH比HTTP更加容易和安全。因此,您可以保持Git密码的机密性,并仅使用您的SSH密钥。 有关Git上SSH的信息:https://help.github.com/en/enterprise/2.16/user/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent git@github.com:Username/myRepo.git - Loich
2
在URL中放置您的密码会将其保存到终端的历史记录中,因此这种方式并不是非常安全。 - Josh Correia
1
请注意,目前只能通过 https 克隆 Wiki,而不能通过 ssh,因此这样的解决方案可能会有用。另外,请注意您可以使用 oauth-token,这比您的 GitHub 密码稍微更安全一些。 - AstroFloyd
曾经使用过 Windows 凭据管理器,需要输入密码才能访问! - JGlass

62

您可以使用git-credential-store在磁盘上以未加密的方式存储密码,仅受文件系统权限保护。

示例

git config credential.helper store
git push http://example.com/repo.git

Username: <type your username>
Password: <type your password>

[Several days later]

git push http://example.com/repo.git

[Your credentials are used automatically]

您可以检查存储在文件~/.git-credentials中的凭据。

要了解更多信息,请访问git-credential-store - 在磁盘上存储凭据的助手


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