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

我想在Git扩展资源树或任何其他Git GUI中自动使用推拉功能,而无需每次都在提示中输入我的用户名和密码。

那么如何在Git中保存我的凭据?

3103438 次浏览

注意事项:此方法将明文中的凭据保存在PC的磁盘上。计算机上的每个人都可以访问它,例如恶意NPM模块。

运行

git config --global credential.helper store

然后

git pull

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

如果您想稍后更改密码

git pull

将失败,因为密码不正确,git然后从~/.git-credentials文件中删除违规的user+密码,所以现在重新运行

git pull

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

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

git config --global credential.helper store

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

之后,对于与远程存储库的后续通信,您不必提供用户名和密码。

存储格式是.git-credentials文件,以明文形式存储。

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

git config credential.helper 'cache --timeout=<timeout>'

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


警告:如果您使用此方法,您的Git帐户密码将以明文格式保存,在global .gitconfig file中,例如在Linux它将是/home/[username]/.gitconfig

如果您不希望这样做,请为您的帐户使用ssh key

打开凭据助手,以便Git将您的密码保存在内存中一段时间:

在终端中,输入以下内容:

# Set Git to use the credential memory cachegit 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帮助

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

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

ssh-add -K ~/.ssh/id_rsa

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

您可以将~/.gitconfig文件编辑为商店您的证书

sudo nano ~/.gitconfig

应该已经有了

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

您应该在此文件的底部添加以下内容。

[credential]helper = store

我推荐这个选项的原因是因为它是全局的,如果在任何时候你需要删除这个选项,你知道去哪里改变它。

仅在您的个人计算机中使用此选项。

然后当你拉|克隆|输入你的Git密码时,一般情况下,密码会以~/.git-credentials的格式保存

https://gituser:gitpassword@domain.xxx

DOMAIN.XXX可以是github.com、bitbucket.org或其他人

留档

重新启动您的终端。

只需将您的凭据像这样放在URL中:

https://Username`**:**`Password`**@**`github.com/myRepoDir/myRepo.git`

你可以这样商店

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

…示例使用 it:

git push myrepo master`

现在是列表 URL别名:

git remote -v

…并且删除其中一个的命令:

git remote rm myrepo

推荐和安全的方法:SSH

创建一个SSHGitHub密钥。转到github.com设置SSH和GPG密钥新的SSH键。现在将您的私钥保存到您的计算机。

然后,如果私钥在~/. ssh目录中保存为id_rsa,我们将其添加以进行身份验证:

ssh-add -K ~/.ssh/id_rsa

更安全的方法:缓存

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

git config --global credential.helper cache

您还可以将超时周期(以秒为单位)设置为:

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

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

示例

git config credential.helper storegit 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-凭据存储-帮助将凭据存储在磁盘上

在这种情况下,您需要使用以下命令行告诉Git记住您的GitHub密码和用户名:

git config --global credential.helper wincred

如果您使用的是使用SSH密钥的存储库,则需要SSH密钥进行身份验证。

对于全局设置,打开终端(从任何地方),运行以下命令:

  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"

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

除了编辑~/.gitconfig文件之外,如果您从命令行调用,您可以这样做:

git config --local --edit

git config --global --edit

输入图片描述在默认文本编辑器中编辑git配置文件

您还可以使用命令行直接编辑git配置文件(无需编辑器)

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表示为项目或操作系统用户保存配置参数。

评论来自roFrol开始,在LinuxUbuntu上,从这个答案开始,这里是如何在Ubuntu上做到这一点:

sudo apt-get install libsecret-1-0 libsecret-1-devcd /usr/share/doc/git/contrib/credential/libsecretsudo makegit config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret

其他一些发行版提供二进制文件,因此您不必构建它。

在OS X中,它通常“内置”并添加了“osxkeychain”的默认模块,因此您可以免费获得它。OS X内置的和自制的品种都默认存在它。

在浏览了几十的Stack Overflow帖子、博客等之后,我尝试了方法,这就是我想出的。它涵盖了一切

普通运营模式Git凭据和私有包备忘单

这些是您可以安全地验证Git以克隆存储库没有交互式密码提示的所有方法和工具。

  • SSH公钥
    • SSH_ASKPASS
  • API访问令牌
    • GIT_ASKPASS
    • 用. gitconfig代替
    • . gitconfig[凭据]
    • . git凭证
    • . netrc
  • 私人套餐(免费)
  • Node.js/npmpackage.json
  • python/pip/鸡蛋requirements.txt
  • ruby宝石
  • go.mod

银色子弹

想要只是工作™?这是神奇的银弹。

获取您的访问令牌(如果您需要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:"

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

不使用GitHub?

对于其他平台(Gitea、GitHub和比特桶),只需更改URL。不要更改用户名(尽管是任意的,但不同的配置条目需要它们)。

兼容性

这在macOS,Linux,Windows(Bash),Docker,CircleCI,Heroku,Akkeris等本地工作。

更多信息

请参阅备忘单的“. gitconfig insteOf”部分。

安全合规

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

以前的答案都不适合我。每次我想fetchpull时,我都会得到以下结果:

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


对于Mac

我能够阻止它问我的密码:

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

对于windows

我能够使用Stack Exchange帖子中的信息使其工作:如何避免每次我推送到比特桶时被问到密码

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

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

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

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

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

这对于GitHub机器人非常有用,例如通过为不同的分支设置规则来解决在同一个Docker Hub存储库中的链自动构建,然后通过在Docker Hub的post_push挂钩中推送它来触发它。

这方面的一个例子可以在Stack Overflow上看到这里

只要用

git config --global credential.helper store

并执行git拉取。它会询问用户名和密码。从现在开始,它不会提供任何用户名和密码提示。它将存储详细信息。

在阅读了完整的答案并尝试了这个问题的大部分答案之后,我最终找到了适合我的程序。我想分享它,以防有人必须处理复杂的用例,但仍然不想像我一样浏览所有答案和git凭据信息存储等手册页。

在下面的过程中,我建议你(像我一样)必须使用几种不同的用户名/密码组合来处理来自多个提供商(GitLab、GitHub、比特桶等)的多个存储库。如果你只有一个帐户可以使用,那么你最好使用git config --global credential.helper storegit config --global user.name "your username"等解决方案,这些解决方案在前面的答案中已经很好地解释了。

我的解决方案:

  1. 取消设置全局凭据助手,以防一些以前的实验妨碍:)

    git config --global --unset credentials.helper
  2. 移动到存储库的根目录并禁用本地凭据助手(如果需要)

    cd /path/to/my/repogit config --unset credential.helper`
  3. 创建一个文件来存储存储库的凭据

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

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

    git config credential.helper store
  4. 设置您的用户名

    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”并在随后的访问中自动使用相同的数据。

我认为缓存凭证更安全,而不是永远存储它:

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

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

它是好的和安全的。

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

查看官方Git留档:

如果您使用SSH传输连接到遥控器,则可以你有一个没有密码的密钥,它允许你无需输入用户名和密码即可安全传输数据。但是,这在HTTP协议中是不可能的-每个连接需要用户名和密码。这对于具有双重验证的系统,其中您用于密码是随机生成的,无法发音。

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

  • 默认根本不缓存。每个连接都会提示您您的用户名和密码。

  • “缓存”模式将凭据保存在内存中一段时间时间。没有一个密码存储在磁盘上,它们是15分钟后从缓存中清除。

  • “存储”模式将凭据保存到磁盘上的纯文本文件中,而且永远不会过期这意味着除非你改了密码对于Git主机,您永远不必输入凭据这种方法的缺点是您的密码存储在在您的主目录中的纯文件中的明文中。

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

  • 如果您使用的是Windows,您可以安装一个名为“Git”的助手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

7.14 Git工具-凭证存储

如果您使用Windows上的Git Credential Manager

git config -l应该显示:

credential.helper=manager

但是,如果没有提示您输入凭据,请按照以下步骤操作:

  1. 从开始菜单打开控制面板
  2. 选择用户帐户
  3. 在左侧菜单中选择管理您的凭据
  4. 删除与Git或GitHub相关的任何凭据

如果您有代理并且您的Git服务器在内部网络上,请确保您设置了没有HTTP_PROXYHTTPS_PROXYNO_PROXY环境变量。

您还可以使用git-gui测试Git获取/推送/拉取,它链接到C:\Users\<username>\AppData\Local\Programs\Git\mingw64\libexec\git-core中的凭据管理器二进制文件

对于Windows用户,请查看. gitconfig文件并检查已为凭据助手配置了什么。如果您有以下…

[凭据“helperselector”]选择=wincred

您将在Windows凭证管理器中找到凭据。

在此输入图片描述

在那里您可以编辑凭据。

注意:Wincred已被弃用,请参阅…

https://github.com/Microsoft/Git-Credential-Manager-for-Windows#notice-this-project-is-no-longer-being-maintained-warning

因此,您可能希望重新配置Git以使用内置的Git凭据管理器…

git config --global credential.helper manager
git config --global user.name "your username"git config --global user.password "your password"

检查

git config --list

对于Windows用户,这种方式将起作用:

注意:如果你已经为GitHub启用了双重验证,请将其禁用一段时间

  • 第一步

    转到控制面板用户帐户凭证管理器Windows凭据

  • 第二步

    转到通用证书部分→添加通用凭据

    在此输入图片描述

  • 第3步-填写字段

    Internet或网络地址:git.https://github.com

    用户名:您的GitHub用户名

    密码:您的GitHub用户名

    在此输入图片描述

    现在单击好的。这将把您的GitHub帐户的密码和用户名保存到您的本地机器

全局保存用户名和密码:

git config --global user.name "fname lname"git config --global user.email "example@gmail.com"git config --global user.password "secret"

获得特定设置,

git config --global --get user.namegit config --global --get user.emailgit config --global --get user.password

获取所有Git设置:

git config --list --show-origin

如果git客户端不关心安全性,请以这种方式编辑url:

git remote set-url origin https://${access_token}@github.com/${someone}/${somerepo}.git

git clone的情况下:

git clone https://${access_token}@github.com/${someone}/${somerepo}.git

我个人不赞成git configglobal域,因为这将是一个多帐户的情况下一团糟。

access_token是您可以在Settings / Developer settings / Personal access tokens中生成的内容。请记住使用repo范围授予它。

GitHub的建议现在已经改变了,最好的方法也是最简单的。详情在这里

  1. 安装GitHub官方cli。例如,对于mac:brew install gh
  2. 在终端中键入gh auth login,然后按照提示进行操作。

从2021年起,HTTPS遥控器有了安全的用户友好的跨平台解决方案。不再输入密码!不再有SSH密钥!不再有个人访问令牌!

安装Git Credential Manager由GitHub开发(下载量)。它支持对GitHub、BitBucket、Azure和GitLab的无密码浏览器内OAuth身份验证。这意味着您可以启用GitHub上的双重验证和其他平台,大大提高您帐户的安全性。

推送时,系统会为您提供多种身份验证方法:

> git pushSelect an authentication method for 'https://github.com/':1. Web browser (default)2. Device code3. Personal access tokenoption (enter for default): 1info: please complete authentication in your browser...

在Linux,一点点的设置是必需的。以下将凭据缓存在内存中20小时,因此您每天最多必须进行一次身份验证。

git-credential-manager-core configuregit config --global credential.credentialStore cachegit config --global credential.cacheoptions "--timeout 72000"

熟悉gnome-keyring或KWallet的高级用户可能更喜欢更改凭据存储而不是lib秘密。

化妆品配置文档):

  1. 更喜欢在终端而不是GUI中选择身份验证方法(点击次数更少)
  2. 始终使用浏览器方法,而不是每次都被询问(甚至更少的按键)
git config --global credential.guiPrompt falsegit config --global credential.gitHubAuthModes browser

要将您的用户名和用户密码保存到github帐户中,只需按顺序运行这些命令。

git config --global user.name "userName"git config --global user.email "usernam@gmail.com"git config --global user.password "userPassword"git config --global credential.helper storegit config --list --show-origin

然后使用以下命令生成密钥:

ssh-keygen -t rsa -C "useremail@gmail.com"

说明:复制创建id_rsa文件的文件位置然后转到该文件位置-->打开gitbash或命令提示符-->运行命令-cat id_rsa.pub

SSH密钥将被拒绝支付,复制此SSH密钥并将其粘贴到您的gihub/gitlab帐户中

对于有相同问题的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密码更好(例如,它在远程共享机器中可能不安全)

双因素身份验证改变了用户对网站进行身份验证的方式,但Git仍然假设用户可以从内存中键入密码。

介绍认证机构git认证-oauth:一个Git凭据助手,它使用OAuth安全地对GitHub、GitLab、BitBucket和其他伪造进行身份验证。

不再有密码!不再有个人访问令牌!不再有SSH密钥!

第一次推送时,帮助程序将打开浏览器窗口进行身份验证。缓存超时内的后续推送不需要交互。

https://github.com/hickford/git-credential-oauth/releases/安装

配置为:

git config --global --unset-all credential.helpergit config --global --add credential.helper "cache --timeout 7200" # two hoursgit config --global --add credential.helper oauth

你的问题:

我想在Git扩展、Sourcetree或任何其他Git GUI中自动使用推送和拉动,而无需每次在提示中输入我的用户名和密码。

如果您在github或其他提供商中,我建议不要将它们保存在Git中,例如~/.git-credentials,而是将它们视为加密的秘密

将凭证设置为以下格式:

https://your_user_name:your_token@github.com/your_user_name/your_repo_name.git

把它作为加密的秘密,如secrets.REPOSITORY:

操作秘密

然后您可以使用它来克隆公共或私人回购及其子模块,以及自动执行推送和拉动

# put the credentials in a variableexport REPOSITORY=$\{\{ secrets.REPOSITORY }}
# git clone public or private reposgit clone --recurse-submodules -j8 ${REPOSITORY}
# git pull will do automaticcd /path/to/the/repogit pull
# git push to a branch in the repogit add . && \git commit -m "Action from ${GITHUB_SHA}" && \git push --force $REPOSITORY master:$BRANCH