忘记该忘记的,记住该记住的 —— git filter-branch


Pro git 中把 filter-branch 称为 核弹,让人难以忘记,也充分说明了该命令的威力。

问题场景

  1. 在你的开源仓库中提交了,一个数据库的配置文件。
  2. 同事在仓库中把 node_modules目录提交到仓库中,并且这个目录还被后续更新过。

解决方案:

可以使用filter-branch实现上述需求。

从每一个提交移除一个文件:

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

从每一个提交移除一个目录:

git filter-branch --tree-filter 'rm -rf node_modules' HEAD

限制移除范围:

git filter-branch --tree-filter 'rm -rf node_modules' HEAD~30..HEAD

全局修改邮箱地址:

git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
    then
      GIT_AUTHOR_NAME="Scott Chacon";
      GIT_AUTHOR_EMAIL="schacon@example.com";
      git commit-tree "$@";
        else
        fi' HEAD

详细参数:

  • --tree-filter 表示修改文件列表

  • --msg-filter 表示修改提交信息,原提交信息从标准输入读入,新提交信息输出到标准输出

  • --commit-filter 针对提交信息进行修改

  • --prune-empty 表示如果修改后的提交为空则扔掉不要。

  • -f是忽略备份。不加这个选项第二次运行这个命令时会出错,意思是 git 上次做了备份,现在再要运行的话得处理掉上次的备份。

  • --all是针对所有的分支。

  [^依云:初次使用 git 的“核弹级选项”:filter-branch]: https://blog.lilydjwg.me/2011/4/22/tried-the-nuclear-option-filter-branch-of-git-the-first-time.26331.html
title: 忘记该忘记的,记住该记住的 —— git filter-branch
date: 2020-12-01 22:00:00
categories: 工具
tags: git
img: ../../coverImages/git.jpg
typora-root-url: ../../images

Pro git 中把 filter-branch 称为 核弹,让人难以忘记,也充分说明了该命令的威力。

问题场景

  1. 在你的开源仓库中提交了,一个数据库的配置文件。
  2. 同事在仓库中把 node_modules目录提交到仓库中,并且这个目录还被后续更新过。

解决方案:

可以使用filter-branch实现上述需求。

从每一个提交移除一个文件:

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
git filter-branch --tree-filter 'rm -rf node_modules' HEAD
git filter-branch --tree-filter 'rm -rf node_modules' HEAD~30..HEAD
git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
    then
      GIT_AUTHOR_NAME="Scott Chacon";
      GIT_AUTHOR_EMAIL="schacon@example.com";
      git commit-tree "$@";
    else
    fi' HEAD

详细参数:

全局修改邮箱地址:

限制移除范围:

从每一个提交移除一个目录:

title: 忘记该忘记的,记住该记住的 —— git filter-branch
date: 2020-12-01 22:00:00
categories: 工具
tags: git
img: ../../coverImages/git.jpg
typora-root-url: ../../images

Pro git 中把 filter-branch 称为 核弹,让人难以忘记,也充分说明了该命令的威力。

问题场景

  1. 在你的开源仓库中提交了,一个数据库的配置文件。
  2. 同事在仓库中把 node_modules目录提交到仓库中,并且这个目录还被后续更新过。

解决方案:

可以使用filter-branch实现上述需求。

从每一个提交移除一个文件:

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
git filter-branch --tree-filter 'rm -rf node_modules' HEAD
git filter-branch --tree-filter 'rm -rf node_modules' HEAD~30..HEAD
git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
    then
      GIT_AUTHOR_NAME="Scott Chacon";
      GIT_AUTHOR_EMAIL="schacon@example.com";
      git commit-tree "$@";
    else
    fi' HEAD

详细参数:

全局修改邮箱地址:

限制移除范围:

从每一个提交移除一个目录:

title: 忘记该忘记的,记住该记住的 —— git filter-branch
date: 2020-12-01 22:00:00
categories: 工具
tags: git
img: ../../coverImages/git.jpg
typora-root-url: ../../images

Pro git 中把 filter-branch 称为 核弹,让人难以忘记,也充分说明了该命令的威力。

问题场景

  1. 在你的开源仓库中提交了,一个数据库的配置文件。
  2. 同事在仓库中把 node_modules目录提交到仓库中,并且这个目录还被后续更新过。

解决方案:

可以使用filter-branch实现上述需求。

从每一个提交移除一个文件:

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
git filter-branch --tree-filter 'rm -rf node_modules' HEAD
git filter-branch --tree-filter 'rm -rf node_modules' HEAD~30..HEAD
git filter-branch --commit-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
    then
      GIT_AUTHOR_NAME="Scott Chacon";
      GIT_AUTHOR_EMAIL="schacon@example.com";
      git commit-tree "$@";
    else
    fi' HEAD

文章作者: Yao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Yao !
 上一篇
回到过去的一万种方式 —— git 时光机 回到过去的一万种方式 —— git 时光机
时光无法倒流,git 却让我们有机会修改历史 查看修改历史,代码回退是开发中经常用到的命令,但是很多时候,我们并不是非常明确其中的区别。这篇博客尝试说清楚其中的区别。 git checkoutgit checkout hotfix //
2020-12-02
下一篇 
重置过去,面向未来 —— git rebase 重置过去,面向未来 —— git rebase
git rebase 是一个危险的操作,如果不能熟练掌握,请不要使用它。(它并不是不可或缺的) git rebase 是一个平常使用较少的一个命令,这次准备分享 git ,把一系列不常用的 git 命令,都熟悉一下。简单明了,不深究原理
2020-11-30
  目录