关于git:有没有办法缓存GitHub凭据以推送提交?

Is there a way to cache GitHub credentials for pushing commits?

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

是否有一种方法来缓存凭证,而不是每次git push时都进行身份验证?


使用Git 1.7.9及更高版本

自Git1.7.9(2012年1月底发布)以来,Git中有一个整洁的机制,可以避免在HTTP/HTTPS(称为凭据帮助器)中一直输入密码。(感谢Dazoic在下面的评论中指出了这一新功能。)

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

1
git config --global credential.helper cache

…它告诉Git将密码缓存在内存中(默认情况下)15分钟。您可以设置更长的超时时间:

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

(该示例在Linux的Github帮助页面中给出了建议。)如果需要,还可以永久存储凭据,请参阅下面的其他答案。

Github的帮助还建议,如果您使用Mac OS X并使用自制来安装Git,则可以使用本机Mac OS X密钥库:

1
git config --global credential.helper osxkeychain

对于Windows,有一个助手称为Git Credential Manager for Windows或Wincred in MSysGit。

1
git config --global credential.helper wincred # obsolete

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

1
git config --global credential.helper manager

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

1.7.9之前的Git版本

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

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

…换言之,在用户名后面和EDOCX1前面加上:password

您可以通过以下方式为您的origin远程服务器设置一个新的URL:

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

确保使用https,并且应注意,如果这样做,您的github密码将以明文形式存储在.git目录中,这显然是不可取的。

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

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

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

…用服务器的主机名替换,用用户名和密码替换。还要记住对该文件设置限制性文件系统权限:

1
chmod 600 ~/.netrc

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

  • Git-如何在Windows上使用.netrc文件来保存用户和密码


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

1
git config credential.helper store

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

如果你想让Git在每次需要的时候都继续向你索取证书连接到远程存储库,可以运行以下命令:

1
git config --unset credential.helper

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

1
git config --global credential.helper store


使用源文件加密;在一次netrc Git +。

节电密码一个HTTPS URL的Git储存库可能是一个~/.netrc(UNIX)或%HOME%/_netrc(注《_)在Windows中。

我:那是密码文件存储在纯文本。

解决方案:一个加密文件GPG(GNU Privacy Guard),它可以让Git每次它需要一个密码(push/ / / clonepullfetch操作)。

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

786ef50 commit(提交f07eeed湖,2018年12月)由路易斯marsano(``)。(出现在C - gitster水道所提交017b7c5 - 30日,2018年)

git-credential-netrc: accept gpg option

git-credential-netrc was hardcoded to decrypt with 'gpg' regardless of
the gpg.program option.
This is a problem on distributions like Debian that call modern GnuPG something else, like 'gpg2'

一步一步的指示Windows

一个窗口:

(gpg.exeGit有一在其分布,但使用全安装包括一gpg-agent.exeGPG,希望,乐观,意志力你的GPG密钥相关的密码。)

  • gpg4Win Lite最小安装程序,命令行界面(把最新的和完整的gpg4win-vanilla-2.X.Y-betaZZ.exe),在安装目录的路径:GPG

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

(注:"copyGit命令的bash脚本需要一个执行命令的gpg’。因为你是一个gpg4win-vanilla-2gpg2.exe,需要重复它。)

  • 创建或导入a GPG密钥,和信托它:

    1
    2
    3
    gpgp --import aKey
    # or
    gpg --gen-key

(确保把密码密钥(认为)。

  • 信任是关键

  • 安装证书在您的脚本目录中生成一%PATH%

    1
    2
    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清晰

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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)。

  • 加密的文件是:

    1
    gpg -e -r a_recipient _netrc

(你现在可以删除只读文件的_netrc,保鲜的一_netrc.gpg加密)。

  • 这是使用加密的文件:

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

(注:"/C:\path\to...不会在所有的工作。)(你可以使用在第一个-v -d看到什么事。)

从现在,任何Git命令使用HTTP(S)的URL需要认证,是想_netrc.gpg文件解密和使用密码登录到服务器美联社/你的接触。第一时间,想问你的GPG密码你的GPG密钥,解密文件。其他时报、GPG代理自动呼叫通过推出第一个GPG密码将提供给你。

这样,你可以发现网址登录/密码/乐观,意志力,在一个文件,它存储在您的磁盘和一个加密的。
我找到它更方便比a"缓存"助手",你需要记住和型(一次通过一个不同的密码为每个会话的远程服务中心,说的内存缓存中的密码。


有简单的,老式的方式来存储用户凭据在HTTPS URL:

1
https://user:[email protected]/...

你可以改变一个git remote set-url URL

上的方法的缺点是,你在那一个位置存储在纯文本密码。你可以只输入用户名称(安静https://[email protected]/...)这将帮助至少节省你的约。

你会喜欢到切换到SSH或使用GitHub的客户端软件。


使用凭证存储。

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

1
git config --global credential.helper libsecret

对于Windows上的msysgit 1.7.9+:

1
git config --global credential.helper wincred

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

1
git config --global credential.helper osxkeychain


你可以用

1
git config credential.helper store

下次用pull或push输入密码时,密码将存储在.git凭据为纯文本(有点不安全,但只将其放在受保护的文件夹中)

如本页所述:

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


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

1
2
git remote rm origin
git remote add origin https://username:[email protected]/path/to/repo.git

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


我并没有立刻意识到我需要先下载助手!我在Atlassian的Git存储库永久验证中找到了credential.helper下载。

报价:

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

下载二进制git凭证osxkeychain。

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

1
chmod a+x git-credential-osxkeychain

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

运行以下命令:

1
git config --global credential.helper osxkeychain

在GNU / Linux的安装,A / Netrc很好作品太:

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

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


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

项目的"发布"页面上有一个安装程序。这还将安装内置凭据管理器的官方版本的Git for Windows。它允许对GitHub(和其他服务器)进行双因素身份验证。并且有一个最初登录的图形界面。

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

1
git config --global credential.helper manager

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


如果你不想像马克所说的那样以纯文本形式存储你的密码,你可以使用一个与推送不同的Github URL来获取密码。在您的配置文件中,在[remote"origin"]下:

1
2
url = git://github.com/you/projectName.git
pushurl = [email protected]:you/projectName.git

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


奥瑙

您可以创建自己的个人API令牌(OAuth),并使用它,就像使用普通凭据一样(位于:/settings/tokens)。例如:

1
2
git remote add fork https://[email protected]/foo/bar
git push fork

江户十一〔一〕号

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

1
2
3
machine github.com
login USERNAME
password PASSWORD

对于https,添加额外的行:

1
protocol https

凭据帮助程序

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

  • mac:git config --global credential.helper osxkeychain(要求osxkeychain helper)
  • 窗口:git config --global credential.helper wincred
  • Linux及其他:git config --global credential.helper cache

相关:

  • 如何将Linux上的Github HTTPS密码存储在终端密钥链中?
  • 如何确保Git不要求我输入GitHub用户名和密码?
  • 配置Git客户机(如用于Windows的GitHub)以不请求身份验证
  • 将本地回购推送到具有双因素认证的Github回购

你可以使用证书的助手。

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

x是数秒。


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

1
2
3
4
5
[user]
    name = you_name
    password = you_password
[credential]
    helper = store

那么你就不会再被要求购买usernamepassword


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

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

1
2
3
4
5
6
7
#!/bin/bash
while read line
do
  echo"$line"
done <"/dev/stdin"
echo username=mahuser
echo password=MahSecret12345

使其可执行:

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

然后在Git中配置它:

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

(或者不使用它——仅用于一个回购的全局)

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


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

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

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

  • 编写一个ssh配置文件,其中包含部署密钥的HostIdentityFileUserKnownHostsFileUser(尽管我认为您不需要)。
  • 编写一个实际上是ssh -F /path/to/your/config $*的ssh包装shell脚本。
  • 在你正常的git命令前准备好GIT_SSH=/path/to/your/wrapper。这里,git remote格式(origin)必须使用[email protected]:user/project.git格式。

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

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

    您的凭据将保存3600秒。


    如果像我一样使用双因素身份验证,情况会有所不同。因为我在别处找不到一个好答案,所以我会在这里留一个,以便以后能找到它。

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

    • 将命令行设置为使用2因子身份验证(搜索标题为"如何使用命令行git?"的部分)
    • 凭据缓存

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


    通常你有一个类似这样的远程URL,

    1
    2
    3
    4
    git remote -v

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

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

    1
     git remote set-url origin https://username:[email protected]/username/Repo.git

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

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

    1
    2
    3
    4
    git remote -v

    origin    https://username:[email protected]/username/Repo.git (fetch)
    origin    https://username:[email protected]/username/Repo.git (push)


    我得到了我的答案从gitcredentials(7)手册页。我的案例,我没有安装在我的Windows凭据缓存;我使用的凭据商店。

    我使用的凭据商店后,用户名/密码是存储在用户的文件夹[ ]号文件.git -凭据。清除的用户名/密码,及时删除内容的文件。


    我用的是Windows 10

    1
    git config --global credential.helper wincred


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

    当您启动git时,这会要求您输入一次密码,然后记住它,直到您注销。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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

    composer文档提到您可以阻止它使用github API,因此它的作用类似于git clone

    If you set the no-api key to true on a GitHub repository it will clone the repository as it would with any other Git repository instead of using the GitHub API. But unlike using the git driver directly, composer will still attempt to use GitHub's zip files.

    所以这个部分应该是这样的:

    1
    2
    3
    4
    5
    6
    7
    "repositories": [
        {
           "type":"vcs",
           "no-api": true,
           "url":"https://github.com/your/repo"
        }
    ],

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