踩坑 | Github 解决 Contribution 不增加

前言

今天打开 github,突然发现我的 contribution 一直没增加,找了半天原因,发现是 github 开启了隐私邮箱,隐私邮箱是使用基于 ID 的 Github-provided noreply 地址,即 <ID + [email protected]> ,然后很显然,这个和不开启隐私邮箱是不同的,然后由于 github 是根据邮箱来增加 Contribution 的,所以自然就加不上了

隐私邮箱开启位置:

个人设置 -> email -> Keep my email address private

开启隐私邮箱

最好养成每次切换代码库时检查 author 信息的习惯

查看 git 用户配置

1
2
// 查看全局配置
git config --global -l

修改 git 用户配置

1
2
3
4
5
6
7
// 设置全局
git config --global user.name "Author Name"
git config --global user.email "Author Email"

// 或者设置本地项目库配置
git config user.name "Author Name"
git config user.email "Author Email"

修改历史 commit 用户信息(用户名和邮箱)

变基

1
2
// 查看从 HEAD 开始的前面的 log
git rebase -i HEAD~n

按 i 切换为 INSERT 模式,将需要修改的 commit 前面的 pick 改成 edit

按 ESC 退出 INSERT 模式,输入 :wq 保存并退出

然后执行

1
2
git commit --amend --author="author <[email protected]>"
git rebase --continue

这样就保存了一组 log,如果需要多个 commit 修改,则进行多次重复操作

最后再强推上去就行了

1
git push -f

这种方法可以修改单个,也可以多个修改,但修改多个 commit 的效率较低且不能修改最初始的 commit,变基需要一个基点才能变,所以就有第二种方法

git filter-branch

这个指令就很无敌,可以进行批量修改,只需要定义一个过滤器,通过 shell 脚本的运行来完成修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "[Your Old Email]" ]
then
    cn="[Your New Author Name]"
    cm="[Your New Email]"
fi
if [ "$GIT_AUTHOR_EMAIL" = "[Your Old Email]" ]
then
    cn="[Your New Author Name]"
    cm="[Your New Email]"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"

新建一个 .sh 文件,复制粘贴上述代码,进行相应的修改,放在 clone 下来的根目录下,运行脚本就行

踩坑

最初初始化 git 配置的时候不知道咋的在用户配置的用户名和邮箱都加了个单引号,然后各种学习如何在 shell 命令中添加单引号的判断,这里做一个记录

shell 中双引号 "" 中才能进行变量的引用,单引号 ’’ 不会改变内部的字符,所以如果引用单引号可以使用 ’’’’ 两对单引号(不是一对双引号)

引用了单引号我本来以为就好了,结果运行脚本依旧没用,折腾了好久也没找到相应的解决方案,然后通过 echo 命令打印 log 中的邮箱,发现单引号是中文的,找到了问题所在,然后修改脚本把双引号换成了一对英文单引号嵌套中文单引号

记得一定要在 commit 前查看配置信息,注意 commit log 中用户信息的正确格式是 “user.name <user.email>”,中间没有任何单双引号

折腾个这个还把 shell 的语法差不多学完了…