HTTPS访问方式的Git多账户登录
- 1. 问题描述
- 2. 方案思路
- 3. 技术资料
- 4. 版本环境
- 5. 处理过程01: 解决思路
- 6. 处理过程02: 在仓库的local config文件.\.git\config中存储账户和密码
- 7. 处理过程03: 在用户目录下的credentials文件.\.git-credentials中存储账户和密码
- 8. 处理过程04: 在用户目录下的多个credentials文件.\.git-credentials-xxx中分别存储账户和密码
- 9. 处理过程05: git config命令之坑
- 10. 处理过程06: config 文件优先权之坑
- 11. 处理过程07: 高版本Git客户端master之坑
- 12. 处理过程08: 与Sourcetree搭配使用
- 13. 处理过程09: 用户名和个性后缀的讨论
问题描述
工作环境
平时在主要在3台电脑上切换工作,安装了不同版本的OS,Git客户端等。在github.com上有1个账户,M个仓库; 在coding.net上2个账户,N个仓库。 根据平时工作任务性质的不同,在不同的远端平台仓库上使用不同账户与他人协作。
期望结果
- 用习惯的HTTPS方式访问远端
- 记忆账户密码,不用每次输入
- 在2个平台上自动选择3个账户进行登录
网上帮助
- 找到了HTTPS方式存储账户和密码的帮助
- 找到了SSH方式存储账户和密码的帮助
- 找到了SSH方式的多账户登录模式的帮助
方案思路
需要解决的根本问题
- 在本地机找位置存放账户和密码
- 设置映射配置将仓库地址与相关账户密码进行对应
可以借鉴的东西
- HTTPS方式中如何存储账户和密码
- SSH方式中通过alias进行映射
技术资料
速食资料
- git的SSH key和HTTPS 访问方式
- Https方式使用Git@OSC设置密码的方式
- Git配置credential helper,并使用Http/Https传输
- distributed-is-the-new-centralized
- Git多账号登陆
- git多账号登录问题
- 使用git-credential-winstore保存https访问密码
巨坑资料
- Can’t deal with lock file .git-credentials.lock when exec git push in v2.8.3
- Build Hang or Fail with Git for Windows
- Cannot use local credential.helper if Git Credentials Manager is enabled
基本资料
版本环境
四屏机环境说明
- OS版本
Win10专业版
- Git版本
git version 1.8.3.msystit.0
- Sourcetree版本
1.9.5.0
双屏机环境说明
- OS版本
Win8.1企业版
- Git版本
git version 1.8.3.msystit.0
- Sourcetree版本
1.8.3.0
Surface机环境说明
- OS版本
Win10家庭中文版
- Git版本
git version 2.9.0.windows.1
git version 2.11.1.windows.1
- Sourcetree版本
1.9.5.0
处理过程01: 解决思路
2017-02-08 - 根据资料找寻存放位置
初步解决思路
- 尽量一存多用(存储账户密码的位置可以被多个仓库使用)
- 便于修改(密码变了,不用到处去修改)
- 安全
隐约中觉得可以考虑的Git的3个config文件
- Local Config: LocalRepo目录(如
C:\Git_WKP_TM\
)下的.\.git\config
- User Config: Windows系统的用户目录下当前用户目录(如
C:\Users\tjAdmin\
)下的.\.gitconfig
- System Config: Git程序的安装目录下(如
C:\Program Files (x86)\Git\
)的.\etc\gitconfig
(Git版本git version 1.8.3.msystit.0
) - System Config: Git程序的安装目录下(如
C:\Program Files\Git\
)的.\mingw64\etc\gitconfig
(Git版本git version 2.9.0.windows.1
)
根据名字发现觉得可疑的Git的1个credentials文件
- Windows系统的用户目录下当前用户目录(如
C:\Users\tjAdmin\
)下的.\.git-credentials
修改配置文件的方式
修改配置文件可以用git config
命令,也可以直接修改配置文件,这里都是采用直接修改配置文件方式。
处理过程02: 在仓库的local config文件.\.git\config
中存储账户和密码
2017-02-08 - local config 文件中的尝试
操作过程
- 在仓库的本地配置文件中,是会存储仓库的远程地址的,位置在
[remote "origin"]
节中 - Git仓库的HTTPS访问地址中,是允许明文带账户名和密码的,格式如下:1https://yourname:password@git.coding.net/yourname/project.git
其中,账户名和密码用:
隔开;密码和地址用@
隔开;
所以,处理的思路为:修改[remote "origin"]
节,将
改写如下:(假设账户名tjBH
,密码tjBHPwd
)
通过这种方式,每个本地仓库再和远端进行数据交换时,就可以各自按照不同的账户登录了。
方法总结
- 账户密码存储在本地仓库的
.\.git\config
中 - 每个本地仓库中本身都有一个
.\.git\config
,这就是一种固定的映射 - 不能一存多用,各仓库不能共享相同的账户和密码
- 一旦修改密码,要修改的地方太多
- 明文到处存储,不安全
持续改进
!!!
处理过程03: 在用户目录下的credentials文件.\.git-credentials
中存储账户和密码
2017-02-09 - 账户密码存放位置和控制位置分离
操作过程
打开.\.git-credentials
文件,你的也许是空的,我设置好以后,如下:
应该看出来了,格式和上面一样,这里分别有了coding.net和github.com对应的1个账户和密码。
把这里设置好以后,在需要默认账户登录的仓库的.\.git\config
中,添加[credential]
节,如下
|
|
这个意思是,本仓库的账户和密码到.\.git-credentials
去匹配,
匹配的规则是使用[remote "origin"]
节中的内容
例1:
|
|
例1中的匹配串就是git.coding.net
,在.\.git-credentials
中匹配到的账户和密码是tjBHC%40qq.com:tjBHCPwd
例2:
例2中的匹配串就是github.com
,在.\.git-credentials
中匹配到的账户和密码是tjBHG%40qq.com:tjBHGPwd
通过这种方式,每个本地仓库再和远端进行数据交换时,就可以各自按照不同的账户登录了。
特别注意
因为
@
是在这个格式中,是用来分割密码和访问地址的,
而这个例子里,账户名是邮箱格式的,其中包含了@
,所以这里出现了%40
来替代。
关于账户名和个性后缀的问题讨论。。。
方法总结
- 账户,密码在
.\.git-credentials
中存储 - 账户,密码在
.\.git-credentials
中进行仓库地址映射 - 在
.\.git\config
中的[credential]
决定是否使用统一账户密码 - 账户,密码一处存放,多处使用
- 账户,密码一旦需要修改,只改一处即可
- 解决了多个平台,每个平台1个账户的问题
- 不能解决1个平台多个账户的问题
- 只在一个地方集中存储账户密码,但是是明文方式,有一定的不安全性
持续改进
!!!
处理过程04: 在用户目录下的多个credentials文件.\.git-credentials-xxx
中分别存储账户和密码
2017-02-10 - 试试多个credentials文件做映射
操作过程
打开.\.git-credentials
文件,设置如下:
打开.\.git-credentials-coding2
文件,如果没有,自己做一个便是,设置如下:(coding.net的另外一个账户)
使用.\.git-credentials
进行匹配的本地仓库.\.git\config
配置如下:
使用.\.git-credentials-xxx
进行匹配的本地仓库.\.git\config
配置如下:
方法总结
- 账户,密码在
.\.git-credentials-xxx
中存储 - 同一个平台,多个账户密码,可以分别存储在不同的
.\.git-credentials-xxx
中 - 账户,密码在
.\.git-credentials-xxx
中进行仓库地址映射 - 在
.\.git\config
中的[credential]
决定是否使用统一账户密码 - 在
.\.git\config
中的[credential]
决定使用哪个.\.git-credentials-xxx
进行映射 - 账户,密码一处存放,多处使用
- 账户,密码一旦需要修改,只改一处即可
- 解决了多个平台,每个平台多个账户的问题
- 只在一个地方集中存储账户密码,但是是明文方式,有一定的不安全性
持续改进
!!!
处理过程05: git config
命令之坑
2017-02-11 - 部分复杂的git config
命令可能有bug
前面说过,对于Git的3个config文件(local,user,system),修改其内容可以用git config
命令,也可以直接在配置文件中修改,我在前面的讲解里采用了直接在配置文件中修改的方式,这是有原因的。
Git还有些bug,部分复杂的git config
可能是无效的。至少在我尝试过的以下3个版本中,这种现象都是存在的。
git version 1.8.3.msystit.0
git version 2.9.0.windows.1
git version 2.11.1.windows.1
为了在config文件的credential节中,添加如下内容:
需要使用git config
,甚至在官方文档中也是如此说明:
格式如下:
具体到我所需要的效果,命令如下:
但是不管如何尝试,最终出来的效果都是这样:
也就是说,指定文件部分是无法存入的!!!
这个坑太大了,折腾了我很久,无意中打开配置文件才发现是无效的。后来有一次偶然发现,踩这坑的,不知我一个,这哥们跟我一样。Git凭证存储
方法总结
- git config 命令之后,还是要打开对应的config文件检查下
- 官方文档也未必靠谱
处理过程06: config 文件优先权之坑
2017-02-11 - 3个config(local,user,system)的优先权
处理过程07: 高版本Git客户端master
之坑
2017-02-12 - 高版本的system config
文件里出现了helper = master
处理过程08: 与Sourcetree搭配使用
2017-02-13 - 账
处理过程09: 用户名和个性后缀的讨论
2017-02-14 - 账