本文使用的git版本为:git version 2.20.1
OS版本:10.14.3

git有时需要用户提供凭据才能操作,比如一般公司的git服务器像gitlab等都会需要提供用户名和密码才能访问,但是每次更新或提交代码都要求输入一遍用户名密码实在繁琐,本文主要介绍一下在macOS下如何避免这种频繁的重复输入。

一 起因

之前配置的store方式用于存储用户名及密码,但是最近升级了一下git版本,发现记住密码功能失效了,又开始要求输入用户名及密码,于是赶紧检查了一下配置,发现credential.helper的值变成了osxkeychain,而且即使输入了也无法记住密码,原本很简单的事情,忽然感觉复杂了,索性趁此了解一下。

二 检查本地可用的凭据助手

密码保存功能主要是借助外部凭据助手,这个助手的作用就是在git服务器(一般是通过http/https访问的URL)需要用户名和密码时,它可以提供该信息,而这种凭据助手也有很多,主要是通过credential.helper属性来指定。

$ git help -a | grep credential-
   credential-cache     Helper to temporarily store passwords in memory
   credential-store     Helper to store credentials on disk
   credential-osxkeychain

可以看到,本地默认有3个助手可选,分别为credential-cachecredential-storecredential-osxkeychain

三 凭据助手用法

直接使用上述的助手中credential-后边的部分,例如要使用credential-cache,就配置cache,其他如store,osxkeychain

1 cache

cache 将凭据临时存入内存中
用法:

git config credential.helper 'cache [<options>]'

缓存的凭据在经过一段超时时间后会自动清空,可以通过Unix域套接字访问缓存,访问的权限受限于当前用户在文件系统的权限。

选项
--timeout <seconds> 缓存凭据的秒数,默认为900秒。
--socket <path> 使用<path>联系正在运行的缓存守护程序(或者如果未启动新的缓存守护程序,则启动一个)。默认为$XDG_CACHE_HOME/git/credential/socket,除非~/.git-credential-cache/目录存在,这样会使用~/.git-credential-cache/socket。另外必须使用本地文件系统中的绝对路径。

控制守护进程
如果希望提前退出守护进程,在凭据超时前提前清空,可以执行以下命令:

$ git credential-cache exit

示例

# 默认设置
$ git config credential.helper cache
# 指定超时时间为30min
$ git config credential.helper 'cache --timeout=1800'

2 store

store 将凭据存入磁盘
用法:

git config credential.helper 'store [<options>]'

使用此助手会将密码明文存储在磁盘上,安全依赖于文件系统权限,如果这点不可接受,请选择cacheosxkeychain或其他安全的存储方式。

选项
--file=<path> 使用<path>查找和存储凭据。该文件依赖操作系统的权限访问,但不会加密。如果没有指定,默认会依次查找~/.git-credentials$XDG_CONFIG_HOME/git/credentials,写的顺序也是一样。但是当清空凭据时,将会从所有文件中清除。

示例

# 默认设置
$ git config credential.helper store

.git-credentials文件内容格式
.git-credentials文件以纯文本格式存储。每个凭据都作为URL存储在单独的一行中:

https://user:pass@example.com

3 osxkeychain

osxkeychain 将凭据存入mac的钥匙串应用
如果你的Mac系统中不存在该助手,也可以单独下载安装:

curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychain
sudo mv git-credential-osxkeychain /usr/local/bin
sudo chmod u+x /usr/local/bin/git-credential-osxkeychain
注:安装方法来自Stack Overflow: git-keeps-prompting-me-for-password

示例

$ git config --global credential.helper osxkeychain

四 检查当前使用的助手

$ git config  -l |grep credential.helper
credential.helper=osxkeychain

看到这里,我决定就使用当前设置了,但问题来了,输入密码保存无效啊,不管是直接从shell中,还是Idea中,每次更新依然提示输入用户名密码,根本不会保存下来。如果你也遇到这个问题,请继续往下看。

既然每次都提示,怀疑是钥匙串中没有保存密码,于是打开钥匙串,搜索相关地址和用户名,果然没有:
git-tools-credential-storage-1.jpg
既然不能自动保存,那就手动添加一个吧,点击左上角+(或者点击文件->新建密码项...),根据提示填写如下信息:
git-tools-credential-storage-2.jpg
但当点击添加时,却一直报错,提示权限错误,多次查找无果,偶然发现左侧的小锁图标是开着的,于是右键锁定钥匙串"登录"后重新添加了一下,终于,这次弹出授权确认框,输入当前用户密码确认后添加成功!

然后执行一下git fetch命令也弹出了git-credential-osxkeychain访问授权的窗口,而不是简单的询问git的用户名密码,说明生效了:
git-tools-credential-storage-3.jpg

确认系统管理员密码(当前登录用户)后,点击始终允许即可。

注:锁住的"登录"钥匙串又变为了打开的状态。本次故障猜测是由于系统重启或更新后导致权限错误,未验证。

如果你想了解更多细节,或者你是Windows用户,也可以参考这里:Git-Tools-Credential-Storage

参考

https://git-scm.com/docs/git-config
https://git-scm.com/docs/gitcredentials
https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage

文章目录