分享个人 Full-Stack JavaScript 项目开发经验
最近在工作中遇到这样的场景:公司采用 GitLab 工作流,并且要求小版本的功能分支需先提交到一个从远程公共仓库 fork 下来的远程个人仓库上。碰巧这些天需要使用同事的电脑进行开发,我们共用一个操作系统帐户。而各自远程个人仓库使用的 SSH 密钥并不一样,并且有权限隔离。那么存在的问题就是,应该怎么样对不同的远程个人仓库使用不同权限的SSH密钥,以及在代码提交时使用不同的 git 用户名和邮箱?
本文将介绍上述问题的处理办法。
根据 SSH 协议,我们需要生成密钥对,并把公钥推送到 GitLab 服务器上以作身份校验。
通过以下命令生成算法类型为 rsa,位数为 2048 的密钥对:
ssh-keygen -t rsa -b 2048
由于默认密钥 id_rsa 已经被占用,所以这里只能设置为其它名称,如 id_rsa_sing。并将私钥放置于当前操作系统用户家目录的 .ssh 目录下。如果是 Linux 系统,一般需要设置私钥权限为 600。公钥则需添加到 GitLab 中。
然后在 .ssh 目录下创建 config 文件,Linux 下权限同样设置为 600。config 文件的(windows)配置例子如下:
Host default
HostName 172.20.10.10
User git
Port 22
IdentityFile C:\Users\sing\.ssh\id_rsa
IdentitiesOnly yes
Host sing
HostName 172.20.10.10
User git
Port 22
IdentityFile C:\Users\sing\.ssh\id_rsa_sing
IdentitiesOnly yes
字段说明:
Host
自定义域名。
HostName
GitLab SSH 服务器地址。
User
SSH 登录用户名。GitLab 默认配置的用户名为 git。
Port
SSH 协议端口号,默认为 22,取决于 GitLab 配置。
IdentityFile
SSH 私钥文件位置。Linux 系统下如 ~/.ssh/id_rsa_sing。
IdentitiesOnly
是否只使用这里定义的私钥,而不是默认的私钥。
从上面的配置可以看到,HostName 是一样的,都是同一台 GitLab 服务器。Host 是自定义的,但它与请求地址关联,用于替换原来 GitLab 的地址。我们可以将新的地址添加到上游远程仓库地址中:
git remote add your_upstream_name git@sing:your_gitlab_account/your_project_name.git
然后在正常 git 操作时,就会提示你配置的路径下的私钥密码(如果有的话),如:
git push your_upstream_name your_branch_name
使用以下命令可以看到当前的 git 用户名和邮箱:
git config -l
如果不更改,则我的代码提交将会显示这里设置的用户名和邮箱。可以使用以下命令修改当前仓库的 git 用户名和邮箱:
git config user.name "leeguangxing"
git config user.email "leeguangxing@foxmail.com"
要了解更多关于提交时修改 git 用户名和邮箱的说明,请点击这里。