如何修改历史的commit,用git-filter-repo

首先使用这个命令安装 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的用法,如果需要更深入的学习,可参考这几个文档进行学习:

  1. 官方文档
  2. 修改commit时间
  3. 屏蔽敏感数据
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容