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

时间:2011-03-17 17:47:44

标签: git authentication github git-push git-config

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

有没有办法缓存凭据,而不是每次git push

进行身份验证

24 个答案:

答案 0 :(得分:2280)

使用Git 1.7.9及更高版本

自Git 1.7.9(2012年1月下旬发布)以来,Git中有一个简洁的机制,可以避免一直为HTTP / HTTPS键入密码,称为credential helpers。 (感谢dazonic在下面的评论中指出了这个新功能。)

使用Git 1.7.9或更高版本,您只需使用以下凭证助手之一:

git config --global credential.helper cache

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

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

GitHub help page for Linux中建议使用该示例。)如果需要,您还可以永久存储您的凭据,请参阅下面的其他答案。

GitHub的帮助also suggests如果您使用的是Mac OS X并使用Homebrew安装Git,则可以使用原生Mac OS X密钥库:

git config --global credential.helper osxkeychain

对于Windows,有一个名为Git Credential Manager for Windowswincred in msysgit的帮助程序。

git config --global credential.helper wincred # obsolete

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

git config --global credential.helper manager

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

使用1.7.9之前的Git版本

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

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

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

您可以使用

git config remote.origin.url https://you:password@github.com/you/example.git 遥控器设置新网址
https

确保使用.git,并且您应该知道,如果您这样做,您的GitHub密码将以纯文本形式存储在~/.netrc目录中,这显然是不受欢迎的。

使用任何Git版本(好吧,因为版本0.99)

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

<hostname>

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

_netrc

请注意,在Windows上,此文件应调用{{1}},您可能需要定义%HOME%环境变量 - 有关详细信息,请参阅:

答案 1 :(得分:688)

您还可以让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

答案 2 :(得分:94)

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

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

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

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


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

commit 786ef50commit f07eeedLuis Marsano (``)(2018年5月12日) (由Junio C Hamano -- gitster --合并于commit 017b7c5,2018年5月30日)

  

.netrc:接受git-credential-netrc选项

     

gpg被硬编码为“git-credential-netrc”解密,无论如何   gpg.program选项。
  这是像Debian这样的分布上的问题,它将现代GnuPG称为其他内容,例如“gpg


Windows的分步说明

使用Windows:

(Git在其发行版中有gpg2,但使用完整的GPG安装包含gpg.exe,它会记住与您的GPG密钥相关联的密码。)

(注意'set PATH=%PATH%:C:\path\to\gpg copy C:\path\to\gpg\gpg2.exe C:\path\to\gpg\gpg.exe '命令:Git需要一个Bash脚本来执行命令'copy'。由于gpg附带gpg4win-vanilla-2,你需要复制它。)

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

    gpg2.exe

(确保在该密钥上加上密码。)

  • Trust that key

  • 将凭据帮助程序脚本安装在gpgp --import aKey # or gpg --gen-key

    中的目录中
    %PATH%

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

  • 以明文形式创建_netrc文件

    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
    

(不要忘记“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

(您现在可以删除 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...查看发生了什么。)

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

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

答案 3 :(得分:40)

有一种简单,老式的方法可以在HTTPS网址中存储用户凭据:

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

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

更改网址

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

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

答案 4 :(得分:38)

使用凭据存储。

对于 OS X Linux 上的Git 2.11+,use Git's built in credential store

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

答案 5 :(得分:36)

你可以使用

git config credential.helper store

下次使用pull或push输入密码时,将存储密码 .git-credentials为纯文本(有点不安全,但只是把它放到受保护的文件夹中)

就是这个,如本页所述:

https://git-scm.com/docs/git-credential-store

答案 6 :(得分:22)

对我来说,我不需要首先下载帮助器!我在Atlassian's Permanently authenticating with Git repositories找到了credential.helper下载。

引用:

如果要在OS X上使用带有凭据缓存的Git,请执行以下步骤:

下载二进制git-credential-osxkeychain。

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

chmod a+x git-credential-osxkeychain

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

运行以下命令:

git config --global credential.helper osxkeychain

答案 7 :(得分:22)

只需在网址中包含登录凭据:

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

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

答案 8 :(得分:19)

在GNU / Linux设置上,〜/ .netrc也能很好地运行:

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

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

答案 9 :(得分:16)

对于Windows,您可以使用Git Credential Manager(GCM)插件。它目前由Microsoft维护。好处是它将密码保存在Windows Credential Store中,而不是纯文本。

项目的releases page上有一个安装程序。这也将安装Git for Windows的正式版本,内置凭据管理器。它允许two-factor authentication用于GitHub(和其他服务器)。并且具有用于初始登录的图形界面。

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

git config --global credential.helper manager

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

答案 10 :(得分:12)

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

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

当你推送时它仍会要求输入密码,但是至少在开源项目时,它不会被提取。

答案 11 :(得分:10)

的OAuth

您可以创建自己的personal API tokenOAuth)并使用与使用普通凭据相同的方式(位于:/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时,cache your GitHub password in Git可以使用凭证助手告诉Git每次与GitHub通话时都记住您的GitHub用户名和密码。

  • Mac:git config --global credential.helper osxkeychain(需要osxkeychain helper),
  • Windows:git config --global credential.helper wincred
  • Linux和其他:git config --global credential.helper cache

相关:

答案 12 :(得分:9)

您可以使用凭证助手。

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

其中x是秒数。

答案 13 :(得分:8)

克隆repo后,您可以修改repo/.git/config并添加如下配置:

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

然后,系统不再要求您usernamepassword

答案 14 :(得分:7)

我知道这不是一个安全的解决方案,但有时您只需要一个简单的解决方案 - 无需安装任何其他内容。由于 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

(或仅使用--global用于一个回购)

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

答案 15 :(得分:6)

应使用身份验证令牌代替帐户密码。转到GitHub设置/应用程序,然后创建个人访问令牌。令牌的使用方式与使用密码的方式相同。

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


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

  1. 编写一个SSH配置文件,其中包含部署密钥的HostIdentityFile,可能是UserKnownHostsFile,也许是User(尽管我认为你不喜欢)需要它。)。
  2. 编写一个几乎为ssh -F /path/to/your/config $*
  3. 的SSH包装器shell脚本
  4. 在正常的Git命令前面添加GIT_SSH=/path/to/your/wrapper。此处git remote(来源)必须使用git@github.com:user/project.git格式。

答案 16 :(得分:6)

最好使用凭据进行安全性,但您可以使用缓存保留一段时间:

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

您的凭据将保存3600秒。

答案 17 :(得分:5)

如果您像我一样使用two-factor authentication,情况会有所不同。由于我在其他地方找不到好的答案,我会在这里贴一个,以便我以后可以找到它。

如果您使用双因素身份验证,则指定用户名/密码甚至无法正常工作 - 您将获得拒绝访问权限。但是您可以使用应用程序访问令牌并使用Gi​​t的凭据帮助程序为您缓存该令牌。以下是相关链接:

我不记得我在哪里看到这个,但当你被问到你的用户名时 - 那就是你坚持申请访问令牌的地方。然后将密码留空。它适用于我的Mac。

答案 18 :(得分:4)

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

我刚刚在原点添加了相同的网址(包含用户详细信息,包括密码)。

注意:如果用户名是电子邮件ID,则无效。

git remote -v

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

答案 19 :(得分:3)

我从 gitcredentials(7) Manual Page 得到了答案。就我而言,我的Windows安装中没有凭证缓存;我使用凭证存储。

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

答案 20 :(得分:3)

这适用于我使用Windows 10

git config --global credential.helper wincred

答案 21 :(得分:2)

您可以阻止它使用GitHub API的作曲家文档mentions,使其像git clone一样:

  

如果在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上增加的负载,这应该是最后的手段。

答案 22 :(得分:2)

您还可以编辑 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

答案 23 :(得分:0)

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

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

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

现在,系统将提示您输入用户名/密码。但是有时似乎这并不“费力”,您必须继续重新输入。

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