本文主要介紹了如何使用git-filter-repo修改commit歷史。
介紹
git-filter-repo是官方推薦用于修改commit歷史的小工具,詳情參見:https://github.com/newren/git-filter-repo/tree/main/contrib/filter-repo-demos。
依賴條件
要使用 git-filter-repo工具,需要做如下準備:
git >= 2.22.0 at a minimum
some features require git >= 2.24.0
python3 >= 3.5
下載
git clone https://github.com/newren/git-filter-repo.git
安裝
cd git-filter-repo/
sudo cp git-filter-repo /usr/local/bin
修改了提交的郵箱或者message之后會生成新的commit,分支也會指向新的commit,建議修改提交郵箱或者message之前,先創建新分支保存當前分支指向,例如git branch tmp。
修改提交郵箱
執行方式解析
以修改郵箱為例,該工具執行模式如下:
git-filter-repo --email-callback 'BODY'
會生成一個python call_back函數并被git-filter-repo調用。
def email_callback:
BODY
操作步驟
例如要將master分支的最近 2 個提交的郵箱后綴由alibaba-inc.com改為example.com則使用下述命令:
git-filter-repo --email-callback 'return email.replace(b"alibaba-inc.com", b"example.com")' --force --refs master~2..master
其中加 --force 是因為 git-filter-repo 默認只能對剛 clone 下來的倉庫進行修改,否則需要加 --force 強制進行。結果如下:
可以看到 master 分支的 commit 的郵箱后綴由alibaba-inc.com改為了example.com。注意,由于郵箱修改了,對應的 commit ID 也變了。
如需修改當前分支全部commit 的郵箱信息,則去掉master~2..master
直接使用以下命令:
git-filter-repo --email-callback 'return email.replace(b"alibaba-inc.com", b"example.com")' --force --refs master
修改提交 message
接著上一個示例,方法與修改提交郵箱相似,需使用--message-callback
命令,例如要將上述 master 分支最近 1 個 message 中的“3”改為”hi”:
git-filter-repo --message-callback 'return message.replace(b"3", b"hi")' --force --refs master~1..master
執行后可以看到①處最近 1 次提交的 message 已經從原來的“3”變成了“hi”:
高階版修改
例如期望在master分支最近 1 次提交message之前加上“bugfix: ”如何處理呢?請參考如下命令:
git-filter-repo --message-callback '
message=b"bugfix: " + message
return message
' --refs master~1..master --force
執行效果如下,可以看到②處的 message 自動增加了“bugfix:”前綴:
總之,無論是修改提交郵箱還是提交message都可以使用python編寫對應的call-back函數來定義修改規則。
更多高級功能,請參見 https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html。