0%

git多账号配置

git多账号配置

[TOC]

Snipaste_2021-04-26_21-03-51.png

一、背景

​ 最近看了一些博客都是在推荐技术新人通过写博客的方式记录学习到的知识点和遇到的问题,好记性不如烂笔头,我也尝试开始写博客,在通过github gitpage搭建博客的时候发现需要在一台电脑中配置两个git账号,之前都是全局配置公司的gitlib账号。记录一下整个的配置过程,过程中也踩了不少坑。

二、需求

​ 在电脑上配置两个git账号,一个是gitlib账号用来工作使用,一个是github账号用来博客推送。

三、配置

3.1 清除全局配置
1
2
3
4
5
6
# 查看全局配置;若存在用户名和邮箱则清除
git config --global --list

# 清除全局用户名和邮箱
git config --global --unset user.name
git config --global --unset user.email
3.2 生成秘钥

生成两个秘钥,一个用于公司工作,一个用于博客。

1
2
# 一路回车即可
ssh-keygen -t rsa -C "邮箱"

我这边是把生成的两个秘钥对(总共四个文件)分类在两个文件夹下(companyxiaocaioniaoya)。

1
2
3
xiaocainiaoya@macBook-Pro-3> cd ~/.ssh
xiaocainiaoya@macBook-Pro-3/.ssh>ls
company config known_hosts xiaocainiaoya

生成之后分别把.pub后缀公钥放置到远程服务器的SSH keys中。

3.3 秘钥添加到本地
1
ssh-add ~/.ssh/company/id_rsa_company
3.4 创建config文件

一下是我的config配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#公司的 gitlib
# Host 可以随便起,只是一个命名而已
Host company
HostName xx.xx.xx.xx:xxx
User xxx
PreferredAuthentications publickey
# 绝对路径
IdentityFile ~/.ssh/company/id_rsa_company

# xiaocainiaoya github
Host github
HostName github.com
User xiaocainiaoya
IdentityFile ~/.ssh/xiaocainiaoya/id_rsa_xiaocainiaoya
3.5 测试是否可以连接
1
2
3
4
5
# 直接就是这个命令
> ssh -T git@github
Hi xiaocainiaoya! You've successfully authenticated, but GitHub does not provide shell access.
# 原来还以为要替换成自己的用户名
# ssh -T xiaocainiaoya@github
3.6 配置local级别用户名和邮箱

由于本地配置了多账号,在提交时根据不同的地址采用不同的用户名和邮箱,所以需要进入到某个项目配置当前项目的用户名和邮箱信息。

1
2
git config --local user.name "xiaocainiaoya"
git config --local user.email "xiaocainiaoya@foxmail.com"

四、问题

在配置完成之后,也测试可以提交之后没有太多关注具体的提交信息,在使用一段时间之后发现博客的提交记录中用户名是我的名字。由于用户名的级别system>global>local。在添加了local配置之后,后续提交的记录上用户名和邮箱正常了,那之前提交的那些用户名和邮箱怎么改?

git filter-branch

git中最猛的后悔药,没有把握慎用。

1
2
3
4
5
6
7
8
9
10
11
git filter-branch -f --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "已提交的用户名" ];
then
GIT_COMMITTER_NAME="想要变成的用户名";
GIT_AUTHOR_NAME="$GIT_COMMITTER_NAME";
GIT_COMMITTER_EMAIL="想要变成的邮箱";
GIT_AUTHOR_EMAIL="$GIT_COMMITTER_EMAIL";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD

执行命令之后会发现用户名和邮箱都已经修改为想要变成的样子。再执行强制推向远程,要确保已经是最新的HEAD否则会覆盖他人编写的代码。(HEAD可以修改为HEAD~5..HEAD表示最近的5个提交)

1
git push --force

git filter-branch还有很多的其他的用法,有一个我觉得日常中可能会使用到的。

在某次提交时提交了某个大文件或者敏感文件,虽然可以在下次提交中删除该文件,或者把该文件添加到.gitignore中,但是如果回溯到某个提交时那个文件还是存在,现在想要将所有历史的提交中移出改文件。

1
2
3
# 中间引号那一段是shell脚本
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path'
--prune-empty --tag-name-filter cat -- --all

git filter-branch执行之后都需要强制推向远程,可能会覆盖他人的提交,所以称为最猛的后悔药。


博客地址:https://xiaocainiaoya.github.io/

联系方式:xiaocainiaoya@foxmail.com

扫码

-------------本文结束感谢您的阅读-------------