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

2096

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

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


2
现在您可以使用凭据助手来加密包含您凭据的 _netrc 文件。请参见下面我的回答。我发现这比在Windows上有点不稳定的 git-credential-winstore.exe(内存缓存)更安全。 - VonC
一个安全易用的SSH或个人访问令牌的替代方案是通过Git凭据管理器使用OAuth,详见我的回答https://dev59.com/om435IYBdhLWcg3wkA5e#71286601。 - Colonel Panic
28个回答

14

OAuth

您可以创建自己的个人API令牌OAuth),并像使用普通凭据一样使用它(位于:/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时缓存您的GitHub密码, 您可以使用凭证助手来告诉Git每次与GitHub通信时记住您的GitHub用户名和密码。

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

相关文章:


14

如果您不想像Mark所说的那样以纯文本形式存储密码,可以在获取和推送时使用不同的GitHub URL。在配置文件中,在[remote“origin”]下:

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

对于开源项目,在推送时它仍会要求密码,但在获取时不需要。


11

你可以使用凭证辅助工具。

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

其中x代表秒数。


9
这是一个秒数... 有个天才把它更新成毫秒,然后大家都没有检查就批准了。如果你不知道答案,请不要误导人们。谢谢! - Charan
你能给一个链接,列出并解释storecache和其他常见的东西吗? - Notinlist
5
提到一下,除非您首先调用另一个特定的命令将“cache”作为管理器使用,否则这些都没啥用。这些东西很神秘,所有这些答案都不完整,也没有一个有效。非常令人沮丧。请参见此链接:https://dev59.com/om435IYBdhLWcg3wkA5e#24800870 - Triynko

11
在克隆代码库repo后,您可以编辑repo/.git/config文件,并添加以下配置:
[user]
    name = you_name
    password = you_password
[credential]
    helper = store

那么您将不会再被要求输入用户名密码


对我来说,使用helper = manager可以工作(但第一次推送时会要求输入用户名+仓库)。 - Stéphane Laurent
使用helper=manager时,我遇到了错误:credential-manager不是git命令。 - PapaDiHatti
1
很遗憾,git会忽略配置文件中的密码。.git_credentials与credential.store是唯一的选择。 - Avamander

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)

然后 - voilá - git将使用这个用户名和密码。


我同意。确实是一个简单(但不安全)的解决方案。只要你知道自己在做什么,就点赞。 - VonC

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)

6
应该使用身份验证令牌而不是帐户密码。前往GitHub设置/应用程序,然后创建个人访问令牌(token)。与密码使用方式相同,可以使用该令牌。
该令牌旨在允许用户在项目工作中不使用帐户密码。只有在进行管理工作(例如创建新令牌或撤销旧令牌)时才使用密码。
不要使用授予用户对GitHub帐户的整体访问权限的标记或密码,而应使用特定于项目的部署密钥来授予对单个项目存储库的访问权限。 可以按照以下步骤配置Git项目以使用此不同的密钥,即使您仍然可以使用普通凭据访问其他Git帐户或项目:
  1. 编写一个包含部署密钥的Host、IdentityFile、UserKnownHostsFile和User(尽管我认为您不需要它)的SSH配置文件。
  2. 写一个SSH包装器shell脚本,虚拟上是ssh -F /path/to/your/config $*
  3. 在您的普通Git命令之前添加GIT_SSH=/path/to/your/wrapper。这里,git remote (origin) 必须使用git@github.com:user/project.git格式。

6

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

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

您的凭证将被保存3600秒。

1
这意味着在3600秒后,我们需要再次输入密码吗? 如何永久保存它们? - Bulma
$ git config credential.helper 'cache --timeout=3600' 错误:无法锁定配置文件.git/config:没有这样的文件或目录。 - PlantationGator
这个命令可用:git config --global credential.helper 'cache --timeout=3600' - PlantationGator
这个能在基于 windowsservercore 的 Docker 容器内运行吗? - Peter Mortensen
1
@NeilChowdhury,那不是真的。根据官方文档,默认情况下,密码将被保留15分钟。不要散布这样没有根据的言论! - jdhao

4
截至2021年,已经有一种安全易用的跨平台解决方案可用于HTTPS远程连接。不再需要输入密码!不再需要SSH密钥!也不再需要个人访问令牌!
请安装由GitHub开发的Git凭据管理器下载)。它支持无密码OAuth认证到GitHub、BitBucket、Azure和GitLab。这意味着您可以在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

4

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

如果您使用双因素身份验证,则指定用户名/密码将无法工作-您将无法访问。但是,您可以使用应用程序访问令牌并使用Git的凭据助手为您缓存。以下是相关链接:

我不记得在哪里看到过了,但当您被要求提供用户名时,那就是您放置应用程序访问令牌的地方。然后留空密码。它在我的Mac上运作良好。


当使用双重身份验证时,您将使用“访问令牌”作为密码。用户名与以往一样保持不变。 - Ben Yitzhaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接