文章目录
  1. 1. 问题描述
    1. 1.1. 工作环境
    2. 1.2. 期望结果
    3. 1.3. 网上帮助
  2. 2. 方案思路
    1. 2.1. 需要解决的根本问题
    2. 2.2. 可以借鉴的东西
  3. 3. 技术资料
    1. 3.1. 速食资料
    2. 3.2. 巨坑资料
    3. 3.3. 基本资料
  4. 4. 版本环境
    1. 4.1. 四屏机环境说明
    2. 4.2. 双屏机环境说明
    3. 4.3. Surface机环境说明
  5. 5. 处理过程01: 解决思路
    1. 5.1. 初步解决思路
    2. 5.2. 隐约中觉得可以考虑的Git的3个config文件
    3. 5.3. 根据名字发现觉得可疑的Git的1个credentials文件
    4. 5.4. 修改配置文件的方式
  6. 6. 处理过程02: 在仓库的local config文件.\.git\config中存储账户和密码
    1. 6.1. 操作过程
    2. 6.2. 方法总结
    3. 6.3. 持续改进
  7. 7. 处理过程03: 在用户目录下的credentials文件.\.git-credentials中存储账户和密码
    1. 7.1. 操作过程
    2. 7.2. 特别注意
    3. 7.3. 方法总结
    4. 7.4. 持续改进
  8. 8. 处理过程04: 在用户目录下的多个credentials文件.\.git-credentials-xxx中分别存储账户和密码
    1. 8.1. 操作过程
    2. 8.2. 方法总结
    3. 8.3. 持续改进
  9. 9. 处理过程05: git config命令之坑
    1. 9.1. 方法总结
  10. 10. 处理过程06: config 文件优先权之坑
  11. 11. 处理过程07: 高版本Git客户端master之坑
  12. 12. 处理过程08: 与Sourcetree搭配使用
  13. 13. 处理过程09: 用户名和个性后缀的讨论

问题描述

工作环境

平时在主要在3台电脑上切换工作,安装了不同版本的OS,Git客户端等。在github.com上有1个账户,M个仓库; 在coding.net上2个账户,N个仓库。 根据平时工作任务性质的不同,在不同的远端平台仓库上使用不同账户与他人协作。

期望结果

  • 用习惯的HTTPS方式访问远端
  • 记忆账户密码,不用每次输入
  • 在2个平台上自动选择3个账户进行登录

网上帮助

  • 找到了HTTPS方式存储账户和密码的帮助
  • 找到了SSH方式存储账户和密码的帮助
  • 找到了SSH方式的多账户登录模式的帮助

方案思路

需要解决的根本问题

  • 在本地机找位置存放账户和密码
  • 设置映射配置将仓库地址与相关账户密码进行对应

可以借鉴的东西

  • HTTPS方式中如何存储账户和密码
  • SSH方式中通过alias进行映射

技术资料

速食资料

巨坑资料

基本资料

版本环境

四屏机环境说明

  • 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访问地址中,是允许明文带账户名和密码的,格式如下:
    1
    https://yourname:password@git.coding.net/yourname/project.git

其中,账户名和密码用:隔开;密码和地址用@隔开;
所以,处理的思路为:修改[remote "origin"]节,将

1
2
3
[remote "origin"]
url = https://git.coding.net/tjBH/Git_WKP_TM.git
fetch = +refs/heads/*:refs/remotes/origin/*

改写如下:(假设账户名tjBH,密码tjBHPwd)

1
2
3
[remote "origin"]
url = https://tjBH:tjBHPwd@git.coding.net/tjBH/Git_WKP_TM.git
fetch = +refs/heads/*:refs/remotes/origin/*

通过这种方式,每个本地仓库再和远端进行数据交换时,就可以各自按照不同的账户登录了。

方法总结

  • 账户密码存储在本地仓库的.\.git\config
  • 每个本地仓库中本身都有一个.\.git\config,这就是一种固定的映射
  • 不能一存多用,各仓库不能共享相同的账户和密码
  • 一旦修改密码,要修改的地方太多
  • 明文到处存储,不安全

持续改进

!!!

处理过程03: 在用户目录下的credentials文件.\.git-credentials中存储账户和密码

2017-02-09 - 账户密码存放位置和控制位置分离

操作过程

打开.\.git-credentials文件,你的也许是空的,我设置好以后,如下:

1
2
https://tjBHC%40qq.com:tjBHCPwd@git.coding.net
https://tjBHG%40qq.com:tjBHGPwd@github.com

应该看出来了,格式和上面一样,这里分别有了coding.net和github.com对应的1个账户和密码。
把这里设置好以后,在需要默认账户登录的仓库的.\.git\config中,添加[credential]节,如下

1
2
[credential]
helper = store

这个意思是,本仓库的账户和密码到.\.git-credentials去匹配,
匹配的规则是使用[remote "origin"]节中的内容
例1:

1
2
3
[remote "origin"]
url = https://git.coding.net/tjBH/Git_WKP_TM.git
fetch = +refs/heads/*:refs/remotes/origin/*

例1中的匹配串就是git.coding.net,在.\.git-credentials中匹配到的账户和密码是tjBHC%40qq.com:tjBHCPwd

例2:

1
2
3
[remote "origin"]
url = https://github.com/tjBH/Git_WKP_TM.git
fetch = +refs/heads/*:refs/remotes/origin/*

例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文件,设置如下:

1
2
https://tjBHC%40qq.com:tjBHCPwd@git.coding.net
https://tjBHG%40qq.com:tjBHGPwd@github.com

打开.\.git-credentials-coding2文件,如果没有,自己做一个便是,设置如下:(coding.net的另外一个账户)

1
https://tjBHC2%40qq.com:tjBHC2Pwd@git.coding.net

使用.\.git-credentials进行匹配的本地仓库.\.git\config配置如下:

1
2
[credential]
helper = store

使用.\.git-credentials-xxx进行匹配的本地仓库.\.git\config配置如下:

1
2
[credential]
helper = store --file $HOME/.git-credentials-coding2

方法总结

  • 账户,密码在.\.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节中,添加如下内容:

1
2
[credential]
helper = store --file $HOME/.git-credentials-coding2

需要使用git config,甚至在官方文档中也是如此说明:
格式如下:

1
git config credential.helper 'store [options]'

具体到我所需要的效果,命令如下:

1
git config credential.helper store --file $HOME/.git-credentials-coding2

但是不管如何尝试,最终出来的效果都是这样:

1
2
[credential]
helper = store

也就是说,指定文件部分是无法存入的!!!
这个坑太大了,折腾了我很久,无意中打开配置文件才发现是无效的。后来有一次偶然发现,踩这坑的,不知我一个,这哥们跟我一样。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 - 账

文章目录
  1. 1. 问题描述
    1. 1.1. 工作环境
    2. 1.2. 期望结果
    3. 1.3. 网上帮助
  2. 2. 方案思路
    1. 2.1. 需要解决的根本问题
    2. 2.2. 可以借鉴的东西
  3. 3. 技术资料
    1. 3.1. 速食资料
    2. 3.2. 巨坑资料
    3. 3.3. 基本资料
  4. 4. 版本环境
    1. 4.1. 四屏机环境说明
    2. 4.2. 双屏机环境说明
    3. 4.3. Surface机环境说明
  5. 5. 处理过程01: 解决思路
    1. 5.1. 初步解决思路
    2. 5.2. 隐约中觉得可以考虑的Git的3个config文件
    3. 5.3. 根据名字发现觉得可疑的Git的1个credentials文件
    4. 5.4. 修改配置文件的方式
  6. 6. 处理过程02: 在仓库的local config文件.\.git\config中存储账户和密码
    1. 6.1. 操作过程
    2. 6.2. 方法总结
    3. 6.3. 持续改进
  7. 7. 处理过程03: 在用户目录下的credentials文件.\.git-credentials中存储账户和密码
    1. 7.1. 操作过程
    2. 7.2. 特别注意
    3. 7.3. 方法总结
    4. 7.4. 持续改进
  8. 8. 处理过程04: 在用户目录下的多个credentials文件.\.git-credentials-xxx中分别存储账户和密码
    1. 8.1. 操作过程
    2. 8.2. 方法总结
    3. 8.3. 持续改进
  9. 9. 处理过程05: git config命令之坑
    1. 9.1. 方法总结
  10. 10. 处理过程06: config 文件优先权之坑
  11. 11. 处理过程07: 高版本Git客户端master之坑
  12. 12. 处理过程08: 与Sourcetree搭配使用
  13. 13. 处理过程09: 用户名和个性后缀的讨论