有没有一种方法可以缓存 GitHub 凭证来推送提交?

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

有没有一种方法可以缓存凭据,而不是每次git push都进行身份验证?

答案

使用 Git 1.7.9 及更高版本

自 Git 1.7.9(于 2012 年 1 月下旬发布)以来,Git 中提供了一种简洁的机制,可避免始终为 HTTP / HTTPS 键入密码(称为凭据帮助程序) 。 (感谢dazonic在下面的评论中指出此新功能。)

使用 Git 1.7.9 或更高版本,您可以仅使用以下凭据帮助程序之一:

git config --global credential.helper cache

... 告诉 Git 将密码保留在内存中的时间为 15 分钟(默认情况下)。您可以使用以下方法设置更长的超时时间:

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

(在LinuxGitHub 帮助页面中建议了该示例。)如果需要,您也可以永久存储凭据,请参见下面的其他答案。

GitHub 的帮助还建议 ,如果您使用的是 Mac OS X,并且使用Homebrew安装 Git,则可以将本机 Mac OS X 密钥库与以下命令配合使用:

git config --global credential.helper osxkeychain

对于 Windows, 在 msysgit 中有一个名为Windows 的 Git 凭据管理器wincred 的帮助程序

git config --global credential.helper wincred # obsolete

使用适用于 Windows 2.7.3 + 的 Git (2016 年 3 月):

git config --global credential.helper manager

对于 Linux,可以使用gnome-keyring (或其他密钥环实现,例如 KWallet)。

使用 1.7.9 之前的 Git 版本

在 1.7.9 之前的 Git 版本中,此更安全的选项不可用,您需要以以下方式更改origin远程使用的 URL 来包含密码:

https://you:password@github.com/you/example.git

... 换句话说,在用户名之后@之前使用:password

您可以使用以下方法为origin远程站点设置新的 URL:

git config remote.origin.url https://you:password@github.com/you/example.git

确保使用https ,并且应该注意,如果这样做,则 GitHub 密码将以纯文本.git存储在.git目录中,这显然是不可取的。

使用任何 Git 版本(从 0.99 版本开始)

一种替代方法是将用户名和密码放在~/.netrc文件中,尽管与将密码保留在远程 URL 中一样,这意味着您的密码将以纯文本格式存储在磁盘上,因此安全性较低,并且不建议。但是,如果要采用这种方法,请将以下行添加到~/.netrc

machine <hostname> login <username> password <password>

... 将<hostname>替换为服务器的主机名,并将<username><password>替换为您的用户名和密码。还请记住在该文件上设置限制性文件系统权限:

chmod 600 ~/.netrc

请注意,在 Windows 上,此文件应名为_netrc ,并且您可能需要定义%HOME%环境变量 - 有关更多详细信息,请参见:

您还可以使用以下命令让 Git 永久存储您的凭据:

git config credential.helper store

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

如果您希望 Git 每次需要连接到远程存储库时都继续要求您提供凭据,则可以运行以下命令:

git config --unset credential.helper

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

git config --global credential.helper store

TLDR;将加密的 netrc 文件与 Git 1.8.3 + 一起使用

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

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

解决方案 :使用GPG(GNU Privacy Guard)加密该文件,并使 Git 在每次需要密码时对其进行解密(用于push / pull / fetch / clone操作)。


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

参见Luis Marsano 的 commit 786ef50f07ee (2018 年 5 月 12 日) (``)
(由Junio C gitster - gitstercommit 017b7c5 中合并 ,2018 年 5 月 30 日)

git-credential-netrc :接受gpg选项

不管 gpg.program 选项如何, git-credential-netrc都使用 ' gpg ' 进行了硬编码解密。
这在像 Debian 这样的发行版上却存在问题,这些发行版将现代 GnuPG 称为 “ gpg2


Windows 的分步说明

使用 Windows:

(Git 的gpg.exe中有一个gpg.exe ,但是使用完整的 GPG 安装程序会包含一个gpg-agent.exe ,它将记住与 GPG 密钥关联的密码。)

  • 安装gpg4Win Lite和最小的 gnupg 命令行界面(使用最新的gpg4win-vanilla-2.XY-betaZZ.exe ),并使用 GPG 安装目录完成 PATH:

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

(请注意 ' copy '命令:Git 将需要一个 Bash 脚本来执行命令' gpg '。由于gpg4win-vanilla-2gpg2.exe一起gpg2.exe ,因此您需要对其进行复制。)

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

    gpgp --import aKey
    # or
    gpg --gen-key

(请确保在该密钥上输入密码。)

  • 相信那个钥匙

  • 将凭证帮助程序脚本安装在%PATH%内的目录中:

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

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

  • 用明文制作一个_netrc 文件

    machine a_server.corp.com
    login a_login
    password a_password
    protocol https
    
    machine a_server2.corp.com
    login a_login2
    password a_password2
    protocol 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 / 登录名 / 密码存储在一个文件中,并将其加密存储在磁盘上。
我发现它比 “缓存帮助器” 更方便,在 “缓存帮助器” 中,您需要记住并为每个远程服务键入(每个会话一次)不同的密码,以便将所述密码缓存在内存中。

使用凭证存储。

对于OS XLinux上的 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

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

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

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

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

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

你可以用

git config credential.helper store

下次使用 pull 或 push 方式输入密码时,该密码将以纯文本格式存储在. git-credentials 文件中(有点不安全,只是将其放入受保护的文件夹中)。

就是这样,如本页所述:

git-credential-store

对我来说不是立即显而易见的,我需要先下载该助手!我在Atlassian 的 Git 储存库永久验证中找到了 credential.helper 下载。

引用:

如果要在 OS X 上将 Git 与凭据缓存一起使用,请按照以下步骤操作:

下载二进制 git-credential-osxkeychain。

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

chmod a+x git-credential-osxkeychain

将其放在目录/usr/local/bin

运行以下命令:

git config --global credential.helper osxkeychain

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

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

注意:我不建议您使用此方法,但是如果您急于执行其他任何操作,则可以使用此方法。

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

$ cat ~/.netrc
machine github.com login lot105 password howsyafather

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

对于 Windows,您可以使用Git 凭据管理器 (GCM)插件。它目前由 Microsoft 维护。令人高兴的是,它会将密码保存在 Windows 凭据存储中,而不是纯文本格式。

在项目的发行页面上有一个安装程序。这还将安装带有内置凭据管理器的WindowsGit正式版。它允许对 GitHub(和其他服务器)进行两步验证 。并具有用于初始登录的图形界面。

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

git config --global credential.helper manager

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