[英]Remove history from huge Git repository
我目前正在嘗試減小Git 存儲庫的大小,但遇到了很多問題。
介紹
我有一個龐大而復雜的 Git 存儲庫,其中包含數千個提交和十多個分支。 它的當前大小超過 2 GB。
我想做的事
我想清理存儲庫歷史記錄以盡可能減小其大小。 我選擇了一個特殊的提交,我想成為我的新根提交(稱之為<NEW_ROOT>
); 我想刪除<NEW_ROOT>
之前的每個提交,並在.
我只想保留master
和develop
的 development分支,任何其他分支都應該從歷史記錄中刪除以減小大小。
在程序結束時,我想將所有內容推送到 remote ,以便它只保持更新的 master 和 origin (基本上它必須反映我的本地情況)。
到目前為止我嘗試了什么
我瀏覽了很多 web 並找到了很多解決方案,但沒有一個對我有用。 特別是我想這樣的解決方案在我的情況下是完美的,不幸的是我在 rebase 時遇到了很多沖突。
我也很掙扎,因為我發現的許多解決方案都涉及過時和棄用的工具/選項(例如git filter-branch
)。
你能幫我找到出路嗎?
非常感謝!
這聽起來像是您可以通過對本地大型存儲庫進行淺層克隆來實現的目標:
淺層存儲庫具有不完整的歷史記錄,其中一些提交已將父母燒掉。 [...] 當您只對項目的最近歷史感興趣時,這有時很有用,即使上游記錄的真實歷史要大得多。
這個想法是從您認為是新根的提交開始,將您的本地存儲庫淺克隆到一個新目錄中。 請注意,此解決方案假定您只對在新存儲庫中保留單個分支感興趣(例如master
)。
您需要做的第一件事是創建一個分支引用,該引用指向現有存儲庫中<NEW_ROOT>
的父級:
cd your-large-repo
git branch new-root <NEW_ROOT>^
我們將使用new-root
作為淺克隆的截止點。 由於我們確實希望在新存儲庫中包含<NEW_ROOT>
,因此我們將截止點設置為其父級。 當然, <NEW_ROOT>
必須可以從master
訪問。
此時,您可以提前 go 並將本地存儲庫克隆到一個新目錄中,指定:
master
分支感興趣new-root
訪問的提交這是完整的命令:
git clone --branch master --shallow-exclude=new-root file://C:\path\to\your-large-repo C:\path\to\your-new-repo
--shallow-exclude
選項告訴 Git 從克隆中排除導致新根並包括new-root
的所有提交。
現在,如果你cd
進入your-new-repo
,你會發現它只包含master
分支並且根提交是<NEW_ROOT>
。
新存儲庫的origin
將設置為file://C:\path\to\your-large-repo
。 因此,在您進一步使用 go 之前,您必須將其替換為遠程存儲庫的實際 URL:
git remote set-url origin https://example.com/your-large-repo.git
此時,您可以簡單地將新歷史記錄強制推送到遠程存儲庫(通常需要注意強制推送的后果)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.