![](/img/trans.png)
[英]Remove all files from Git repo history with path having escape \ in filename with git filter-repo
[英]Is it possible to use `git filter-repo` to remove a specific version of a file from a git repository?
假設我有一個包含三個提交的小型 Git 存儲庫:
commit cccc:
updated smile.png (LFS)
updated manual.md
commit bbbb:
updated smile.png (LFS) <==== Don't want this specific one anymore!
added manual.md
commit aaaa:
added smile.png (LFS)
added README.md
added .gitattributes
我已經添加了 3 個不同版本的 LFS 文件smile.png
,但我已經確定我不希望或不再需要中間的版本存在於我的存儲庫中。 我不介意更改 git 歷史記錄。 我還想縮小存儲庫的整體大小。
我知道git filter-repo --path smile.png --invert-paths
可用於完全刪除所有實例和對smile.png
的引用。 但是,有沒有辦法從提交bbbb
中刪除特定版本,同時保留來自aaaa
和cccc
的版本?
Git-LFS 的使用給原本非常簡單的事情增加了一點小麻煩。
您可以“刪除”提交bbbb
。 為此,您還必須“刪除”提交cccc
。 我在此處將“刪除”放在引號中,因為 Git 實際上並沒有刪除提交。 它只是把他們推到一邊。 它們會在您的存儲庫中保留一段時間,因此如果您認為“刪除”它們是一個錯誤,您可以將它們取回。
它們會保留多長時間(以及為什么)是一件有點復雜的事情,但默認設置是保留已刪除的提交至少 30 天。 同時,在刪除bbbb
時必須刪除cccc
的原因很簡單:每次提交都取決於所有先前提交的存在。 所以你不能只從鏈條中間撕下一個。 你必須撕掉那個和所有后續的提交。
這意味着要保留提交cccc
的內容,您需要制作一個新的和改進的cccc
版本。 替換的新穎性是自動的:無法更改現有提交,但始終可以添加新提交。 提交的改進之處在於它包含您想要的快照——無論您選擇如何安排它——並且它鏈接回提交aaaa
。 因此,在查看提交時,Git 現在將從最后一次提交cccd
(或其 hash ID 的任何內容)開始並查看該提交,然后返回aaaa
並查看該提交,您將看到您喜歡的歷史記錄。
git filter-branch
和git filter-repo
都可以輕松完成這種手術。 還有其他方法可以進行相同的手術; 在這種特殊情況下,只需復制一個提交,我們可以使用git commit-tree
(制作新的和改進的cccd
)和git reset
(移動分支名稱以找到cccd
)來完成。 在此處查看有關許多選項( git replace
、提交樹方法、BFG、filter-branch、filter-repo 等)的許多 StackOverflow 問題中的任何一個。
下面是關於使用 Git-LFS 的一些知識:當你在 Git-LFS 中添加和提交一個“大文件”時,LFS 軟件已經秘密地將你的文件替換為一個“LFS 指針文件”(它很小:通常在1 千字節)。 這意味着Git根本不存儲您的文件。 Git 存儲此 LFS 指針文件。 LFS 代碼已經將您的文件存儲在其他地方(在其他一些 web 站點上), 1並使用指針文件查找存儲的文件。 當您有 Git 簽出某個特定提交時,Git-LFS 軟件會攔截簽出,注意到某些文件已被秘密替換為指針,然后轉到 LFS web 站點檢索大文件。
當您重寫歷史記錄時,您將創建一個新的提交cccd
,其內容與cccc
完全相同。 這很好,因為cccd
中的指針文件將來自cccc
。 所以 LFS 攔截器會用同樣大的文件替換它。 但是:commit bbbb
包含指向存儲在另一個web 站點上的某個文件的指針文件,其中保存了大文件。 這個其他 web 站點不知道您永遠不會再次提及提交bbbb
。 2所以他們會保留大文件。
如果您希望他們擺脫大文件的bbbb
版本,您將需要一些其他機制(完全在 Git 本身之外)來擺脫它。 Git 的任何部分都不會這樣做。 請注意,如果您專門使用 GitHub,您可能會遇到一些問題:如何刪除 git-lfs 跟蹤的文件並釋放存儲配額?
1這個“獨立的 web 站點”可以是主要的托管服務提供商 web 站點,也可以是輔助站點,或者與某些托管服務提供商 web 站點完全分開。 細節取決於你和你的 LFS 配置。
2假設,也就是說,您沒有改變主意並恢復提交bbbb
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.