git filter-repo
是一個用于過濾和清理 Git 倉庫歷史的工具,它可以高效地批量修改提交歷史中的文件內容、刪除文件、重命名文件以及進行其他歷史重構操作。相較于 git filter-branch
,它通常更快且更易于使用。
以下是一個基本示例,說明如何使用 git filter-repo
來刪除倉庫中特定的大文件:
安裝 git-filter-repo
-
首先確保你已安裝 Python,并且可以通過 pip(Python 的包管理器)來安裝軟件包。如果沒有安裝 Python 和 pip,需要先安裝它們。
-
使用 pip 安裝
git-filter-repo
:
python -m pip install --user git-filter-repo # 對于個人用戶安裝
# 或者全局安裝(可能需要管理員權限)
python -m pip install git-filter-repo
安裝完成后,你可以直接使用 git-filter-repo
命令。但由于它并非 Git 內置命令,你需要在終端中直接調用它的路徑或者將它的安裝目錄添加到系統 PATH 環境變量中。例如,在 Unix/Linux 系統中,如果 git-filter-repo
已經被安裝在 ~/.local/bin/
目錄下,你可以通過如下命令臨時添加到 PATH 中:?
export PATH=$PATH:~/.local/bin/
win11
C:\Users\w8\AppData\Roaming\Python\Python311\site-packages
?
既然 git-filter-repo
已經安裝完畢,接下來你可以直接在命令行中使用它。但是請注意,在 Windows 系統中,可能需要將 git-filter-repo
的安裝路徑添加到系統的 PATH 環境變量,以便能在任何目錄下執行這個命令。
若要在當前終端會話中臨時添加到 PATH,可以運行以下命令(請替換實際的路徑):
set PATH=%PATH%;C:\Users\w8\AppData\Roaming\Python\Python311\Scripts
?
如果希望永久生效,你需要編輯系統的環境變量設置:
-
右鍵點擊“計算機”或“此電腦”,選擇“屬性”。
-
在左側菜單欄選擇“高級系統設置”。
-
在“系統屬性”窗口中點擊“環境變量”按鈕。
-
在“系統變量”區域找到名為
Path
的變量,選中后點擊“編輯”。 -
在“編輯環境變量”窗口中,點擊“新建”按鈕,然后添加
C:\Users\w8\AppData\Roaming\Python\Python311\Scripts
這個路徑。 -
點擊“確定”保存所有更改。
完成以上步驟后,你應該能夠在命令行中直接運行 git filter-repo
命令了
刪除倉庫歷史中的大文件
假設你想刪除歷史記錄中所有包含名為 large_file.txt
的文件,并且你知道這個文件存在于所有的提交中。
-
首先備份你的倉庫,以防萬一:
1cp -r your_repo your_repo_backup
-
進入要處理的倉庫目錄:
1cd your_repo
-
使用
git filter-repo
刪除指定文件:1git filter-repo --force --invert-paths --path large_file.txt
參數解釋:
-
--force
:允許覆蓋當前倉庫。 -
--invert-paths
:保留不匹配路徑的提交,這里是反選,即刪除匹配路徑的文件。 -
--path large_file.txt
:指定要從歷史中刪除的文件名。
-
-
清理并優化本地倉庫:
1git reflog expire --all --expire-unreachable=now --update-reflogs 2git gc --prune=now --aggressive
-
推送更改到遠程倉庫(如果必要的話):
1git push origin --force --all 2git push origin --force --tags
注意:由于你改變了歷史記錄,所以需要用
--force
強制推送,并通知協作者他們需要重新克隆更新后的倉庫。
其他高級用法
除了刪除文件外,git filter-repo
還可以實現更多的功能,例如:
-
刪除符合某種模式的所有文件:
1git filter-repo --force --path-glob '*.zip'
-
替換文件內容:
1git filter-repo --replace-text <replacement-file>
在
<replacement-file>
中定義替換規則。 -
根據大小過濾文件:
1git filter-repo --strip-blobs-bigger-than 10M
刪除大于10MB的二進制文件。
-
更多復雜操作,請參考官方文檔:https://github.com/newren/git-filter-repo/blob/main/README.md
請根據具體需求調整命令參數,并始終謹慎操作,因為修改歷史記錄會影響所有倉庫使用者。在執行這些操作前務必創建倉庫備份。