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

首先使用這個(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í)間

image.png

比如圖片中的最早的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:


image.png

這樣就可以修改了,十分的方便,原理就是這樣,具體要怎么操作,都可以通過(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)題呢?

還有敏感信息的內(nèi)容

這是我想把這個(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í):

  1. 官方文檔
  2. 修改commit時(shí)間
  3. 屏蔽敏感數(shù)據(jù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容