背景介绍
需求:针对github仓库,想通过ssh key来操作。
问题:github要求不同仓库的deploy key 必须不一样,否则无法添加公钥。
当然,github这样规定是正确,方便了对仓库的精细管理,但也给配置deploy key增加一定难度。
网络上有大量文章对账户的SSH key 与 仓库的Deploy keys介绍。概括起来说就是,账户的SSH key 能够操作该账号下的任何仓库,而仓库的Deploy keys只能操作某个特定的仓库。
下面将对如何配置deploy key进行介绍,为保持文章尽量精简,不对ssh等原理性内容过多阐述。
操作流程
下面,先假设操作仓库的别名叫做 testprj,自己也可以起其他有意义的名字。
1. 生成ssh key
首先,生成项目的ssh key公钥、私钥,主要使用命令 ssh-keygen
ssh-keygen -t rsa -N '' -f /home/${USER}/.ssh/id_rsa_github_testprj -q
其中,-N 表示无密码,-f 指定文件名。
2. 将公钥添加至github项目中
在项目的settings中配置如下内容,其中:
- 图中1是deploy key的名字,自己随意起;
- 图中2是要粘贴步骤生成ssh key环节中生成的公钥id_rsa_github_testprj.pub的内容;
- 记得勾选 Allow write acess,给写入权限
题外话,公钥以.pub结尾,否则的话就是私钥,一定小心了。
3.修改仓库使用的Deploy key
首先,在电脑上当前用户的 .ssh 目录中修改该 config配置文件。若文件不存在,就创建它;若存在,新增相应内容。具体的内容如下
Host githubTestPrj
Hostname github.com
IdentityFile ~/.ssh/id_rsa_github_testprj
其中 Host后的值githubTestPrj用于给该密钥起别名,hostname指明了是针对github.com,IdentityFile指定ssh私钥的路径(不放心可以使用完整路径)。
特别说明: Host后的密钥别名,最好起一个与项目相关的名字,用来区分github上的不同项目。
最后,再在仓库代码目录下,修改**.git/config配置文件中的url**相应值
[remote "origin"]
url = git@githubTestPrj:GITHUB_NAME/GITHUB_PROJECT_NAME.git
fetch = +refs/heads/*:refs/remotes/origin/*
其中, githubTestPrj 是上一步Host的值,冒号后的字符串是你的项目在github的地址,格式为github的 用户名/项目名.git
特别说明,这里起关键作用的就是 githubTestPrj,指定了项目用哪个具体的密钥。然而,默认的是 github.com,不能达到区分什么项目用什么密钥的目的。