0%

git filter-repo 简介

简介

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