引言 #
当 Github 上的关联邮箱修改之后,会发现原来的 commit 在 GitHub 的 Contribution 里面不见了 😅 ,同时本地提交的 commit,也不会在 Contribution 里面显示。
根本原因就是本地的邮箱和用户名和 Github 上的邮箱不一致,本地的邮箱和用户名还是之前的邮箱用户名。
那么下面就来解决这个问题。
修改本地邮箱和用户名 #
查看全局配置的用户名和邮箱
全局配置是对所有仓库生效的设置。可以使用以下命令查看全局配置的用户名和邮箱:
git config --global user.name
git config --global user.email
下面我们要把 commit 时的用户名和邮箱地址改为与 Github 上设置的一致,我们可以通过下面的命令:
git config --global user.name <your username for Github>
git config --global user.email <your email address for Github>
修改后,再提交 commit ,就会看到 commit 被记入 Contribution 了。
找回之前提交的 Contriubtion #
现在我们需要找回之前提交的 commit。
1. 查看当前本地仓库中的提交: #
git shortlog 命令可以对所有提交的作者进行汇总:
git shortlog -s -e
- s:显示每个作者的提交数量
- e:显示作者的电子邮件地址
此时本地仓库应该显示之前邮箱的 commit 数量,并没有新邮箱的 commit,这就是 Github 上不显示 contribute 的原因。
所以我们需要逐个仓库进行修改之前提交的 commit (的邮箱和用户名)。
你想恢复几个仓库的 contribute,就重复几次下面的步骤。
2. 将要修改的repo克隆到本地 #
git clone --bare <the repo address>
git –bare 命令,用于克隆一个裸仓库(bare repository)。裸仓库是一种特殊的 Git 仓库,它只包含 Git 的版本控制数据,而不包含工作目录中的文件。
3. 将命令行的当前目录切换到新克隆的库下 #
cd <the repo path>
4. 编写脚本 #
根据你的信息修改以下变量,运行脚本。
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="需要被替换的邮箱"
NEW_NAME="新的用户名"
NEW_EMAIL="新的邮箱"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$NEW_NAME"
export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$NEW_NAME"
export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
5. 再次查看查本地仓库(bare repo)中的提交: #
重复 第1步
git shortlog -s -e
此时应该能看到,之前的邮箱和用户名,已经被改为了新的邮箱和用户名。
6. 把正确历史push到Github上 #
把修改好的本地历史信息 push 到 Github 上,之后就可以在网站上看到丢失的 Contribution 信息 😉。
git push --force --tags origin 'refs/heads/*'
-
git push:将本地的提交推送到远程仓库。
-
force 或 -f:强制推送。使用此选项会覆盖远程仓库中的历史记录,无论远程仓库的状态如何。这通常用于重写远程分支的历史,比如在你使用 git rebase 或 git filter-branch 之后。需要小心使用,以免覆盖他人的工作。
-
tags:推送本地所有的标签到远程仓库。标签是对特定提交的引用,通常用于标记版本。
-
origin:远程仓库的名称。默认情况下,origin 是克隆仓库时 Git 自动赋予远程仓库的名称。
-
‘refs/heads/’:表示本地的所有分支。refs/heads/ 是 Git 中保存分支的引用路径, 是通配符,表示所有分支。
额外问题 #
此时已经解决了修改邮箱之后,历史 commit 丢失的问题。
但是当在我之前本地的仓库中(非刚才 clone 的 bare 仓库),输入 git log,发现还是之前的 commit 信息 🙃。
其实就是因为没有更新到远程仓库的信息。
此时可以选择
git pull origin master --allow-unrelated-histories
会有冲突,解决冲突。
或者选择更简单的方法 【比较推荐】:
-
重置本地仓库
-
强制拉取远程仓库的最新历史
git fetch origin
git reset --hard origin/main
此时本地仓库的历史提交信息也更新了 🥰