ssh协议
如果使用 SSH 方式连接远端(当执行类似git clone git clone [email protected]:xxx/xxx.git
后,在此仓库中的上传下载均采用 ssh 协议),并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数据。
https协议
从2021.08.13开始, GitHub不再支持账号和密码的方式来 pull 和 push 代码了,取而代之的是官方推出的 Token。
Token的官方使用教程
与密码不同的是,Token一旦生成,需要立即记住,当关闭页面就无法再查看。
所以更需要让 Git 帮忙缓存(本地保存) Token。
Git 缓存 Token 和缓存密码的原理相同。
当执行类似命令git clone https://github.com/xxx/xxx.git
后,在此仓库中的上传下载均采用 https 协议;
https 协议下,Git 默认不缓存用户名密码。 每一次连接(pull/push)都会询问用户名和密码。
Git 拥有一个凭证系统,以多种策略存储本地凭证,以避免重复输入用户名密码。
cache
cache
模式会将凭证存放在内存中一段时间,默认15分钟后从内存中清除。
# 全局设置 git 密码缓存到内存中
git config --global credential.helper cache
# 设置当前仓库的用户名密码缓存到内存中
git config --local credential.helper cache
cache
模式有 --timeout <seconds>
参数,可以设置后台进程的存活时间(默认是 900 秒,也就是 15 分钟)。
osxkeychain
如果是 Mac,Git 有一种 osxkeychain
模式,它会将凭证缓存到系统用户的钥匙串中。 这种方式将凭证存放在磁盘中,并且永不过期,但是是被加密的,这种加密方式与存放 HTTPS 凭证以及 Safari 的自动填写是相同的。可以通过Mac系统菜单页面“其他->钥匙串访问”功能,搜索git关键字查看。
wincred
如果是 Windows,与 “osxkeychain” 类似,git 使用标准的 windows凭据管理器来存储凭据,可以从控制面板设置中查看凭据管理器。
git config --global credential.helper wincred
manager
如果是 Windows,可以安装Git Credential Manager for WindowsGit Credential Manager Core,与 “osxkeychain” 类似,git 使用标准的 windows凭据管理器来存储凭据,可以从控制面板设置中查看凭据管理器。
git config --global credential.helper manager
wincred
对比 manager
推荐使用凭证存储模式 manager
- 相同点:
- 都会将用户信息存储到Windows凭据管理器中
- 不同点:
- Windows凭据管理器中
manager
会将用户信息加密,wincred
则不会
- Windows凭据管理器中
wincred
模式下的用户信息展示如下
Internet 地址或网络地址:git:https://用户名@github.com; 用户名:真实用户名
manager
模式下的用户信息展示如下
Internet 地址或网络地址:git:https://github.com; 用户名:PersonalAccessToken
store
store
模式会将用户名密码以明文的形式存放在磁盘中。
# 全局设置 git 用户名密码存储到硬盘中
git config --global credential.helper store
# 设置当前仓库的用户名密码存储到硬盘中
git config --local credential.helper store
默认存储在当前用户 home 目录下的.git-credentials
文件中,存储格式如下:
https://username:[email protected]
store
模式可以接受一个 --file <path>
参数,可以自定义存放密码的文件路径(默认是 ~/.git-credentials )。
git config --global credential.helper 'store --file ~/.my-credentials'
path 参数可以使用绝对路径和相对路径
当对特定仓库设置credential.helper = store
时指定相对路径时,是以仓库根目录为起点,如:
git config --local credential.helper 'store --file=.git/.git-credentials'
用户名密码会存储在 /git-repository/.git/.git-credentials
文件中
使用store
方式时,配置每个 repository 的 local 级别credential.helper ,可以实现同域名多账户记住密码的效果,但由于是明文存储,安全性没有maneger
高。
如想清除账户信息, 删除.git-credentials
文件即可
参考:
- https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage
- https://stackoverflow.com/questions/38333752/trying-to-understand-wincred-with-git-for-windows-confused
- https://www.jianshu.com/p/0ad3d88c51f4
- https://zhuanlan.zhihu.com/p/157751660