跳过正文
  1. 归档/

Github 邮箱更改之后

·1348 字·3 分钟· loading · loading · ·
技术 Github
White Liu
作者
White Liu
江湖儿女江湖见,神仙之外有神仙
目录

Github Action

引言
#

当 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

会有冲突,解决冲突。

或者选择更简单的方法 【比较推荐】

  1. 重置本地仓库

  2. 强制拉取远程仓库的最新历史

确定本地的更改已经保存!
git fetch origin
git reset --hard origin/main

此时本地仓库的历史提交信息也更新了 🥰

参考资料
#

  1. GitHub 修改 Commit 用户名和邮箱

  2. 解决Github的Contribution没有增加的问题

相关文章

关于 Contribution 的那些事
·4023 字·9 分钟· loading · loading
技术 开源 Github
Github Action + 基于 Github Page Blog 自动发布
·2114 字·5 分钟· loading · loading
技术 Github Github Action
一些有趣的文章(技术篇)
·34 字·1 分钟· loading · loading
链接🔗 转发
About
·40 字·1 分钟· loading · loading