更改github邮箱后找回丢失的commit记录

标签:
githubcontribution

发现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被重新加载回来了 猫咪图片

Last modified: