簡體   English   中英

如何從 git 存儲庫中完全刪除文件的特定版本?

[英]How do I totally remove a specific version of a file from a git repository?

我正在從事幾個游戲開發項目,這些項目同時涉及對代碼和大型二進制文件的大量更改。 為簡單起見,假設我有一個 git 存儲庫,其中包含兩個文件(一個文本文件和一個大型二進制 blob),它們都在多個提交中更新:

commit dddd: "Release day is finally here!" <tag: v1.0>
   changed hello.md
   changed image.png (lfs) <==== keeper!

commit cccc: "Ok, that's a bit better."
   changed hello.md
   changed image.png (lfs)

commit bbbb: "Updated my project."
   changed hello.md
   changed image.png (lfs)

commit aaaa: "Initial commit!" 
   added hello.md
   added image.png (lfs) <==== keeper!

每次提交我都對我的兩個文件進行了某種更改。

但是,回想起來,我已經決定要刪除一些 lfs 文件以減小存儲庫的整體大小,並且只有一半的image.png版本不同,值得保留。 (請記住,它並不總是像不提交中間版本那么簡單,因為我們並不總是事后才知道“關鍵”版本是什么。)

那么,我可以從我的存儲庫中完全刪除bbbbcccc中包含的image.png版本以減少其整體存儲空間嗎? 如何? 我一直在研究git gcgit filter-repo但我一直無法實現我想做的事情。 我在正確的軌道上嗎? 是否有任何其他策略可以用來優化我的存儲庫的大小或以其他方式緩解這種情況?

感謝您提出有趣的問題。 我終於過來戳了一下 Git。 這將是我的(未經測試的)想法如何處理這個問題。 我使用git.git存儲庫進行實驗。 它不包含 LFS 數據,但希望它能讓您朝着正確的方向開始:)

git rev-list --oneline --objects --in-commit-order HEAD -- path/to/file

輸出提交、樹和 blob 的列表; 例如:

cf1b7869f0 Commit message here
b299d53c5f9a2a8be72f819e26f49421ed6c45bc 
52c10caf3523b877ef7fa77f7af3c64de3055b4f path/to/file

結合grep ,您可以提取相關文件的所有 blob id(哈希):

git rev-list --oneline --objects --in-commit-order HEAD -- path/to/file \
  | grep 'path/to/file$'

現在,您必須確定要保留/刪除哪些 blob。 也許一些聰明sed魔法可以幫助你,或者通過為rev-list提供正確的提交范圍。 因此,與其HEAD列出所有可訪問的提交, v1..v3或類似的( --since--until也可能有幫助)。 在最壞的情況下,您必須手動執行此操作。

現在,請確保備份您的存儲庫! (不能強調這一點)。 最好在單獨的目錄中創建一個新的克隆。

git-filter-repo似乎帶有一個基於內容的過濾器,它提供了--strip-blobs-with-ids選項。

將要刪除的所有 blob id(即標識文件的特定版本的哈希)逐行存儲到文本文件中。 然后將此文件提供給filter-repo的內容過濾器。 如果是這樣,手冊中的狀態是什么,你應該只留下你想要保留的 blob。

下一步,您可能希望從 LFS 本身中刪除文件,而不僅僅是提交中的引用: 如何刪除 git-lfs 跟蹤的文件並釋放存儲配額?

我希望這會有所幫助。 讓我知道它是如何 - 以及是否 - 它成功了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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