首先使用這個(gè)命令安裝 git-filter-repo
版本要求:python3 >= 3.5 | git >= 2.22.0
pip3 install git-filter-repo
安裝成功以后,找到一個(gè)帶有g(shù)it倉(cāng)庫(kù)的項(xiàng)目,可以輸入在terminal輸入
git filter-repo --commit-callback '
from pprint import pprint
pprint(commit.__dict__)
print("----")
'
在控制臺(tái)可以看到每條詳細(xì)的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'}
基于這個(gè),我們可以更清晰的知道如何編寫git-filter-repo的腳本。
然后有幾個(gè)常見(jiàn)的場(chǎng)景可以用git-filter-repo來(lái)修改git歷史會(huì)變得十分的方便。
特別提示:再使用git-filter-repo一定提前備份好倉(cāng)庫(kù)和主分支?。?!
1. 更改已存在的歷史commit的郵箱,用戶名,提交時(shí)間

比如圖片中的最早的commit,我想把它的郵箱和用戶名更改成Jack0099@gmail.com 和 Jack.,提交時(shí)間改成2018年5月1號(hào),我們?nèi)绾尾僮?/p>
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
執(zhí)行完再看下commit:

這樣就可以修改了,十分的方便,原理就是這樣,具體要怎么操作,都可以通過(guò)腳本來(lái)實(shí)現(xiàn)。更多信息內(nèi)容可以參見(jiàn) git-filter-repo倉(cāng)庫(kù)
2. 修改文件中敏感數(shù)據(jù)在歷史commit中的記錄
比如我們有時(shí)候在開發(fā)的時(shí)候,前期可能會(huì)把一些配置信息,比如某些特殊的密鑰,token等等這些敏感信息留在了我們的文件中,后期雖然我們刪除了,但是在歷史的commit中還是可以找到這些信息,那么這時(shí)候我們?cè)撊绾谓鉀Q這個(gè)問(wèn)題呢?

這是我想把這個(gè)地方j(luò)jjkkk替換為一個(gè)通配符,以至于在所有的歷史記錄中也是這樣,可以按照如下步驟操作:
- 新建一個(gè)txt文件,如replace.txt,
- 設(shè)置一下的內(nèi)容:
jjjkkk==>******
規(guī)則就是 左邊是我們需要替換的文本,==>右邊就是替換之后的文本內(nèi)容
- 然后在命令行執(zhí)行, 我們就可以看到內(nèi)容會(huì)被替換掉。
git filter-repo --replace-text ./replace.txt
- 最后在執(zhí)行完以后執(zhí)行倉(cāng)庫(kù)的
git remote add origin 原倉(cāng)庫(kù)地址
以上內(nèi)容只是git filter-repo的用法,如果需要更深入的學(xué)習(xí),可參考這幾個(gè)文檔進(jìn)行學(xué)習(xí):