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

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


自Git 1.7.9(2012年发布)以来,Git中有一种巧妙的机制,可以避免一直为HTTP/HTTPS输入密码,称为凭据助手。

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

git config --global credential.helper cache

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

# Cache for 1 hour
git config --global credential.helper "cache --timeout=3600"

# Cache for 1 day
git config --global credential.helper "cache --timeout=86400"

# Cache for 1 week
git config --global credential.helper "cache --timeout=604800"

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

GitHub的帮助还建议,如果您使用Mac OS X并使用Homebrew安装Git,您可以使用本机Mac OS X密钥库:

git config --global credential.helper osxkeychain

对于Windows,有一个名为GitCredentialManagerforWindows或wincred的助手。

git config --global credential.helper wincred # obsolete

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

git config --global credential.helper manager

对于Linux,您将使用(在2011年)gnomekeyring(或其他keyring实现,如KWallet)。

如今(2020年),这将是(在Linux上)

Fedora公司

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

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

如果你不想像Mark所说的那样以明文形式存储密码,你可以使用不同的GitHub URL进行抓取,而不是推送。在配置文件中的[远程“原点”]下:

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

当您推送时,它仍然会要求输入密码,但当您获取时,它不会要求输入密码。


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

git config credential.helper store

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

如果您希望Git恢复到每次需要时都向您请求凭据连接到远程存储库,可以运行以下命令:

git config --unset credential.helper

要将密码存储在%HOME%目录(而不是项目目录)中的.git凭据中,请使用--global标志

git config --global credential.helper store

我并没有立即意识到我需要先下载助手!我在Atlassian的永久认证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 ~/.netrc
machine github.com login lot105 password howsyafather

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


您可以使用凭据助手。

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

其中x是秒数。


太长,读不下去了在Git 1.8.3+中使用加密的netrc文件。

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

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

解决方案:使用GPG(GNU隐私保护)加密该文件,并使Git在每次需要密码时对其进行解密(用于推/拉/获取/克隆操作)。


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

参见Luis Marsano(``)的承诺786ef50,承诺f07eeed(2018年5月12日)。(由Junio C Hamano(吉斯特)于2018年5月30日在承诺017b7c5中合并)

git凭据netrc:接受gpg选项

git凭证netrc被硬编码为使用“gpg”解密,而不管gpg.program选项。在Debian这样的发行版上,这是一个问题,它将现代GnuPG称为其他东西,如“gpg2”


Windows的分步说明

使用Windows:

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

安装gpg4Win Lite,即最小的gnupg命令行界面(使用最新的gpg4Win-vanilla-2.X.Y-betaZZ.exe),并使用GPG安装目录完成PATH:设置PATH=%PATH%:C:\PATH\to\gpg将C:\path\复制到\gpg\gpg2.exe C:\path\到\gpg \gpg.exe

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

创建或导入GPG密钥,并信任它:gpgp—导入aKey#或gpg—生成密钥

(请确保为该密钥添加密码短语。)

相信那把钥匙在%PATH%中的目录中安装凭据助手脚本:cd c:\a\folder\in\your\pathcurl-o c:\prgs\bin\git凭据netrchttps://raw.githubusercontent.com/git/git/master/contrib/credential/netrc/git-credential-netrc.perl

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

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

以明文形式生成一个_netrc文件计算机a_server.corp.com登录a_ologin密码a_password协议https机器a_server2.corp.com登录a\.login2密码a_password2协议https

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

加密该文件:gpg-e-r a收件人名称

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

使用加密文件:git config--本地凭据。helper“netrc-f C:/path/to/_netrc.gpg-v”

(请注意,'/':C:\path\to…根本不起作用。)(您可以首先使用-v-d来查看发生了什么。)

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

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


在Git 2.26(2020年第1季度)中,用于使用.netrc的示例凭据助手已经更新为开箱即用。请参阅补丁/讨论。

参见Denton Liu(Denton-L)提交的6579d93、1c78c78(2019年12月20日)。(由Junio C Hamano(吉斯特)于2019年12月25日合并)

contrib/credential/netrc:使PERL_PATH可配置签字人:Denton Liu

git凭证netrc中Perl解释器的shebang路径是硬编码的。然而,一些用户可能将其放置在不同的位置,因此,必须手动编辑脚本。在脚本中添加一个.perl前缀,将其表示为模板,并忽略生成的版本。增强Makefile,使其从git-credential-netrc.perl生成git凭据netrc,就像其他perl脚本一样。Makefile食谱被无耻地从contrib/mw窃取到git/Makefile。

And:

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

参见Denton Liu(Denton-L)提交的6579d93、1c78c78(2019年12月20日)。(由Junio C Hamano(吉斯特)于2019年12月25日合并)

contrib/credential/netrc:在repo之外工作签字人:Denton Liu

目前,git凭证netrc不能在git存储库之外工作。它失败,出现以下错误:致命:不是git存储库:。位于/usr/share/perl5/Git.pm第214行。然而,没有真正的理由需要在存储库中。凭证助手也应该能够在存储库外正常工作。调用非自身版本的config(),这样git凭据netrc就不再需要在存储库中运行。

Jeff King(佩夫)补充道:

我假设你使用的是gpg加密的netrc(如果没有,你可能应该仅使用凭证存储)。对于“只读”密码访问,我发现pass和config的组合有点更好:[凭证“https://github.com"]用户名=peffhelper=“!f(){test$1=获取&&echo密码=`pass github/oauth`;};f”


2013年git.pm中的“致命:不是git存储库”错误消息……已用git 2.39修复(2022年第4季度):

见Jeff King(peff)的承诺20da61f(2022年10月22日)。参见迈克尔·麦克利蒙(mmcclimon)的承诺77a1310(2022年10月16日)。(由Junio C Hamano(吉斯特)于2022年10月28日提交330135a合并)

Git.pm:信任rev解析以查找裸存储库签字人:Jeff King

初始化存储库对象时,我们运行“gitrevparse--gitdir”(man),让C版本的git找到正确的目录。但奇怪的是,如果失败了,我们不会自动说“不是git存储库”。相反,我们做自己的纯Perl检查,看看是否在一个空的存储库中。这没有什么意义,因为revparse将同时报告裸目录和非裸目录。这个逻辑来自d5c7721(“Git.pm:为工作副本内的子目录添加支持”,2006-06-24,Git v1.4.3-rc1-merge),但我看不出为什么我们不能只依赖rev解析。更糟糕的是,因为我们将revparse的任何非错误响应视为非裸存储库,所以即使在裸存储库中,我们也会错误地设置对象的WorkingCopy。但情况变得更糟了。由于8959555(setup_git_directory():为顶级目录添加所有者检查,2022-03-02,git v2.36.0-rc2--merge)(setup_git _directory):为顶层目录添加所有者检测,2022-02-02),这是非常错误的(而且很危险)。Perl代码没有实现相同的所有权检查。更糟糕的是,在“找到”裸存储库后,它会在环境中设置GIT_DIR,这将告诉任何后续的GIT命令,我们已经确认该目录是正常的,并相信我们。也就是说,当使用Git.pm的存储库发现代码时,它重新打开了8959555插入的漏洞。当我们不在存储库中时,我们只需依靠rev parse来告诉我们,就可以修复这个漏洞。此外,我们将询问它的--is裸存储库函数来告诉我们是否裸,并依赖它。


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

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

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

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

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


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

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


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

项目的发布页面上有一个安装程序。这还将安装内置凭据管理器的Windows Git官方版本。它允许对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项目配置为使用此不同的密钥:

编写一个SSH配置文件,其中包含Host、部署密钥的IdentityFile、UserKnownHostsFile和User(尽管我认为您不需要)。编写一个SSH包装器shell脚本,该脚本实际上是SSH-F/path/to/your/config$*将GIT_SSH=/path/to/your/wapper前置到普通GIT命令前面。这里git remote(原点)必须使用git@github.com:user/project.git格式。


composer文档提到,您可以阻止它使用GitHub API,这样它的行为就像gitclone:

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

因此,该部分将如下所示:

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

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


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

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

注意:我不建议使用这种方法,但如果你很匆忙,而其他方法都不奏效,你可以使用这种方法。


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

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

您的凭据将保存3600秒。


如果你像我一样使用双因素身份验证,情况就有点不同了。因为我在其他地方找不到好答案,所以我会在这里留下一个,这样也许我可以稍后找到它。

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

设置命令行以使用2-factor auth(搜索标题为“它如何为命令行Git工作?”的部分)凭据缓存

我不记得我是在哪里看到的,但当你被要求输入用户名时,你就会在那里粘贴应用程序访问令牌。然后将密码留空。它在我的Mac上运行。


使用凭据存储。

对于OS X和Linux上的Git 2.11+,请使用Git内置的凭据存储:

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/bar
git push fork

.netrc文件

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

machine github.com
login USERNAME
password PASSWORD

对于HTTPS,添加额外的行:

protocol https

凭据助手

要在使用HTTPS时在Git中缓存GitHub密码,您可以使用凭据助手告诉Git每次与GitHub对话时记住您的GitHub用户名和密码。

Mac:git config--全局凭证.helper osxkeychain(需要osxkeychain助手),Windows:git-config--全局凭据。helper wincredLinux和其他:git-config--全局凭证.helper缓存


相关:

如何在终端密钥链中存储Linux上的GitHub https密码?如何确保Git不会向我索要GitHub用户名和密码?配置Git客户端,如GitHub for Windows,以不要求身份验证将本地回购推送到具有双重身份验证的GitHub回购


这对我有用我使用的是Windows 10

git config --global credential.helper wincred

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

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

SSH_ENV=$HOME/.ssh/environment
  
# Start the ssh-agent
function 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

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

如本页所述:

git凭证存储


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

[user]
    name = you_name
    password = you_password
[credential]
    helper = store

这样就不会再次要求您输入用户名和密码。


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

创建一个脚本并将其放在用户bin文件夹中,此处名为credfake,该脚本将提供您的用户名和密码:

#!/bin/bash
while read line
do
  echo "$line"
done < "/dev/stdin"
echo username=mahuser
echo password=MahSecret12345

使其可执行:

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

然后在git中配置它:

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

(或不使用--仅限一个回购协议的全局)

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


通常你有一个远程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

我刚刚向origin添加了相同的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,并且有一个令牌过期,并希望更新它,请执行以下步骤:

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

git credential-osxkeychain erase
 host=github.com
 protocol=https

现在应该会提示您输入用户名/密码。然而,有时这似乎并不“需要”,你必须继续重新进入。

如果是,请重新启动计算机。现在,下次运行git命令并输入用户名/密码时,它将被保存。


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

rm -rf  ~/.git-credentials 

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


截至2021,HTTPS远程有一个安全、用户友好的跨平台解决方案。不再输入密码!不再有SSH密钥!不再有个人访问令牌!

安装GitHub开发的Git凭据管理器(下载)。它支持对GitHub、BitBucket、Azure和GitLab的无密码OAuth认证。这意味着您可以在GitHub和其他平台上启用双因素身份验证,大大提高了帐户的安全性。

推送时,您可以选择身份验证方法:

> git push
Select an authentication method for 'https://github.com/':
  1. Web browser (default)
  2. Device code
  3. Personal access token
option (enter for default): 1
info: please complete authentication in your browser...

在Linux上,需要一点点设置。以下内容将凭据缓存在内存中20小时,因此您每天最多只能进行一次身份验证。

git-credential-manager-core configure
git config --global credential.credentialStore cache
git config --global credential.cacheoptions=--timeout 72000

熟悉gnomekeyring或KWallet的高级用户可能更喜欢将凭证存储更改为libsecret。

外观配置:由于我总是在上面的提示下选择“web浏览器”,所以我设置了gitHubAuthModes首选项来跳过选择。GCM的最新版本包括一个GUI,它为授权流添加了额外的点击,我禁用了它。

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

在Ubuntu上使用GitCredentialManager(GCM)在本地缓存凭据,在Ubuntu 20.04和18.04上进行了测试,但应该可以在其他Linux发行版上运行。

设置git凭据管理器:

curl -LO https://raw.githubusercontent.com/GitCredentialManager/git-credential-manager/main/src/linux/Packaging.Linux/install-from-source.sh
sh ./install-from-source.sh
git-credential-manager-core configure
git config --global credential.credentialStore cache
git config --global credential.cacheoptions "--timeout 72000"
sudo rm -rf git-credential-manager/
sudo rm install-from-source.sh

转到回购并运行git fetch选择设备代码访问链接并输入输出中提供的代码


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

介绍git credential oauth:一个git凭据助手,可以使用oauth安全认证GitHub、GitLab、BitBucket和其他伪造文件。

没有更多密码!不再有个人访问令牌!不再有SSH密钥!第一次推送时,助手将打开浏览器窗口进行身份验证。缓存超时内的后续推送不需要交互。

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

配置方式:

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