簡體   English   中英

Git - 如何從提交歷史中刪除大文件,以便我可以推送存儲庫?

[英]Git - How to remove a large file from commit history so I can push repository?

幾個月前,我不小心為我的存儲庫提交了一個重約100MB的目錄。

快進到今天,我正在嘗試將該回購遷移到Github。 由於尺寸限制,它不會讓我。

我使用以下帖子刪除了該目錄: 從所有Git存儲庫提交歷史記錄中完全刪除文件

它似乎有效,但整個項目仍然重達100M。 我跑了du . 得到以下一行: 98M ./.git/objects

我不知道如何解決這個問題,因為我已經嘗試了一些解決方案,但它們似乎都沒有。

我現在應該怎么辦?

編輯:我設法使用上面鏈接的線程修復它。 特別是達倫的回答。

你需要在reflog中使條目expire ,否則它將保存對那些舊blob的引用,然后garbage collect它。

git reflog expire --expire=now --all
git gc --prune=now --aggressive

如果這不起作用,請嘗試使用BFG工具清理您的倉庫。 按照他們的說法,首先制作存儲庫的副本。

我設法使用上面鏈接的線程修復它。 具體來說,我做了類似Darren的回答。 為方便起見,我會把它放在這里:

這是最好的方法:
http://github.com/guides/completely-remove-a-file-from-all-revisions

請務必先備份文件的副本。

編輯

不幸的是,[霓虹燈] [1]的編輯在審核過程中被拒絕了。 請參閱下面的Neons帖子,它可能包含有用的信息!

[1]: https//stackoverflow.com/users/309261/neon


例如,刪除意外提交到git存儲庫的所有*.gz文件:

 $ du -sh .git ==> eg 100M $ git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.gz' HEAD $ git push origin master --force $ rm -rf .git/refs/original/ $ git reflog expire --expire=now --all $ git gc --prune=now $ git gc --aggressive --prune=now 

那仍然不適合我? (我目前在git版本1.7.6.1)

 $ du -sh .git ==> eg 100M 

不知道為什么,因為我只有一個主分支。 無論如何,我終於通過推入一個新的空的裸git存儲庫來真正清理我的git repo,例如

 $ git init --bare /path/to/newcleanrepo.git $ git push /path/to/newcleanrepo.git master $ du -sh /path/to/newcleanrepo.git ==> eg 5M 

(是!)

然后我將它克隆到一個新目錄,並將它的.git文件夾移到這個目錄中。 例如

 $ mv .git ../large_dot_git $ git clone /path/to/newcleanrepo.git ../tmpdir $ mv ../tmpdir/.git . $ du -sh .git ==> eg 5M 

(是的!終於清理干凈了!)

在驗證一切正常后,您可以刪除../large_dot_git../tmpdir目錄(可能在幾周或幾個月后,以防萬一...)

簡而言之:我過濾了分支,創建了一個新的裸倉庫,將主機推送到它,將其克隆到一個新目錄中,並用克隆中的git目錄替換了我的項目的git目錄。

暫無
暫無

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

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