亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從git存儲庫中刪除文件(歷史記錄)

從git存儲庫中刪除文件(歷史記錄)

Git
揚帆大魚 2019-11-25 10:53:18
很長時間以來,我一直在尋找以下內容:http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ 和http://progit.org/book/ch9-7.html幾乎相同的方法,但是它們都將對象保留在打包文件中...卡住了。我試過的git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_name'rm -Rf .git/refs/originalrm -Rf .git/logs/git gc包中仍然有文件,這就是我所知道的:git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3和這個:git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_name" HEADrm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune相同...嘗試過git clone技巧,它刪除了一些文件(其中約3000個),但最大的文件仍然存在...我的存儲庫中有一些大的舊文件,大約200M,我真的不希望它們在那里...而且我不想將存儲庫重置為0 :(解決方案:這是擺脫文件的最短方法:檢查.git / packed-refs-我的問題是我在refs/remotes/origin/master遠程存儲庫中有一行,請將其刪除,否則git不會刪除那些文件(可選) git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5 -檢查最大的文件(可選) git rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98 -檢查哪些文件git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names' -從所有版本中刪除文件rm -rf .git/refs/original/ -刪除git的備份git reflog expire --all --expire='0 days' -使所有松散的物體失效git fsck --full --unreachable -檢查是否有松散的物體git repack -A -d -重新包裝git prune -最終刪除那些對象
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

我不能肯定地說不能訪問您的存儲庫數據,但是我相信可能有一個或多個打包引用仍然引用您運行前的舊提交git filter-branch。這可以解釋為什么git fsck --full --unreachable即使您的reflog已過期并刪除了原始(未打包的)ref,也不會將大blob稱為不可訪問的對象。


這是我會怎么做(后git filter-branch并git gc已經完成):


1)確保原始裁判不見了:


rm -rf .git/refs/original


2)使所有reflog條目過期:


git reflog expire --all --expire='0 days'


3)檢查舊包裝的裁判


這可能很棘手,具體取決于您有多少個打包的引用。我不知道可以自動執行此操作的任何Git命令,因此我認為您必須手動執行此操作。備份.git/packed-refs?,F在編輯.git/packed-refs。檢查是否有舊的裁判(尤其是查看是否包裝了的任何裁判.git/refs/original)。如果您發現任何不需要的舊文件,請將其刪除(刪除該引用的行)。


完成清理packed-refs文件后,請查看是否git fsck注意到無法訪問的對象:


git fsck --full --unreachable


如果這行得通,并且git fsck現在報告您的大Blob無法訪問,則可以繼續執行下一步。


4)重新打包打包的檔案


git repack -A -d


這將確保無法到達的對象被解壓并保持解壓。


5)修剪松散(無法到達)的物體


git prune


那應該做到的。Git確實應該有更好的方法來管理打包的引用。也許有我不知道的更好的方法。在沒有更好的方法的情況下,手動編輯packed-refs文件可能是唯一的方法。


查看完整回答
反對 回復 2019-11-25
  • 3 回答
  • 0 關注
  • 812 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號