簡體   English   中英

是否可以使用 `git filter-repo` 從 git 存儲庫中刪除特定版本的文件?

[英]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中刪除特定版本,同時保留來自aaaacccc的版本?

Git-LFS 的使用給原本非常簡單的事情增加了一點小麻煩。

可以“刪除”提交bbbb 為此,您還必須“刪除”提交cccc 我在此處將“刪除”放在引號中,因為 Git 實際上並沒有刪除提交。 它只是把他們推到一邊。 它們會在您的存儲庫中保留一段時間,因此如果您認為“刪除”它們是一個錯誤,您可以將它們取回。

它們會保留多長時間(以及為什么)是一件有點復雜的事情,但默認設置是保留已刪除的提交至少 30 天。 同時,在刪除bbbb時必須刪除cccc的原因很簡單:每次提交都取決於所有先前提交的存在。 所以你不能只從鏈條中間撕下一個。 你必須撕掉那個和所有后續的提交

這意味着要保留提交cccc內容,您需要制作一個新的和改進的cccc版本。 替換的新穎性是自動的:無法更改現有提交,但始終可以添加新提交。 提交的改進之處在於它包含您想要的快照——無論您選擇如何安排它——並且它鏈接回提交aaaa 因此,在查看提交時,Git 現在將從最后一次提交cccd (或其 hash ID 的任何內容)開始並查看該提交,然后返回aaaa並查看該提交,您將看到您喜歡的歷史記錄。

git filter-branchgit 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM