Git 更改 commit 历史

之前我在 git config 中都会将 Email 地址设置成我当前使用的电脑的名字,比如我当前使用的电脑名字叫 tourcoder,所以我就会设置成 tc@tourcoder.local,命令是 git config --global user.emai tc@tourcoder.local。最近因为工作需要,我需要将 Email 设置成真实的地址,比如我这里改成了 tc@****,除了在全局变量中做了修改,还要修改之前的历史 commit 记录中的 Email 地址。于是我执行了脚本命令

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "tc@tourcoder.local" ];
    then
        GIT_AUTHOR_EMAIL="tc@@****";
    fi
        git commit-tree "$@";
        ' -f HEAD

命令执行,且自动更改后,执行 git log 检查得到如下结果

通常情况下,所有的历史 commit 记录的 Email 地址都更改过来了,但是有时候会遇到一个问题,我们挑选任意一个 commit 查看,比如最上面的这个,执行命令 git show --pretty=format:"%ce" 424c8b2089742b0965089b3317670c6152c2ed2c,oops,并没有更改过来,还是 tc@tourcoder.local

那是因为需要更改 GIT_COMMITTER_EMAIL,即在上面的脚本中加入 GIT_COMMITTER_EMAIL 的内容即可。

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "tc@tourcoder.local" ];
    then
        GIT_AUTHOR_EMAIL="tc@***";
        GIT_COMMITTER_EMAIL="tc@***";
    fi
        git commit-tree "$@";
        ' -f HEAD

执行脚本,完成。在 git 手册中有一篇关于 [git filter branch](https://git-scm.com/docs/git-filter-branch) 的文章中提到,还可以通过 --env-filter 来修改,脚本命令是

git filter-branch --env-filter '
    if "$GIT_AUTHOR_EMAIL" = "tc@tourcoder.local"
    then
        GIT_AUTHOR_EMAIL=tc@***
        GIT_COMMITTER_EMAIL=tc@***
    fi
' -- --all

也能达到一样的效果,更多的用法,可以去查看上面的文章。

小帖士:

  • Git 中如何删除一个远程的分支? 执行命令 git push origin :branch_name,这个命令有点很无厘头,别忘了 : 号。

  • Git 走代理

    git config --global http.proxy 'socks5://127.0.0.1:port' 
    git config --global https.proxy 'socks5://127.0.0.1:port' 
    
  • Git 获取远程分支

    git checkout -b local_branch origin/remote_branch
    
  • Git 增加 push 体积

    git config --global http.postBuffer 524288000
    
  • Git --allow-unrelated-histories

请注意:这里的内容都是原创,你可以免费阅读,但拒绝所有其他任何形式的转载,谢谢配合。如果你发现文章中有错误,请发邮件给我,非常感谢。

The Copyright of all posts & photos posted in tourcoder.com is belong to tourcoder.com. You can read them for free, but you may not reuse anything therein without my permission.