簡體   English   中英

從巨大的 Git 存儲庫中刪除歷史記錄

[英]Remove history from huge Git repository

我目前正在嘗試減小Git 存儲庫大小,但遇到了很多問題。

介紹

我有一個龐大而復雜的 Git 存儲庫,其中包含數千個提交和十多個分支。 它的當前大小超過 2 GB。

我想做的事

我想清理存儲庫歷史記錄以盡可能減小其大小。 我選擇了一個特殊的提交,我想成為我的新根提交(稱之為<NEW_ROOT> ); 我想刪除<NEW_ROOT>之前的每個提交,並.

我只想保留masterdevelop的 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 並將本地存儲庫克隆到一個新目錄中,指定:

  1. 你只對master分支感興趣
  2. 您想排除所有可從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.

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