协慌网

登录 贡献 社区

在 GitHub 上使用 https:// 时有没有办法跳过密码输入?

我最近切换到将我的存储库同步到 GitHub 上的 https://(由于防火墙问题),并且每次都要求输入密码。以前我有一个SSH证书,这就足够了。在我的情况下有没有办法绕过密码(使用 http / https)?

答案

使用 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,有一个名为Git Credential Manager for Windows的助手或者msysgit 中的 wincred

git config --global credential.helper wincred # obsolete

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

git config --global credential.helper manager

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

随着 1.7.9 之前的 Git 版本

对于 1.7.9 之前的 Git 版本,这个更安全的选项不可用,您需要更改origin远程用来以这种方式包含密码的 URL:

https://you:[email protected]/you/example.git

... 换句话说:password用户名之后的:password@之前的:password

您可以使用以下命令为origin远程设置新 URL:

git config remote.origin.url https://you:[email protected]/you/example.git

确保你使用https ,你应该知道,如果你这样做,你的 GitHub 密码将以纯文本形式存储在.git目录中,这显然是不可取的。

任何 Git 版本(好,从版本 0.99)

另一种方法是将您的用户名和密码放在~/.netrc文件中,但是,如同将密码保存在远程 URL 中一样,这意味着您的密码将以纯文本形式存储在磁盘上,因此不太安全,不建议。但是,如果您想采用这种方法,请将以下行添加到~/.netrc

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

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

chmod 600 ~/.netrc

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

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

git config credential.helper store

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

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

git config --unset credential.helper

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

git config --global credential.helper store

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

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

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

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


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

请参阅提交 786ef50提交 f07eeed (2018 年 5 月 12 日)由Luis Marsano(``)
(由Junio C gitster合并- gitster -提交 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-2附带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 / 登录 / 密码,并将其存储在磁盘上加密。
我发现它比 “缓存” 助手更方便 “,你需要记住并为每个远程服务键入(每个会话一次)一个不同的密码,以便将所述密码缓存在内存中。