介绍

git filter-repo 是一个多功能的重写历史工具。其中包含了市面上其他工具没有的功能。

而且与官方工具 git filter-branch 相比性能强很多且功能更多,并且现在已经被 Git 官方推荐为替代使用的第三方工具写在文档中:Git - git-filter-branch Documentation

一个工具是否好用是由细节决定的,这个工具做了很多细致的工作,从而适应了大多数情况,推荐有兴趣的人可以阅读 Design rationale behind filter-repo

意义

其实本质上 Git 仓库是一个完整的版本控制数据库,但有时需要将其中的内容进行改写,比如:

  1. 由于提交不规范同一个作者有多个名字与邮箱,需要统一提交作者信息
  2. 将仓库的一个子目录作为一个库添加到另一个项目中,同时保留所有历史

官方仓库 git-filter-repo/contrib/filter-repo-demos 给了一些示例:在仓库历史的开头增加版权信息、删除所有在 gitignore 规则中的修改等等。

环境

  • macOS 11.7.1
  • Python 3.9.5
  • git-filter-repo v2.38.0

安装

这是一个单文件 Python 程序,因此可以直接执行 python3 git-filter-repo。但是强烈推荐将安装目录配置添加到环境变量 PATH,这样可以直接使用 git filter-repo 来执行。

拆分

在拆分前建议克隆一个新的仓库开始,这里以一个 Unity 项目举例:

1
git filter-repo --path README.md --path Assets