简介
git filter-repo 是一个快速而灵活的工具,用于修改 Git 仓库的历史记录。
它可以用于许多任务,例如:
- 重写提交历史记录
- 清理旧的大型文件
- 将仓库拆分成几个小仓库
- 将多个仓库合并成一个
- 移除密码和其他敏感数据
Git-Filter-Repo的一些特性是:
- 处理速度快
- 灵活,可配置性高
- 保留提交的作者和时间戳信息
- 可以对文件进行重命名和重构
- 可以对提交信息进行修改和删除
- 可以对提交信息进行搜索和替换
- 可以使用Python脚本进行自定义修改
安装
MacOS 使用 homebrew 包管理工具进行安装,命令如下,其他方式参考官方文档
1 | brew install git-filter-repo |
使用示例
移除文件
假设我们有一个包含敏感文件的 Git 仓库,需要将这些文件从提交记录中移除。
1 | git filter-repo --path sensitive.txt --invert-paths |
这个命令会将所有包含 sensitive.txt 文件的提交从历史记录中移除。
修改提交信息
修改指定 commit 的 message 信息
1 | git-filter-repo --message-callback 'return message.replace(b"old commit message", b"new commit message")' |
其中,new commit message
是你想要修改的新 commit message,old commit message
是你想要修改的旧 commit message。
替换指定的字符串
例如我们的项目中,存在密码等敏感信息,我们希望将敏感信息删除。
首先我们需要创建文件,按照如下格式将替换文本的相关内容填写其中,如文件名为 expressions
1 | password123==>****** |
以上内容表示,将 password123
替换为 ******
,执行下面的命令进行替换
1 | git filter-repo --replace-text ../expressions |
修改 commit 信息中的 user 与 mail
新建 mailmap 文件,如文件名为 my-mailmap,文件内容格式如下:
1 | liuqitoday <liuqitoday@163.com> liuqitech <liuqitech@email.com> |
执行下面的命令便会帮我们批量将commit 历史中的作者信息 liuqitech <liuqitech@email.com
> 替换为 liuqitech <liuqitech@email.com>
1 | git filter-repo --mailmap ../my-mailmap |
重命名文件
如将 README.md 重命名为 README_1.md
1 | git filter-repo --path-rename README.md:README_1.md |
提取子目录
有时候,我们只需要一个 Git 仓库中的某个子目录。
1 | git filter-repo --path path/to/subdir |
这个命令将会把 path/to/subdir
目录提取出来,形成一个新的 Git 仓库。
提取子目录下的所有文件
如将 path/to/subdir
目录下的所有文件调整到根目录下
1 | git filter-repo --subdirectory-filter path/to/subdir |