有没有办法缓存https凭据以推送提交?

我最近切换到将我的存储库同步到GitHub上的https://(由于防火墙问题),它每次都要求输入密码。

有没有办法缓存凭据,而不是每次git push时都进行身份验证?

1098065 次浏览

自Git 1.7.9(2012年发布)以来,Git中有一个简洁的机制来避免在HTTP/HTTPS中一直输入密码,称为凭证助手

您可以只使用以下凭据助手之一:

git config --global credential.helper cache

credential.helper缓存值告诉Git将您的密码缓存在内存中特定数量的分钟。默认值为15分钟,您可以通过以下方式设置更长的超时:

# Cache for 1 hourgit config --global credential.helper "cache --timeout=3600"
# Cache for 1 daygit config --global credential.helper "cache --timeout=86400"
# Cache for 1 weekgit config --global credential.helper "cache --timeout=604800"

如果需要,您还可以永久存储您的凭据,请参阅下面的其他答案。

GitHub的帮助还表明,如果您使用Mac OS X并使用自制安装Git,您可以使用原生Mac OS X密钥库:

git config --global credential.helper osxkeychain

对于windows,有一个助手称为适用于Windows的Git Credential Managermsysgit中的wincred

git config --global credential.helper wincred # obsolete

Git for Windows 2.7.3+(2016年3月):

git config --global credential.helper manager

为了Linux,您将使用(在2011年)#0(或其他密钥环实现,例如KWallet)。

今天(2020年),这将是(Linux)

Fedora

sudo dnf install git-credential-libsecretgit config --global credential.helper /usr/libexec/git-core/git-credential-libsecret

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

如果您不想像Mark所说的那样以明文形式存储密码,您可以使用不同的GitHub URL进行获取而不是推送。在您的配置文件中,在[remote "origin"]下:

url = git://github.com/you/projectName.gitpushurl = git@github.com:you/projectName.git

当你推送时,它仍然会要求输入密码,但当你获取时,它不会要求输入密码,至少对于开源项目来说是这样。

您还可以让Git使用git证书库永久存储您的凭据,如下所示:

git config credential.helper store

注意:虽然这很方便,但Git会将您的凭据以明文形式存储在项目目录下的本地文件(. git-凭据)(请参阅下面的“home”目录)。如果您不喜欢,请删除此文件并切换到使用缓存选项。

如果你想让Git在每次需要时都继续向你询问凭据连接到远程存储库,您可以运行以下命令:

git config --unset credential.helper

要将密码存储在.git-credentials中的%HOME%目录中,而不是项目目录中:使用--global标志

git config --global credential.helper store

我没有立即意识到我需要先下载帮助程序!我在艾特莱森的永久身份验证与Git存储库找到了credential.helper下载。

引用:

如果您想在OS X上使用带有凭据缓存的Git,请按照以下步骤操作:

下载二进制git-的凭据osxkeychain。

运行下面的命令以确保二进制文件是可执行的:

chmod a+x git-credential-osxkeychain

把它放在目录/usr/local/bin中。

运行下面的命令:

git config --global credential.helper osxkeychain

在GNU/Linux设置中,~/. netrc也可以很好地工作:

$ cat ~/.netrcmachine github.com login lot105 password howsyafather

它可能取决于Git用于HTTPS传输的网络库。

您可以使用凭证助手。

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

其中x是秒数。

TLDR;使用使用Git 1.8.3+加密的netrc文件

在Windows上,可以使用~/.netrc(Unix)或%HOME%/_netrc(注意_)为Git存储库HTTPS URL保存密码。

但是:该文件将以纯文本形式存储您的密码。

解决方案:使用GPG(GNU隐私保护)加密该文件,并让Git在每次需要密码时解密它(用于push/pull/fetch/clone操作)。


注意:使用Git 2.18(Q2 2018),您现在可以自定义用于解密加密.netrc文件的GPG。

提交786ef50提交f07eeed(2018年5月12日)byLuis Marsano(")
(由提交017b7c5中的Junio C Hamano----#0----合并,2018年5月30日)

git-credential-netrc:接受gpg选项

git-credential-netrc被硬编码为“gpg”解密,无论gpg.program选项。
这是像Debian这样的发行版的问题,它们将现代GnuPG称为其他东西,例如'gpg2'


Windows的分步说明

使用Windows:

(Git在其发行版中有一个gpg.exe,但使用完整的GPG安装包括一个gpg-agent.exe,它将记住与GPG密钥关联的密码。)

  • 安装#0,最小gnupg命令行界面(取最近的#1),并使用GPG安装目录完成PATH:

      set PATH=%PATH%:C:\path\to\gpgcopy C:\path\to\gpg\gpg2.exe C:\path\to\gpg\gpg.exe

(注意“copy”命令:Git需要一个Bash脚本来执行命令“gpg”。由于gpg4win-vanilla-2附带gpg2.exe,您需要复制它。)

  • 创建或导入一个GPG密钥,并信任它:

      gpgp --import aKey# orgpg --gen-key

(确保为该密钥添加密码。

  • 相信这把钥匙

  • %PATH%中的目录中安装凭据助手脚本:

      cd c:\a\fodler\in\your\pathcurl -o c:\prgs\bin\git-credential-netrc https://raw.githubusercontent.com/git/git/master/contrib/credential/netrc/git-credential-netrc.perl

(注意:脚本在Git 2.25. x/2.26中重命名,见下文)

(是的,这是一个Bash脚本,但它可以在Windows上运行,因为它将由Git调用。)

  • 以明文形式制作_netrc文件

      machine a_server.corp.comlogin a_loginpassword a_passwordprotocol https
    machine a_server2.corp.comlogin a_login2password a_password2protocol https

(不要忘记“protocol”部分:“http”或“https”,具体取决于您将使用的URL。

  • 加密该文件:

      gpg -e -r a_recipient _netrc

(您现在可以删除_netrc文件,只保留_netrc.gpg加密的文件。)

  • 使用该加密文件:

      git config --local credential.helper "netrc -f C:/path/to/_netrc.gpg -v"

(注意“/”:C:\path\to...根本不起作用。)(您可以使用开头的-v -d来查看发生了什么。)

从现在开始,任何使用需要身份验证的HTTP(S)URL的Git命令都将解密该_netrc.gpg文件并使用与您正在联系的服务器相关联的登录名/密码。第一次,GPG会要求您提供GPG密钥的密码,以解密文件。其他时候,第一次GPG调用的gpg-agent自动启动将为您提供该密码。

这样,您可以在一个文件中记住几个 URL/登录名/密码,并将其加密存储在您的磁盘上。
我发现它比“缓存”助手更方便,您需要记住并为每个远程服务键入(每个会话一次)不同的密码,以便将所述密码缓存在内存中。


在Git 2.26(Q1 2020)中,使用.netrc的示例凭据助手已更新为开箱即用。请参阅打补丁/讨论

提交6579d93提交1c78c78(2019年12月20日)byDenton Liu(#0)
(由提交1fd27f8中的Junio C Hamano----#0----合并,2019年12月25日)

#0:使PERL_PATH可配置

署名:Denton Liu

git-credential-netrc中Perl解释器的sheang路径是硬编码的。
但是,有些用户可能将其位于不同的位置,因此必须手动编辑脚本。

在脚本中添加#0前缀将其表示为模板并忽略生成的版本。
增加Makefile,使其从git-credential-netrc.perl生成git-credential-netrc,就像其他Perl脚本一样。

Makefile食谱被无耻地从contrib/mw-to-git/Makefile中窃取。

还有:

在2.26(2020年第一季度)中,使用. netrc的示例凭据助手已更新为开箱即用。

提交6579d93提交1c78c78(2019年12月20日)byDenton Liu(#0)
(由提交1fd27f8中的Junio C Hamano----#0----合并,2019年12月25日)

#0:在repo之外工作

署名:Denton Liu

目前,git-credential-netrc在git存储库之外不起作用。它失败并出现以下错误:

fatal: Not a git repository: . at /usr/share/perl5/Git.pm line 214.

但是,没有真正的理由需要在存储库中。凭据助手也应该能够在存储库之外正常工作。

调用config()的非自版本,以便git-credential-netrc不再需要在存储库中运行。

杰夫·金(#0)添加:

我假设你使用的是gpg加密的netrc(如果不是,你应该只需使用credential-store)。
对于“只读”密码访问,我发现#0与这样的配置的组合更好:

[credential "https://github.com"]username = peffhelper = "!f() { test $1 = get && echo password=`pass github/oauth`; }; f"

带有Git.pm的2013年“fatal: Not a git repository”错误消息已在Git 2.39(2022年第四季度)中修复:

提交20da61f(2022年10月22日)by杰夫·金(#0)
提交77a1310(16 Oct 2022)by迈克尔·麦克莱恩(#0).
(2022年10月28日提交330135a合并为Junio C Hamano----#0----

#0:信任reg-parse来查找裸存储库

签名人:Jeff King

初始化存储库对象时,我们运行“#0man)让C版本的Git找到正确的目录。
但奇怪的是,如果这失败了,我们不会自动说“不是git存储库”。
相反,我们做自己的纯Perl检查,看看我们是否在一个裸存储库中。

这没有什么意义,因为rev-parse将报告裸目录和非裸目录。
这个逻辑来自d5c7721(“Git.pm:在工作副本中添加对子目录的支持”,2006-06-24,Git v1.4.3-rc1--合并),但我看不出有任何理由不能仅仅依赖rev-parse。
更糟糕的是,因为我们将来自Rev-parse的任何非错误响应视为非裸存储库,所以我们会错误地设置对象的WorkingCopy,即使在裸存储库中也是如此。

情况更糟
由于8959555setup_git_directory():为顶级目录添加所有者检查,2022-03-02,Git v2.36.0-rc2--合并(setup_git_directory():为顶级目录添加所有者检查,2022-03-02),这是积极的错误(和危险)。
Perl代码没有实现相同的所有权检查。
更糟糕的是,在“找到”裸存储库之后,它会在环境中设置GIT_DIR,这会告诉任何后续的Git命令,我们已经确认目录正常,并信任我们。
即,它在使用Git.pm的存储库发现代码时重新打开8959555插入的漏洞。

我们可以通过仅依靠Rev-parse来告诉我们何时不在存储库中来修复此漏洞。
此外,我们将要求它的--is-bare-repository函数告诉我们是否裸露,并依赖它。

有一种简单、老式的方法可以将用户凭据存储在HTTPS URL中:

https://user:password@github.com/...

您可以使用git remote set-url <remote-repo> <URL>更改URL

这种方法的明显缺点是您必须以纯文本形式存储密码。您仍然可以输入用户名(https://user@github.com/...),这至少可以为您节省一半的麻烦。

您可能更喜欢切换到SSH或使用GitHub客户端软件。

我从git凭据(7)手册页面得到了答案。就我的情况而言,我的Windows安装中没有凭据缓存;我使用凭据存储。

在我使用凭据存储后,用户名/密码存储在[user文件夹]/. git-凭据文件中。要删除用户名/密码,只需删除文件的内容。

您可以使用Git凭据管理器(GCM)插件。它目前由GitHub维护。好处是它将密码保存在Windows凭据存储中,而不是纯文本。

项目发布页面上有一个安装程序。这也将安装git for windows的正式版本,内置凭据管理器。它允许双重验证用于GitHub(和其他服务器)。并有一个用于初始登录的图形界面。

对于Cygwin用户(或已经使用官方Git for Windows的用户),您可能更喜欢手动安装。从发布页面下载zip包。解压缩包,然后运行install.cmd文件。这将安装到您的~/bin文件夹中。(确保您的~/bin目录在您的PATH中。)然后使用以下命令配置它:

git config --global credential.helper manager

然后,Git将在对任何服务器进行身份验证时运行git-credential-manager.exe

应该使用身份验证令牌而不是帐户密码。转到GitHub设置/应用程序,然后创建个人访问令牌。可以像使用密码一样使用令牌。

令牌旨在允许用户不使用帐户密码进行项目工作。仅在执行管理工作时使用密码,例如创建新令牌或撤销旧令牌。


可以使用特定于项目的部署密钥来授予对单个项目存储库的访问权限,而不是授予用户对GitHub帐户的完整访问权限的令牌或密码。当您仍然可以使用正常凭据访问其他Git帐户或项目时,可以将Git项目配置为在以下步骤中使用此不同的密钥:

  1. 编写一个SSH配置文件,其中包含部署键的HostIdentityFile,可能是UserKnownHostsFile,也可能是User(尽管我认为您不需要它)。
  2. 编写一个实际上是ssh -F /path/to/your/config $*的SSH包装器外壳脚本
  3. 在普通Git命令前添加GIT_SSH=/path/to/your/wrapper。这里的git remote(起源)必须使用git@github.com:user/project.git格式。

作曲家留档提到,您可以阻止它使用GitHub API,因此它的行为类似于git clone

如果您在GitHub存储库上将no-api键设置为true,它将像使用任何其他Git存储库一样克隆存储库,而不是使用GitHub API。但与直接使用git驱动程序不同,作曲家仍将尝试使用GitHub的zip文件。

所以这一节看起来像这样:

"repositories": [{"type": "vcs","no-api": true,"url": "https://github.com/your/repo"}],

请记住,API的存在是有原因的。因此,这应该是增加github.com.负载的最后手段

只需将登录凭据作为URL的一部分:

git remote rm origingit remote add origin https://username:mypassword@github.com/path/to/repo.git

注意:我不推荐这种方法,但如果你很匆忙,没有其他方法,你可以使用这种方法。

为了安全起见,最好使用凭据,但您可以使用缓存将其保留一段时间:

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

您的证书将被保存3600秒。

如果你像我一样使用双重验证,情况会有点不同。因为我在其他地方没有找到好的答案,我就贴一个,这样也许我以后可以找到它。

如果你使用双重验证,那么指定用户名/密码甚至都不起作用——你会被拒绝访问。但是你可以使用应用程序访问令牌并使用Git的凭据助手为你缓存它。以下是相关链接:

我不记得我在哪里看到过这个,但是当你被要求输入你的用户名时-这就是你粘贴应用程序访问令牌的地方。然后将密码留空。它在我的Mac上工作。

使用凭据存储。

对于osxLinux使用Git内置的凭据存储上的Git 2.11+:

git config --global credential.helper libsecret

对于windows上的msysgit 1.7.9+:

git config --global credential.helper wincred

对于OS X上的Git 1.7.9+使用:

git config --global credential.helper osxkeychain

OAuth

您可以创建自己的个人API令牌OAuth)并以与使用普通凭据相同的方式使用它(在:/settings/tokens)。例如:

git remote add fork https://4UTHT0KEN@github.com/foo/bargit push fork

.netrc

另一种方法是在~/.netrc(Windows上为_netrc)中配置您的用户/密码,例如:

machine github.comlogin USERNAMEpassword PASSWORD

对于HTTPS,添加额外的行:

protocol https

一个凭证助手

在使用HTTPS时,您可以使用一个凭证助手告诉Git在每次与GitHub对话时记住您的GitHub用户名和密码。

  • Mac:git config --global credential.helper osxkeychainosxkeychain helper是必需的),
  • Windows:git config --global credential.helper wincred
  • Linux和其他:git config --global credential.helper cache

相关:

这对我来说很有效我正在使用Windows 10

git config --global credential.helper wincred

您还可以编辑bashrc文件并在其中添加脚本。

这将在您启动Git时询问您的密码一次,然后记住它,直到您注销。

SSH_ENV=$HOME/.ssh/environment  # Start the ssh-agentfunction start_agent {    echo "Initializing new SSH agent..."
    # Spawn ssh-agent    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"    echo succeeded    chmod 600 "${SSH_ENV}"    . "${SSH_ENV}" > /dev/null    /usr/bin/ssh-add}  if [ -f "${SSH_ENV}" ]; then     . "${SSH_ENV}" > /dev/null   ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {      start_agent;  }else    start_agent;fi

你可以用

git config credential.helper store

当您下次使用拉或推输入密码时,它将以纯文本形式存储在文件. git-凭据中(有点不安全,但只需将其放入受保护的文件夹即可)。

就这样,如本页所述:

git-credential-store

克隆存储库repo后,您可以编辑repo/.git/config并添加一些配置,如下所示:

[user]name = you_namepassword = you_password[credential]helper = store

然后你就不会再被要求usernamepassword了。

我知道这不是一个安全的解决方案,但有时你只需要一个简单的解决方案-无需安装任何其他东西。由于helper=存储对我不起作用,我创建了一个虚拟助手:

创建一个脚本并将其放入您的用户bin文件夹中,这里名为信用卡,此脚本将提供您的用户名和密码:

#!/bin/bashwhile read linedoecho "$line"done < "/dev/stdin"echo username=mahuserecho password=MahSecret12345

使其可执行:

chmod u+x /home/mahuser/bin/credfake

然后在git中配置它:

git config --global credential.helper /home/mahuser/bin/credfake

(或仅在一个存储库中使用它而不使用--global)

和-voilá-git将使用此user+密码。

通常你有一个远程URL,就像这样,

git remote -v
origin    https://gitlab.com/username/Repo.git (fetch)origin    https://gitlab.com/username/Repo.git (push)

如果您想在使用git push时跳过用户名和密码,请尝试以下操作:

 git remote set-url origin https://username:password@gitlab.com/username/Repo.git

我刚刚将相同的URL(包含用户详细信息,包括密码)添加到源。

注:如果用户名是电子邮件ID,则不起作用。

git remote -v
origin    https://username:password@gitlab.com/username/Repo.git (fetch)origin    https://username:password@gitlab.com/username/Repo.git (push)

如果您使用osxkeychain并且令牌过期并想要更新它,请按照以下步骤操作:

在终端中运行,然后按回车键两次。

git credential-osxkeychain erasehost=github.comprotocol=https

现在应该提示您输入用户名/密码。然而,有时这似乎不需要,您必须不断重新输入。

如果是这样,重启你的电脑。现在,下次您运行git命令并输入您的用户名/密码时,它将被保存。

我在MacOS上也遇到了这个问题,以下命令对我有效:

rm -rf  ~/.git-credentials

这是一种真正删除所有git凭据的强制方法。下次我使用push命令时,瞧:提示我输入用户名和密码(或令牌)。

从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秘密。

化妆品配置:由于我总是在上面的提示符下选择“网络浏览器”,我设置了gitHubAuthModes首选项来跳过选择。GCM的最新版本包括一个GUI,它为认证流程添加了额外的点击,我解除了那个

git config --global credential.gitHubAuthModes browsergit config --global credential.guiPrompt false

在Ubuntu上使用Git Credential Manager(GCM)在本地缓存凭据,在Ubuntu 20.04和18.04上进行了测试,但应该适用于其他Linux发行版。

  1. 设置git凭据管理器:
curl -LO https://raw.githubusercontent.com/GitCredentialManager/git-credential-manager/main/src/linux/Packaging.Linux/install-from-source.shsh ./install-from-source.shgit-credential-manager-core configuregit config --global credential.credentialStore cachegit config --global credential.cacheoptions "--timeout 72000"sudo rm -rf git-credential-manager/sudo rm install-from-source.sh
  1. 转到存储库并运行git fetch
  2. 选择Device code
  3. 访问链接并输入输出中提供的代码

双因素身份验证改变了用户对网站进行身份验证的方式,但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