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

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


当前回答

在Ubuntu上使用GitCredentialManager(GCM)在本地缓存凭据,在Ubuntu 20.04和18.04上进行了测试,但应该可以在其他Linux发行版上运行。

设置git凭据管理器:

curl -LO https://raw.githubusercontent.com/GitCredentialManager/git-credential-manager/main/src/linux/Packaging.Linux/install-from-source.sh
sh ./install-from-source.sh
git-credential-manager-core configure
git config --global credential.credentialStore cache
git config --global credential.cacheoptions "--timeout 72000"
sudo rm -rf git-credential-manager/
sudo rm install-from-source.sh

转到回购并运行git fetch选择设备代码访问链接并输入输出中提供的代码

其他回答

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

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


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

编写一个SSH配置文件,其中包含Host、部署密钥的IdentityFile、UserKnownHostsFile和User(尽管我认为您不需要)。编写一个SSH包装器shell脚本,该脚本实际上是SSH-F/path/to/your/config$*将GIT_SSH=/path/to/your/wapper前置到普通GIT命令前面。这里git remote(原点)必须使用git@github.com:user/project.git格式。

自Git 1.7.9(2012年发布)以来,Git中有一种巧妙的机制,可以避免一直为HTTP/HTTPS输入密码,称为凭据助手。

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

git config --global credential.helper cache

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

# Cache for 1 hour
git config --global credential.helper "cache --timeout=3600"

# Cache for 1 day
git config --global credential.helper "cache --timeout=86400"

# Cache for 1 week
git config --global credential.helper "cache --timeout=604800"

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

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

git config --global credential.helper osxkeychain

对于Windows,有一个名为GitCredentialManagerforWindows或wincred的助手。

git config --global credential.helper wincred # obsolete

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

git config --global credential.helper manager

对于Linux,您将使用(在2011年)gnomekeyring(或其他keyring实现,如KWallet)。

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

Fedora公司

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

Ubuntu(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

您可以使用凭据助手。

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

其中x是秒数。

如果你不想像Mark所说的那样以明文形式存储密码,你可以使用不同的GitHub URL进行抓取,而不是推送。在配置文件中的[远程“原点”]下:

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

当您推送时,它仍然会要求输入密码,但当您获取时,它不会要求输入密码。

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

git config credential.helper store

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

如果您希望Git恢复到每次需要时都向您请求凭据连接到远程存储库,可以运行以下命令:

git config --unset credential.helper

要将密码存储在%HOME%目录(而不是项目目录)中的.git凭据中,请使用--global标志

git config --global credential.helper store