zoukankan      html  css  js  c++  java
  • Git 修改历史 commits 中的用户名和邮箱

    一、作用

    • 修改某个仓库历史 commit 的用户 name 和 email 信息。
    • 将历史提交记录中的指定 name/email 修改为新的 name/email。

    二、步骤

    • 确认本地全局邮箱/用户名
    • 查看仓库的历史提交信息
    • 批量修改历史记录中的信息
    • 将修改结果推送到远程

    1. 确认本地全局邮箱/用户名

    使用下面两个命令查看 git 在本地的全局邮箱和用户名。

    bash
    git config user.name
    git config user.email
    

      

    如果需要修改 git 在本地的全局邮箱和用户名,执行下面的命令。

    bash
    git config --global user.name "输入你的用户名"
    git config --global user.email "输入你的邮箱"
    

      

    现在我们已经设置好了本地 git 的 user.name 和 user.email 信息。

    2. 查看仓库的历史提交信息

    git clone 你要修改的仓库,进入该仓库目录,打开 git bash 界面,执行 git log 命令查看历史提交信息(重点关注 Author)。

    3. 批量修改历史记录中的信息

    打开一个文本编辑器,粘贴下面代码。
    然后把 OLD_EMAIL,CORRECT_NAME,CORRECT_EMAIL 改成自己的新旧邮箱用户名。

    bash
    git filter-branch -f --env-filter '
    OLD_EMAIL="原来的邮箱"
    CORRECT_NAME="现在的名字"
    CORRECT_EMAIL="现在的邮箱"
    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
    

      

    回到 git bash 界面,复制粘贴上面的代码并按回车执行。
    如果 commit 记录比较多的话执行的时间会比较长。

    等待执行完成后,再查看 git log 可以看到已经修改成功。

    特殊情况:
    如果上面的批量修改命令执行失败的话,执行一下这段命令:

    bash
    git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
    

      

    再次复制粘贴批量修改的代码并按回车执行。

    4. 将修改结果推送到远程

    这时候虽然本地修改成功了,但是你还没有推送到远程。
    所以再执行一下命令:

    bash
    git push origin --force --all
    

      

    去看一下 Github 你就会发现之前的提交记录中,name 和 email 信息都更新了。

    三、Linux/Mac下可以写个脚本

    在项目根目录下创建 git-email.sh,写入下面这段代码:

    bash
    #!/bin/sh
    
    git filter-branch --env-filter '
    
    OLD_EMAIL="原来的邮箱"
    CORRECT_NAME="现在的名字"
    CORRECT_EMAIL="现在的邮箱"
    
    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
    

      

    然后需要赋予执行权限:

    bash
    chmod +x git-email.sh
    

      

    执行一下这个 .sh 文件:

    bash
    ./git-email.sh
    

      

    git log 检查修改成功后,最后别忘了推送到远程仓库。

    我的GitHub:https://github.com/lelelongwang
  • 相关阅读:
    键盘钩子在C#中的设计
    C++基础(学习笔记)
    WinCE5.0移动平台开发笔记(OpenNETCF.Desktop.Communication连接和断开使用心得)
    the underlying connection was closed:the server committed a protocol violation
    WinCE5.0移动平台开发笔记(c#中使用多线程访问winform中控件的若干问题(zt))
    WinCE5.0移动平台开发笔记(.Net主线程扑捉子线程中的异常)
    配置ActiveX控件在网页中下载安装
    C#值类型和装箱
    磁卡、条码卡、IC卡、CPU卡、RFID等常识(zt)
    CAB压缩工具安装(右键生成CAB压缩包)
  • 原文地址:https://www.cnblogs.com/longjunhao/p/15005916.html
Copyright © 2011-2022 走看看