2015

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

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

4

26 回答 26

2530

自 Git 1.7.9(2012 年发布)以来,Git 中有一个简洁的机制可以避免在 HTTP / HTTPS 中一直输入密码,称为凭证助手

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

git config --global credential.helper cache

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

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

它将缓存设置为 1 小时,或者:

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

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

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

git config --global credential.helper osxkeychain

对于 Windows,在 msysgit 中有一个名为Git Credential Manager for Windowswincred 的助手

git config --global credential.helper wincred # obsolete

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

git config --global credential.helper manager

对于 Linux,您将使用 (in 2011) gnome-keyring(或其他密钥环实现,例如 KWallet)。

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

软呢帽

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

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
于 2011-03-17T17:54:13.077 回答
751

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

git config credential.helper store

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

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

git config --unset credential.helper

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

git config --global credential.helper store
于 2012-09-03T01:14:39.387 回答
113

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

在 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 (``)的提交 786ef50提交 f07eeed(2018 年 5 月 12 日) 。(由Junio C Hamano 合并 -- --提交 017b7c5中,2018 年 5 月 30 日)
gitster

git-credential-netrc: 接受gpg选项

git-credential-netrcgpg无论 gpg.program 选项如何,都被硬编码为使用 ' ' 解密。
这是像 Debian 这样的发行版上的一个问题,它把现代 GnuPG 称为别的东西,比如 ' gpg2'


适用于 Windows 的分步说明

使用 Windows:

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

  • Install gpg4Win Lite,最小的 gnupg 命令行界面(取最新gpg4win-vanilla-2.X.Y-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.perl
    

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

(是的,这是一个 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/登录名/密码,并将其加密存储在您的磁盘上。
我发现它比“缓存”助手更方便,您需要记住并为每个远程服务输入(每个会话一次)不同的密码,以便将所述密码缓存在内存中。


在 Git 2.26(2020 年第一季度)中,用于使用的示例凭证帮助程序.netrc已更新为开箱即用。见补丁/讨论

请参阅Denton Liu ( ) 的提交 6579d93提交 1c78c78(2019 年 12 月 20 日(由Junio C Hamano 合并 -- --1fd27f8 提交中,2019 年 12 月 25 日)Denton-L
gitster

contrib/credential/netrc: 使PERL_PATH可配置

签字人:Denton Liu

Perl 解释器的 shebang 路径git-credential-netrc是硬编码的。
但是,某些用户可能将其放置在不同的位置,因此必须手动编辑脚本。

向脚本添加.perl前缀以将其表示为模板并忽略生成的版本。像其他 Perl 脚本一样,
增强Makefilegit-credential-netrc从生成的。git-credential-netrc.perl

Makefile 食谱被无耻地从contrib/mw-to-git/Makefile.

和:

在 2.26(2020 年第一季度)中,用于使用 .netrc 的示例凭证帮助程序已更新为开箱即用。

请参阅Denton Liu ( ) 的提交 6579d93提交 1c78c78(2019 年 12 月 20 日(由Junio C Hamano 合并 -- --1fd27f8 提交中,2019 年 12 月 25 日)Denton-L
gitster

contrib/credential/netrc: 在回购之外工作

签字人:Denton Liu

目前,git-credential-netrc不能在 git 存储库之外工作。它失败并出现以下错误:

fatal: Not a git repository: . at /usr/share/perl5/Git.pm line 214.

但是,没有真正的理由需要在存储库中。凭证助手也应该能够在存储库之外正常工作。

调用非自身版本,config()以便git-credential-netrc不再需要在存储库中运行。

Jeff King ( peff)补充道:

我假设您使用的是 gpg 加密的netrc(如果没有,您可能应该只使用credential-store)。
对于“只读”密码访问,我发现passwith config 这样的组合更好一点:

[credential "https://github.com"]
  username = peff
  helper = "!f() { test $1 = get && echo password=`pass github/oauth`; }; f"
于 2013-08-21T15:48:40.883 回答
50

使用凭证存储。

对于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
于 2015-09-09T03:57:37.597 回答
45

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

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

您可以更改网址git remote set-url <remote-repo> <URL>

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

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

于 2014-01-06T16:43:56.733 回答
42

你可以使用

git config credential.helper store

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

就是这样,如本页所述:

git-credential-store

于 2016-09-21T13:03:58.250 回答
23

对我来说,我需要先下载帮助程序并不是很明显!我在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
于 2012-10-05T05:31:39.703 回答
23

只需将登录凭据包含在 URL 中即可:

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

注意:我不推荐这种方法,但是如果你赶时间没有其他方法,你可以使用这种方法。

于 2014-07-03T07:13:52.007 回答
22

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

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

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

于 2012-12-05T13:28:51.443 回答
16

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

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

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

git config --global credential.helper manager

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

于 2014-05-24T07:49:14.633 回答
14

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

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

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

于 2011-03-19T08:12:07.030 回答
14

身份验证

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

git remote add fork https://4UTHT0KEN@github.com/foo/bar
git push fork

.netrc

另一种方法是在~/.netrc_netrc在 Windows 上)配置您的用户/密码,例如

machine github.com
login USERNAME
password PASSWORD

对于 HTTPS,添加额外的行:

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

有关的:

于 2016-06-19T22:44:20.747 回答
11

您可以使用凭证助手。

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

其中x是秒数。

于 2013-03-27T16:23:10.810 回答
11

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

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

然后你就不会被要求一次username又一次password

于 2017-01-05T09:42:32.587 回答
8

我知道这不是一个安全的解决方案,但有时您只需要一个简单的解决方案 - 无需安装其他任何东西。由于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 的情况下仅用于一个仓库)

和 - 瞧 - git 将使用这个用户 + 密码。

于 2017-05-27T11:26:50.597 回答
6

应使用身份验证令牌而不是帐户密码。转到 GitHub 设置/应用程序,然后创建个人访问令牌。可以像使用密码一样使用令牌。

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


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

  1. 编写一个 SSH 配置文件,其中包含部署密钥的 , 可能是Host,也可能是(尽管我认为您不需要它)。IdentityFileUserKnownHostsFileUser
  2. 编写一个 SSH 包装器 shell 脚本,它实际上是ssh -F /path/to/your/config $*
  3. 在您的普通GitGIT_SSH=/path/to/your/wrapper命令之前添加。这里的git remote(origin) 必须使用git@github.com:user/project.git格式。
于 2014-06-04T14:31:36.657 回答
6

最好使用凭据来确保安全,但您可以使用缓存将其保留一段时间:

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

您的凭据将保存 3600 秒。

于 2014-07-17T10:18:12.997 回答
6

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

我刚刚将相同的 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)
于 2017-12-15T08:36:01.750 回答
4

如果您像我一样使用双因素身份验证,情况会有所不同。由于我在其他地方没有找到好的答案,所以我会在这里贴一个,以便以后可以找到它。

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

而且我不记得我在哪里看到的,但是当您被要求输入用户名时 - 这就是您粘贴应用程序访问令牌的地方。然后将密码留空。它适用于我的 Mac。

于 2014-09-25T19:46:10.703 回答
3

这对我有用 我正在使用 Windows 10

git config --global credential.helper wincred
于 2016-07-02T19:05:37.230 回答
2

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

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

于 2014-01-27T18:45:18.977 回答
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
于 2016-07-14T18:02:57.417 回答
1

作曲家文档提到您可以阻止它使用 GitHub API,因此它的行为类似于git clone

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

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

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

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

于 2014-06-05T15:09:57.557 回答
0

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

rm -rf  ~/.git-credentials 

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

于 2022-02-16T15:09:44.310 回答
0

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

安装GitHub 开发的Git Credential Manager (下载)。它支持对 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

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

化妆品配置:由于我总是在上面的提示中选择“网络浏览器”,因此我设置了gitHubAuthModes 首选项以跳过该选择。GCM 的最新版本包括一个 GUI,它向身份验证流程添加了额外的点击,我禁用了它

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

授权 GCM 访问你的 GitHub 账号截图(仅第一次看到):

GCM 截图

后续身份验证的屏幕截图(每天查看一次)。无需点击。

在此处输入图像描述

最后是一个链接,用于检查连接到您的 GitHub 帐户的应用程序https://github.com/settings/applications

于 2022-02-27T16:42:19.080 回答
-1

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

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

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

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

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

于 2019-12-14T01:29:34.243 回答