簡體   English   中英

如何從git倉庫中刪除不存在的文件?

[英]How can I remove non-existing files from my git repo?

我濫用GIT在本地將其用作增量備份解決方案。 一方面是為了教給我git,另一方面是為了解決JPG和MP3文件損壞的情況,這種情況一次發生在藍月亮中。

回購顯然變得龐大。 我需要從歷史記錄中清除不存在的文件。 (我有很多安全視頻會自動進入系統,但稍后會被刪除,因此不需要在.git文件夾中完全檢查前院的視頻供稿。)

這是以“正確”的方式濫用該工具的問題-我不介意浪費很多空間來存放我擁有的文件; 我不介意擁有100個版本的文件。 但是,如果它不存在,我希望將其從回購中刪除,無法將其重新帶回。 完全從歷史中刪除。

有兩個很好的工具可以解決此問題。 BFG Repo Cleaner可以從歷史記錄中刪除大文件。 Git大文件存儲 (也稱為git-lfs)使您可以將大文件放入Git,而不會增加存儲庫的大小。

將它們放在一起,您可以使用BFG將大文件的舊提交更改為通過新的--convert-to-git-lfs選項使用gif-lfs 然后使用git-lfs將來提交大文件。

使用ls-tree HEAD來獲取文件

然后刪除不存在的文件
https://github.com/rtyley/bfg-repo-cleaner

它是完成此類任務的完美工具

BFG回購清潔劑

git-filter-branch的替代方法。

BFG是git-filter-branch的一種更簡單,更快的替代方法,用於從Git存儲庫歷史記錄中清除不良數據

  • 刪除瘋狂的大文件
  • 刪除密碼,憑據和其他私人數據

示例(來自官方網站)

在所有這些示例中,bfg是java -jar bfg.jar的別名。

# Delete all files named 'id_rsa' or 'id_dsa' :
bfg --delete-files id_{dsa,rsa}  my-repo.git

在此處輸入圖片說明


清理存儲庫后,請使用此工具存儲大文件。

在此處輸入圖片說明

這確實是對工具的嚴重濫用。 弄清楚是什么破壞了原始文件可能會更好。 Git在這里真正給您的就是內容校驗和,您可以在Git之外...或在Git內使用較少的濫用,通過使用通常的提交鏈之外的數據結構來進行內容校驗和。

換句話說,如果您想這樣做是為了學習如何以錯誤的方式使用Git :-)我認為有一種“更好的錯誤方式”。 這是我的建議:

  • 使每個提交在一個新的孤立分支上。 您可以使用git checkout -b --orphan或使用“管道”工具git write-treegit commit-tree來做到這一點。

  • 每個分支只能包含一個提交。 (如果使用管道工具,則可以使用標簽代替分支。)

  • 然后,要刪除備份(整個備份),只需刪除分支(或標記)名稱。

用圖解法代替:

o--o--o--...--o--o   <-- master

              ^  ^
              |   \
              |  the most recent
              |
         an hour ago, or yesterday, or whatever

您的提交將是:

o   <-- backup-20160508T101112.13

o   <-- backup-20160508T131415.16

...

這些名稱或多或少是ISO日期格式,即YYYYMMDDTHHMM.SS; 但您可以使用對您來說最有意義的任何名稱。

請注意,如果兩個備份提交相同的文件,則它們將重用所有底層的Git“ blob”對象,因此,兩個備份所占用的空間基本上與一個備份所占用的空間相同。 刪除這兩個備份之一(通過刪除分支或標記名稱)無效,因為所有這些文件都被另一個備份引用。

如果一個文件( xyz.txt )稍有不同,則Git將以Git的通常方式對另一文件(在任何其他提交中)進行增量壓縮,使其不再需要父/子關系連接。 請注意,圖像和電影文件無論如何都很少在Git中很好地壓縮(因為它們已經被壓縮了:信息理論說,如果第一次壓縮是好的,那么第二次嘗試將無濟於事)。

現在假設您決定不再需要備份文件foo.jpg 只需將其刪除:一旦最舊的備份來自“ now”,它將過期並被垃圾回收。 確實,已刪除的文件將保留在較早的備份中,但只保留您的備份。

暫無
暫無

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

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