2013-05-31 27 views
8

有沒有辦法通過刪除有關舊提交的數據的本地副本來減少回購大小?通過刪除舊提交的緊湊回購

git clone --depth 5產生一個只有最近提交數據的小本地克隆類似。

回購包含千兆字節的遊戲資產,這些資產在過去被多次覆蓋。

編輯:我不想清除過去的歷史;我希望歷史與遠程保持一致,但我不希望舊提交在本地存儲並可用。

+0

當你說「老提交」,我猜你的意思不是晃來晃去不再從到達提交分支指針,在你的歷史中只是真的很老,你不可能在不久的將來再次訪問,那會是正確的嗎? – 2013-05-31 13:56:44

+0

@TheShadow的權利,我會更新問題 –

+1

@Hardex:回答您的更新問題:不可能保留歷史上最近的提交,並有完全可用的存儲庫。淺拷貝不完全可用 - 它不能被提交。 – mvp

回答

7

不幸的是,不可能只保留最近提交的歷史記錄,並且完全可用存儲庫。淺拷貝不完全可用,因爲它不能被承諾。

換句話說,由於git將數據保存在對象存儲中的方式,除了從頭開始重寫歷史記錄之外,沒有多少選項。

可能最簡單的方法是將所有當前遊戲資產文件複製到git存儲庫之外的某個位置,然後使用git filter-branch作爲described here從歷史記錄中刪除您的資產,就像它從未存在過。最後,將資產複製回合適的位置並再次提交。這將以遊戲資產只出現在最近的提交中的方式重寫您的歷史記錄。

但是,它仍然不會回收磁盤空間雖然直到你:

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

git gc --prune=<date>應該做你想做的。看看到文檔:https://www.kernel.org/pub/software/scm/git/docs/git-gc.html

UPDATE1:我建議你閱讀這篇博客文章git gc還有:http://gitfu.wordpress.com/2008/04/02/git-gc-cleaning-up-after-yourself/

UPDATE2: @mvp是正確的,進行了深入研究後git gc只會移除未跟蹤的對象。爲了移除物體,其中一個解決方案是使用git filter-branch。我建議您閱讀關於removing objectsgit filter-branch文檔的主題。感謝@mvp的領導。

+1

你是完全錯誤的。 'git gc --prune'不會做OP想要的 – mvp

+0

你是對的@mvp,我已經更新了我的答案。擡起頭來。 –

+0

@danielcsgomes對於它的價值,如果原始海報**對刪除懸掛提交感興趣,那麼'git gc'確實是正確的使用工具。 – 2013-05-31 13:58:23