发现github还一直绑着qq邮箱,但是qq邮箱用的比较少所以重新绑定了Google邮箱, 但删掉了qq邮箱后居然发现自己之前的contribution record都丢失了,因为 GitHub 识别 commit 是否属于你的关键依据是 提交记录中的邮箱地址是否与你 GitHub 账户的邮箱绑定一致。
解决方案
1. 更新本地 Git 配置
确保你的本地 Git 配置使用正确的邮箱:
git config --global user.email "your-qq-email@qq.com"
2. 修改git历史
将需要找回commit记录到项目都clone到同一个文件夹下
git clone [your-repository]
在这个文件夹下运行脚本(把脚本中的配置改为你自己的username和email)
#!/bin/bash
# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Git配置
OLD_EMAIL=[your_old_email]
CORRECT_NAME=[your_correct_name]
CORRECT_EMAIL=[your_correct_email]
echo -e "${BLUE}开始修复Git历史记录...${NC}"
echo -e "${YELLOW}旧邮箱: $OLD_EMAIL${NC}"
echo -e "${YELLOW}新用户名: $CORRECT_NAME${NC}"
echo -e "${YELLOW}新邮箱: $CORRECT_EMAIL${NC}"
echo ""
# 遍历所有项目文件夹
for dir in */; do
project_name=${dir%/}
echo -e "${BLUE}===========================================${NC}"
echo -e "${BLUE}处理项目: $project_name${NC}"
echo -e "${BLUE}===========================================${NC}"
# 进入项目目录
if cd "$project_name" 2>/dev/null; then
# 检查是否是Git仓库
if [ ! -d ".git" ]; then
echo -e "${YELLOW}跳过 - 不是Git仓库${NC}"
cd ..
continue
fi
# 检查是否有远程仓库
if ! git remote get-url origin >/dev/null 2>&1; then
echo -e "${YELLOW}跳过 - 没有远程仓库${NC}"
cd ..
continue
fi
echo -e "${YELLOW}开始修复Git历史...${NC}"
# 设置环境变量以消除filter-branch警告
export FILTER_BRANCH_SQUELCH_WARNING=1
# 执行git filter-branch
git filter-branch --env-filter "
if [ \"\$GIT_COMMITTER_EMAIL\" = \"$OLD_EMAIL\" ]
then
export GIT_COMMITTER_NAME=\"$CORRECT_NAME\"
export GIT_COMMITTER_EMAIL=\"$CORRECT_EMAIL\"
fi
if [ \"\$GIT_AUTHOR_EMAIL\" = \"$OLD_EMAIL\" ]
then
export GIT_AUTHOR_NAME=\"$CORRECT_NAME\"
export GIT_AUTHOR_EMAIL=\"$CORRECT_EMAIL\"
fi
" --tag-name-filter cat -- --branches --tags
# 检查filter-branch是否成功
if [ $? -eq 0 ]; then
echo -e "${GREEN}Git filter-branch 成功完成${NC}"
echo -e "${YELLOW}检查最近的提交记录:${NC}"
git log --oneline --format="%h %an <%ae> %s" -5
echo ""
echo -e "${YELLOW}是否要推送到GitHub? (y/n): ${NC}"
read -r response
case $response in
[yY]|[yY][eE][sS])
echo -e "${YELLOW}正在强制推送到GitHub...${NC}"
git push --force --tags origin 'refs/heads/*'
if [ $? -eq 0 ]; then
echo -e "${GREEN}成功推送到GitHub!${NC}"
else
echo -e "${RED}推送失败!${NC}"
fi
;;
*)
echo -e "${YELLOW}跳过推送${NC}"
;;
esac
else
echo -e "${RED}Git filter-branch 失败!${NC}"
fi
cd ..
else
echo -e "${RED}无法访问目录: $project_name${NC}"
fi
echo ""
done
echo -e "${BLUE}===========================================${NC}"
echo -e "${GREEN}所有项目处理完成!${NC}"
echo -e "${BLUE}===========================================${NC}"
3.找回commit record
可以看到contribution被重新加载回来了