首先使用这个命令安装 git-filter-repo
版本要求:python3 >= 3.5 | git >= 2.22.0
pip3 install git-filter-repo
安装成功以后,找到一个带有git仓库的项目,可以输入在terminal输入
git filter-repo --commit-callback '
from pprint import pprint
pprint(commit.__dict__)
print("----")
'
在控制台可以看到每条详细的commit信息:
{'author_date': b'1600156126 +0800',
'author_email': b'24******@qq.com',
'author_name': b'Rian Man',
'branch': b'refs/heads/master',
'committer_date': b'1600156126 +0800',
'committer_email': b'24*****@qq.com',
'committer_name': b'Rian Man',
'dumped': 0,
'encoding': None,
'file_changes': [<git_filter_repo.FileChange object at 0x10103a960>],
'id': 44,
'message': b'\xe5\xae\x9e\xe7\x8e\xb0\xe4\xb8\x80\xe4\xb8\xaa\xe6\x97\xa5\xe5'
b'\x8e\x86\xe7\xbb\x84\xe4\xbb\xb6\n',
'old_id': 44,
'original_id': b'03c5154822914227bf9920a70a9dea731e485560',
'parents': [43],
'type': 'commit'}
基于这个,我们可以更清晰的知道如何编写git-filter-repo的脚本。
然后有几个常见的场景可以用git-filter-repo来修改git历史会变得十分的方便。
特别提示:再使用git-filter-repo一定提前备份好仓库和主分支!!!
1. 更改已存在的历史commit的邮箱,用户名,提交时间

image.png
比如图片中的最早的commit,我想把它的邮箱和用户名更改成Jack0099@gmail.com 和 Jack.,提交时间改成2018年5月1号,我们如何操作
git filter-repo --commit-callback '
if commit.original_id == b"ae01e9c6ab0f2441f5cebb08f7d159cd0f629463":
commit.committer_name= b"Jack"
commit.author_name= b"Jack"
commit.author_email= b"Jack0099@gmail.com"
commit.committer_email= b"Jack0099@gmail.com"
commit.author_date = b"1525147298 +0800"
commit.committer_date = b"1525147298 +0800"
' --force
执行完再看下commit:

image.png
这样就可以修改了,十分的方便,原理就是这样,具体要怎么操作,都可以通过脚本来实现。更多信息内容可以参见 git-filter-repo仓库
2. 修改文件中敏感数据在历史commit中的记录
比如我们有时候在开发的时候,前期可能会把一些配置信息,比如某些特殊的密钥,token等等这些敏感信息留在了我们的文件中,后期虽然我们删除了,但是在历史的commit中还是可以找到这些信息,那么这时候我们该如何解决这个问题呢?

还有敏感信息的内容
这是我想把这个地方jjjkkk替换为一个通配符,以至于在所有的历史记录中也是这样,可以按照如下步骤操作:
- 新建一个txt文件,如replace.txt,
- 设置一下的内容:
jjjkkk==>******
规则就是 左边是我们需要替换的文本,==>右边就是替换之后的文本内容
- 然后在命令行执行, 我们就可以看到内容会被替换掉。
git filter-repo --replace-text ./replace.txt
- 最后在执行完以后执行仓库的
git remote add origin 原仓库地址
以上内容只是git filter-repo的用法,如果需要更深入的学习,可参考这几个文档进行学习: