多个 Git 账户免密码登录完全配置

安得万里风,飘飖吹我裳。
唐 杜甫 《夏夜叹》

摘要

目前使用 git 作为文件版本控制工具的开发者越来越多,同时一个开发者可以拥有多个不同 git 服务器的帐号或者同一个 git 服务器的不同帐号。
  例如,小明在公司有个公司搭建的 git 服务器帐号用于工作开发,同时在目前流行的 github 和 bitbucket 上也有帐号,在业余时间 fork 一些项目,然后做一些 contributes. 这时小明就会遇到一个问题,账户这么多,如果每次使用 git 软件在终端进行 add, commit 后,需要 push 到本地仓库对应的远程服务器时,如果没有事先配置好 ssh 免密码登录或是其他密钥管理方法, 每次都需要输入对应的服务器账户密码来进行安全认证。
  有没有什么方法可以一劳永逸地解决这个多 git 账户自动匹配免密码登录问题呢?
本文描述了在 Terminal 环境下使用 ssh 协议的多个不同 git 服务器帐号的 git 仓库如何自动匹配免密码登录的方法。

快速预览

主要解决两个问题,免密码登录多账户自动匹配,前者可以使用 ssh 公私钥对解决,后者通过编辑 ssh 配置文件解决。

场景模拟

小明目前有 3 个 git 服务器账户,账户信息分别如下:

  • 第 1 个是公司购买的 bitbucket 付费账户,用于日常工作开发, 其账户名为 xiaoming, 关联邮箱为 xiaoming@test.com,
    目前工作项目的仓库地址为 git@bitbucket.org:xiaoming/testFly.git.
  • 第 2 个是自己私人申请的免费 bitbucket 账户, 用于管理和保存私人的配置文件等或者 fork 一些项目研究做些贡献,其账户名为 superming,关联邮箱为
    superming@gmail.com, 目前关注的项目仓库地址是 git@bitbucket.org:superming/superman.git.
  • 第 3 个账户也是自己私人申请的免费 github 账户,这里是开源的天堂,小明经常在此 star, watch, fork 项目等,其账户名为 mingh, 关联邮箱为
    mingh@gmail.com.

为了实现这 3 个账户自动匹配免密码登录,小明首先依次生成了三对密钥文件:

# 生成第 1 个名为 xiaoming 账户的密钥对
$ssh-keygen -t rsa -f ~/.ssh/id_rsa_xiaoming -C "xiaoming@test.com"
# 生成第 2 个名为 superming 账户的密钥对
$ssh-keygen -t rsa -f ~/.ssh/id_rsa_superming -C "superming@gmail.com"
# 生成第 3 个名为 mingh 账户的密钥对
$ssh-keygen -t rsa -f ~/.ssh/id_rsa_mingh -C "mingh@gmail.com"

接着手动添加了这 3 对密钥对的私钥文件到 ssh-agent 会话用于自动认证 ssh 会话连接:

$ssh-add ~/.ssh/id_rsa_xiaoming
$ssh-add ~/.ssh/id_rsa_superming
$ssh-add ~/.ssh/id_rsa_mingh

由于 ssh-agent 会话是一个临时的会话,在终端退出后也随之结束,为了每次启动终端时都能自动添加私钥文件:

$echo "ssh-add ~/.ssh/id_rsa_xiaoming >/dev/null 2&1" >> ~/.bashrc
$echo "ssh-add ~/.ssh/id_rsa_superming >/dev/null 2&1" >> ~/.bashrc
$echo "ssh-add ~/.ssh/id_rsa_mingh >/dev/null 2&1" >> ~/.bashrc

由于小明用的是 zshell, 需要把 ~/.bashrc 改成 ~/.zshrc.

接下来就要配置 ~/.ssh/config 配置文件实现账户自动匹配:

# 第 1 个 xiaoming bitbucket 工作账户
 host xiaoming_work
    hostname bitbucket.org
    Port 22
    User git
    IdentityFile "~/.ssh/id_rsa_xiaoming"
    
 # 第 2 个 superming bitbucket 私人账户
 host bitbucket.org
    hostname bitbucket.org
    Port 22
    User git
    IdentityFile "~/.ssh/id_rsa_superming"

# 第 3 个 mingh github 私人账户
 host github.com
    hostname github.com
    Port 22
    User git
    IdentityFile "~/.ssh/id_rsa_mingh"

由于工作账户新项目创建不频繁,所以使用了 xiaoming_work 作为 host, 但同时需要到当前工作的项目的根目录修改远程服务器地址:

# 原远程服务器 origin 地址为 git@bitbucket:xiaoming/testFly.git
$git remote remove origin
$git remote add origin xiaoming_work:xiaoming/testFly.git

hosthostname 一致的两个常用账户则不需要修改远程服务器地址了。

为了保证对应账户下的 git 仓库使用对应的账户名和邮箱进行 commit, push 等,
还需要进行每个 git 仓库设置对应的 user.nameuser.email:

$cd <testFly 仓库根目录>
$git config --local user.name "xiaoming"
$git config --local user.email "xiaoming@test.com"
...
## 其他仓库类似配置

方法详解

  1. 为指定 git 账户生成 ssh 密钥文件实现免密码登录

    ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "work@163.com"`
    
    • -t rsa 指定生成密钥类型(type)为 rsa 非对称加密;
    • -f ~/.ssh/id_rsa_work 指定生成密钥存放文件(file)为 ~/.ssh/id_rsa_work, 该文件名可以由用户自己命名,
      建议该文件统一放在 ~/.ssh/ 目录下以便于管理;
    • -C "work@163.com" 给该密钥添加注释(comment),一般使用关联该 git 账户的 email.
      执行此命令后需要你输入要生成的密钥文件的口令(密码)和重复输入口令,连按回车键即可设置密钥文件口令为空从而实现免密码登录。
      然后你就会在 ~/.ssh 目录下找到新生成的密钥文件分别为 id_rsa_workid_rsa_work.pub, 前者为私钥文件,本地私人使用,后者为公钥文件,
      可以公开使用。
  2. 添加上述私钥文件到当前 ssh-agent 会话用于认证 ssh 会话

    ssh-add ~/.ssh/id_rsa_work
    
  3. 查看当前会话已添加的 ssh 私钥

    ssh-add -L
    
  4. 每次启动终端时都自动添加指定私钥到当前 ssh-agent 会话中

    echo "ssh-add ~/.ssh/id_rsa_work  >/dev/null 2>&1" >> ~/.bashrc
    

    如果使用 zshell

    echo "ssh-add ~/.ssh/id_rsa_work  >/dev/null 2>&1" >> ~/.zshrc
    
  5. 配置 ~/.ssh/config 文件实现多 git 账户自动匹配认证登录
    编辑 ~/.ssh/config ssh 配置文件(如果没有该文件就手动新建,touch ~/.ssh/config),
    以 bitbucket 帐户为例,例如账户 work 下的一个 git 仓库地址为:git@bitbucket.org:work/test.git, 从仓库地址可以看出此仓库的
    用户名(User)为 git, 主机名(hostname)为 bitbucket.org, 通信端口号(Port)一般为 22.所以其配置为:

    # 此处演示 bitbucket 下注册的账户名为 work 的账户的 ssh 配置
    host git@bitbucket.org # 主机别名,用户自定义,具有唯一性
        hostname bitbucket.org # git 远程服务器主机名
        Port 22 # git 服务器端口号,一般默认为 22
        User git # git 仓库地址中 @ 符号前的用户名,常见为 git, 注意与你在该服务器上申请的账户名区分
        IdentityFile "~/.ssh/id_rsa_work" # 刚开始生成的密钥文件存放位置
    

    其中 hostname, User, Port 对应于 git 仓库地址里的信息,而 host 可以认为是一个别名,表示了这一主机的别名,
    可随意命名,用于区分具有同一个 hostname 的不同账户的仓库。IdentityFile 为私钥认证文件,即上文生成的 id_rsa_work 文件.

  6. 部署公钥到 git 服务器
    例如在 bitbucket 服务器网页上菜单 bitbucket Settings > SSH keys > Add key,
    把公钥文件里的公钥字符串拷贝粘贴到此处设置处.

    # 拷贝公钥字符串到系统剪贴板,此处是 macOS 的系统剪贴板
    cat ~/.ssh/id_rsa_work.pub | pbcopy
    
  7. 测试 ssh 能否免密码直连

    ssh -vT git@bitbucket.org
    

    或者使用 git clone 一个当前账户下的私人项目到本地看是否成功。

  8. 修改本地 git 仓库的远程服务器地址

  • 如果你在 github 或者 bitbucket 服务器上都只注册了一个账户,在配置 ~/.ssh/config 时建议 hosthostname 保持一致,
    如此不用修改配置。
  • 如果你在同一个 git 服务器上有两个账户,例如在 bitbucket 上有常用的work 账户和不太常用的 life 账户,~/.ssh/config 可以配置如下:
     # personal git account "work" in bitbucket
     host git@bitbucket.org
        hostname bitbucket.org
        Port 22
        User git
        IdentityFile "~/.ssh/id_rsa_work"
        
     # personal git account "life" in bitbucket
     host lifebucket
        hostname bitbucket.org
        Port 22
        User git
        IdentityFile "~/.ssh/id_rsa_life"
    
    • 使用上述配置,对于要新 clonework 账户下的仓库或是本地已存在的仓库,不需要修改任何配置,因为 hosthostname 一样。
    • 对于 life 账户下的仓库:
      • 新 clone 的仓库需要修改仓库地址url,例如 git clone git@bitbucket.org:life/tutorial.git 改为 git clone lifebucket:life/tutorial.git
      • 已经存在的仓库,切换到该仓库根目录,执行 git remote remove origin && git remote add origin lifebucket:life/tutorial.git.
  1. git 设置
    由于有多个不同的 git 账户,一般不能随意设置 git 全局设置了,尤其是 user.nameuser.email,需要单独给每个仓库设置。
    首先移除全局设置:
    git config --global --unset user.name && git config --global --unset user.email,
    然后到对应的仓库根目录下执行类似于下面的命令:
    git config --local user.name "life"
    git config --local user.email "life@163.com"
    

延伸阅读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • 在使用git的时候,一般我们使用的远程Git服务器是github,这时只需简单的生成ssh-key密钥对并将公钥添...
    gofanelena阅读 5,539评论 0 5
  • 文章1: Git 多账户配置使用,同时使用github 和 gitoschina http://blog.csdn...
    ouhoo阅读 1,574评论 0 0
  • GIT分布式版本控制系统最佳实践 这篇文章来自于老男孩教育高级架构师班12期的徐亮偉同学。 首先感谢老男孩架构师班...
    meng_philip123阅读 3,258评论 4 36
  • 最近一首歌《老子吃火锅,你吃火锅底料》,一首free style的歌名一看就有莫名的喜感。 “老子吃火锅,你吃...
    吴凤蝶阅读 2,434评论 2 1