如何在git [GitExtension]中保存用户名和密码?


1231

我想在GitExtension中自动使用推拉功能,而不必每次都在提示中输入用户名和密码。

那么如何将我的凭据保存在git中呢?


1
:您还可以通过SSH进行身份验证stackoverflow.com/questions/6565357/...
安东·塔拉先科


1
@AntonTarasenko我的gitconfig关于代理什么也没说,仅[user]电子邮件= email@dummy.com名称= uname [凭据] helper =存储
gc7__

Answers:


2192

git config --global credential.helper store

然后

git pull

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

如果您以后想要更改密码

git pull

会失败,因为密码不正确,然后git从~/.git-credentials文件中删除有问题的用户+密码,因此现在重新运行

git pull

提供一个新密码,使其可以更早地工作。


6
-u标志对以后更改密码有何重要性?
lucidbrot

8
适用于Debian / Ubuntu的使用libsecret stackoverflow.com/questions/36585496/...
rofrol

3
@lucidbrot很抱歉回复晚。git pull -u不适用于最新版本。我已经更新了答案。希望它能回答您的问题。
Neetika '17

51
请注意,这会将您的用户名和密码存储在〜/ .git-credentials的纯文本文件中。任何人都可以打开并阅读。
RoboAlex

12
这行不通。它不能拉。
Urasquirrel

348

您可以使用git config启用git中的凭据存储。

git config --global credential.helper store

运行此命令时,第一次从远程存储库中拉出或推送时,系统会询问您用户名和密码。

之后,为了与远程存储库进行后续通信,您无需提供用户名和密码。

存储格式是.git-credentials文件,以纯文本格式存储。

此外,您还可以将其他帮助程序用于git config credential.helper,即内存缓存:

git config credential.helper cache <timeout>

这需要一个可选的timeout parameter,确定凭据将在内存中保留多长时间。使用帮助程序,凭据将永远不会接触磁盘,并且在指定的超时后将被删除。该default值是900 seconds (15 minutes).


警告:如果使用此方法,则您的git帐户密码将以plaintext格式保存global .gitconfig file,例如,在linux中将为/home/[username]/.gitconfig

如果您不希望这样做,ssh key请改为使用。


3
希望您显示.gitconfig文件-第一个命令已被第二个覆盖:(
Adam

3
因为git config credential.helper cache密码将不会保存到文件中,只会存储在内存中。请参阅:git-scm.com/docs/git-credential-cache
SA

1
不起作用。致命:验证失败。甚至都不要求输入密码。
菲利普·雷戈

2
就像附录一样,您的私人ssh密钥也将以明文形式存储在用户可访问的位置,因此,在两种情况下,实质上都是相同的攻击面。
法尔科

我如何在gitlab中使用它
anil

169

推荐的安全方法:SSH

创建一个ssh Github密钥。转到github.com- >设置-> SSH和GPG密钥->新SSH密钥。现在将私钥保存到计算机。

然后,如果私钥〜/ .ssh /目录中另存为id_rsa,我们将其添加为身份验证,如下所示:

ssh-add -K ~/.ssh/id_rsa


一种更安全的方法:缓存

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

git config --global credential.helper cache

您还可以这样设置超时时间(以秒为单位):

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


一种更不安全的方法

也可以使用Git-credential-store,但是这样将密码保存在磁盘上的纯文本文件中:

git config credential.helper store


过时的答案-快速又不安全

这是将密码以纯文本格式存储的不安全方法。如果有人控制了您的计算机,您的密码就会被泄露!

您可以这样设置用户名和密码:

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

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

15
这对我不起作用,git clone仍要求输入用户名和密码
Oliver

11
我不建议像这样存储您的密码,因为“ git config --global -l”会在控制台上显示您的密码
CCC

1
这对我不起作用。奇怪的是,它对任何人都有效,因为在gitconfig的规范中没有“密码”的余地
Hamish Todd

.gitconfig是不同的文件:位于主文件夹中的.git-credentials包含要在URL中使用您的用户名和密码进行回购的URL,就像git:// username:password @ server / git / repo一样,请小心,已保存文字密码。如果不能使用ssh键,请使用“ git config --global credential.helper缓存”。
skabbit

当我尝试手动添加用户和密码时,配置文件损坏,我不得不再次克隆存储库。不要尝试这个..
Letie Techera

102

打开凭据助手,以便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帮助


7
您是唯一一个建议使用全球版本的重要提示,因为每当我重新克隆该回购协议时,它对于我来说都是毁灭性的
Xerus 18'Jan

4
如何将超时设置为无穷大?我再也不想输入密码了。
阿瓦曼德

8
@Avamander只需更换cache用零件store。因此,完整的命令将是:git config --global credential.helper store。请注意,这会将您的密码存储在一个开放文本文件中(可以说没有任何加密)。
Aleksandar '18

2
@Casper不适用于多个帐户,不会像希望的那样根据电子邮件从商店中获取密码,而是采用列表中的第一个密码。
阿瓦曼德

2
@Avamander hm ..应该是那样的还是可能是错误?--timeout参数的最大值是多少?
Aleksandar '18

50

您可以编辑~/.gitconfig到文件存储您的凭据

sudo 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 | 其他

查看文件

重新启动终端。


1
不要忘记重启git bash窗口。只有当我这样做时,它才对我有用。
sofs1

33

只需将您的凭据放在Url中,如下所示:

https://UsernamePassword@github.com/myRepoDir/myRepo.git

您可以这样存储它:

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

... 使用它的示例:

git push myrepo master


现在就是列出 URL别名:

git remote -v

...以及删除其中之一的命令:

git remote rm myrepo


8
您也可以将密码保留在URL之外,以便Git询问您的密码,而不是用户名。
袋鼠

使用SSH而不是HTTP既容易又安全。因此,您可以将Git密码保密,而仅使用SSH密钥。:关于Git的SSH信息help.github.com/en/enterprise/2.16/user/... git@github.com:Username/myRepo.git
洛伊希

在网址中输入密码会将密码保存到终端的历史记录中,因此这种方法不太安全。
Josh Correia

需要注意的是一个Wiki目前只能通过克隆https,不是ssh,所以像这样的解决方案可能是有用的存在。还要注意,您可以使用oauth-token,这比GitHub密码安全得多。
AstroFloyd

31

对于全局设置,请从任何位置打开终端(运行):

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

这样,您在计算机上拥有的任何本地git repo都将使用该信息。

您可以通过以下操作为每个存储库分别进行配置:

  • 在repo文件夹中打开终端。
  • 运行以下命令:

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

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


8
在任何人都可以查看的简单配置文件中拥有这样的凭证不是危险吗?
bool3max,

1
您的问题应该是另一个话题。在这里,我们讨论了如何为git全局和本地配置名称和密码。
Tuananhcwrs

感谢您的输入伙伴
bool3max,

11
我想补充一下,在这里回答问题的可能的安全性问题很重要,因为它直接影响其质量,并可能影响成千上万的用户实施该解决方案。
Michael Kargl

2
不适用于我,添加了--local标签,但再次没有发生
PayamBeirami

23

您可以使用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-帮助程序将凭据存储在磁盘上


17

如果使用SSH身份验证,则比使用用户名/密码身份验证更安全。

如果您使用的是Mac,则SSH客户端身份验证已集成到MacOS钥匙串中。创建SSH密钥后,在终端中输入:

ssh-add -K ~/.ssh/id_rsa

这会将SSH私钥添加到MacOS钥匙串中。git客户端连接到远程服务器时将使用ssh。只要您在服务器上注册了ssh公钥,就可以了。


1
应该不是K吗?
dez93_2000 '18

1
仅供参考:我在Mac上工作。话虽如此,在“ man”信息中:“ -k”将密钥加载到代理中或从代理中删除密钥时,仅处理普通私钥并跳过证书。“ -K”添加身份时,每个密码短语也将存储在用户的钥匙串中。当使用-d删除身份时,将从中删除每个密码短语。
Birol Efe

3
我认为这不适用于基于https的存储库。
zakmck '18年

5
这个答案似乎使密码(HTTPS repos)与SSH私钥混淆。
史蒂夫·贝内特

2
我不同意。通过授予对主机的SSH访问权限,您将不会更加安全。使用HTTP身份验证,窃取凭据的人只能访问GitHub/GitLab。令牌也被设计为具有有限的寿命。
Dimitri Kopriwa

16

在浏览了数十篇 SO帖子,博客等之后,我尝试了每种方法,这就是我想出的方法。它涵盖了一切。

Vanilla DevOps Git凭证和私有软件包速查表

这些都是您可以安全地验证git来克隆存储库的所有方式和工具,而无需交互式密码提示

  • SSH公钥
    • SSH_ASKPASS
  • API访问令牌
    • GIT_ASKPASS
    • .gitconfig代替
    • .gitconfig [凭证]
    • .git-credentials
    • .netrc
  • 私人套餐(免费)
    • 节点/ npm package.json
    • python / pip /鸡蛋要求.txt
    • 红宝石宝石Gemfile
    • golang go.mod

银子弹

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

获取您的访问令牌(如果需要Github或Gitea指令,请参阅备忘单中的部分),并将其设置在环境变量中(本地开发和部署都需要):

MY_GIT_TOKEN=xxxxxxxxxxxxxxxx

对于Github,逐字复制并运行以下行:

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:"

恭喜,现在无论使用https还是ssh url样式,任何自动克隆git存储库的工具都不会受到密码提示的阻碍。

不使用Github?

对于其他平台(Gitea,Github,Bitbucket),只需更改URL。请勿更改用户名(尽管是任意名称,但不同的配置条目需要它们)。

兼容性

这可以在MacOS,Linux,Windows(在Bash中),Docker,CircleCI,Heroku,Akkeris等本地运行。

更多信息

请参阅备忘单的“ .gitconfig代替Of”部分。

安全

请参阅备忘单的“安全性”部分。


2
这是一个救命稻草。谢谢。
annaoomph

2
我所追求的是git config --global credential."https://somegithost.com".username MyUserName,它您的备忘单中,但在此答案线程中没有其他地方。该特定解决方案不能回答OP的问题,但可以回答我的问题,所以谢谢!
TheDudeAbides

1
这太好了!最佳答案,非常感谢。
帕萨

12

在这种情况下,您需要使用git凭据助手来通过以下命令行告诉git记住您的GitHub密码和用户名:

git config --global credential.helper wincred 

如果您使用SSH密钥使用回购协议,则需要SSH密钥进行身份验证。


11

上面的答案对我都不起作用。每当我想要fetch或以下时,我都会不断获取以下内容pull

Enter passphrase for key '/Users/myusername/.ssh/id_rsa':


对于Mac

我可以通过以下方式阻止我询问密码:

  1. 通过运行以下命令打开配置: vi ~/.ssh/config
  2. 添加了以下内容: UseKeychain yes
  3. 保存并退出:按Esc,然后输入:wq!

对于Windows

我能够使用此stackexchange中的信息使其工作:https : //unix.stackexchange.com/a/12201/348665


那是因为您使用的是SSH协议(其他答案使用HTTPS)。
mariusm

6

除了编辑~/.gitconfig文件,您还可以执行以下操作:

git config --local --edit

要么

git config --global --edit

注意始终使用引号:

git config --local user.name 'your username'
git config --local user.password 'your password'

要么

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

如果使用双引号,则用户名和密码可能会使用某些会破坏密码的字符。

--local--global意味着为项目或os用户保存配置参数。


还要检查这一个解释,甚至更多。
prosti


4

将用户名和密码存储在.git-credentials中

.git-credentials是您在运行时存储用户名和密码(访问令牌)的位置git config --global credential.helper store,这是其他答案的建议,然后键入您的用户名和密码或访问令牌:

https://${username_or_access_token}:${password_or_access_token}@github.com

因此,为了保存用户名和密码(访问令牌):

git config —-global credential.helper store
echo “https://${username}:${password_or_access_token}@github.com“ > ~/.git-credentials

这对于github机器人非常有用,例如,通过为不同分支制定规则来解决同一docker存储库中的Chain自动化构建,然后通过将其推送到post_pushdocker hub的挂接器中来触发它。

一个例子可以在这里的stackoverflow中看到。


谢谢,您是救生员!我们还可以设置https:// $ {access_token}:$ {access_token} @ github.com
Lucas Mendes Mota Da Fonseca

1
@LucasMendesMotaDaFonseca访问令牌可以用作用户名???
徐佳浩

3

缓存git凭据的快速方法:

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

好又安全

超时以秒为单位。


2

在完整地阅读了该主题并尝试了该问题的大多数答案之后,我最终找到了适合我的过程。我想分享它,以防有人不得不处理一个复杂的用例,但仍然不想像我一样浏览整个线程以及gitcredentialsgitcredentials-store等手册页。

在下面的步骤中找到我建议的程序,如果您(像我一样)必须使用几种不同的用户名/密码组合来处理来自多个提供商(GitLab,GitHub,Bitbucket等)的多个存储库。如果您只使用一个帐户,那么最好使用前面的答案中已经很好解释的git config --global credential.helper storegit config --global user.name "your username"等解决方案。

我的解决方案:

  1. 取消设置全局凭据帮助程序,以防某些以前的实验成为问题:)

> git config --global --unset credentials.helper

  1. 移至存储库的根目录并禁用本地凭据帮助程序(如果需要)

> cd /path/to/my/repo

> git config --unset credential.helper

  1. 创建一个文件来存储您的回购凭证

> git config credential.helper 'store --file ~/.git_repo_credentials'

注意:此命令在您的主目录中创建一个名为“ .git_repo_credentials”的新文件,Git将您的凭据存储在该文件中。如果您未指定文件名,则Git使用默认的“ .git_credentials”。在这种情况下,只需发出以下命令即可:

> git config credential.helper store

  1. 设置您的用户名

git config credential.*.username my_user_name

注意:如果您的存储库来自同一提供商(例如,GitLab),则通常可以使用“ *”。如果相反,您的存储库由不同的提供程序托管,则建议为每个存储库显式设置指向提供程序的链接,如以下示例(对于GitLab):

git config credential.https://gitlab.com.username my_user_name

此时,如果发出要求您提供凭据的命令(例如git pull),将要求您输入与“ my_user_name”相对应的密码。这仅需要一次,因为git将凭据存储到“ .git_repo_credentials”,并在后续访问时自动使用相同的数据。


2

从rifrol的评论(在Linux Ubuntu上)到此答案,这是在Ubuntu中的方法:

sudo apt-get install libsecret-1-0 libsecret-1-dev
cd /usr/share/doc/git/contrib/credential/libsecret
sudo make
git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret

其他发行版提供了二进制文件,因此您无需构建它。

在OS X中,它通常是使用默认模块“ osxkeychain”“内置”的,因此您可以免费获得它。


2

查看官方git文档:

如果您使用SSH传输方式连接到远程服务器,则可以使用没有密码的密钥,从而无需输入用户名和密码即可安全地传输数据。但是,HTTP协议无法做到这一点–每个连接都需要用户名和密码。对于具有两因素身份验证的系统而言,这变得更加困难,在该系统中,您用于密码的令牌是随机生成的并且不会发音。

幸运的是,Git有一个凭证系统可以帮助您解决这一问题。Git框中提供了一些选项:

  • 默认为完全不缓存。每个连接都会提示您输入用户名和密码。

  • “缓存”模式将凭据保留在内存中一定时间。没有密码存储在磁盘上,并且在15分钟后会从缓存中清除密码。

  • “存储”模式将凭据保存到磁盘上的纯文本文件中,并且它们永不过期。这意味着,除非您更改Git主机的密码,否则您将无需再次输入凭据。这种方法的缺点是您的密码以明文形式存储在主目录中的纯文件中。

  • 如果您使用的是Mac,则Git带有“ osxkeychain”模式,该模式将凭据缓存在系统帐户附带的安全钥匙串中。此方法将凭据存储在磁盘上,并且永不过期,但是使用存储HTTPS证书和Safari自动填充的同一系统对其进行加密。

  • 如果您使用的是Windows,则可以安装名为“ Git Credential Manager for Windows”的帮助程序。这类似于上述的“ osxkeychain”帮助程序,但是使用Windows凭据存储来控制敏感信息。可以在https://github.com/Microsoft/Git-Credential-Manager-for-Windows中找到它 。

您可以通过设置Git配置值来选择以下方法之一:

$ git config --global credential.helper cache

$ git config --global credential.helper store

https://git-scm.com/book/zh/v2/Git-Tools-Credential-Storage

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.