2013-11-21 27 views
6

我們有7個貢獻開發者的Git回購,擁有超過2.5年的歷史和約10,000次提交。我們使用Assembla來推拉。當我們添加新開發人員時,將回購克隆到他們的開發計算機需要近一個小時。如何收縮/切割Git回購

我不確定這是否是適當的術語,但我們的目標是通過「切割/剪切」掉第一個1.5年的提交併保留最近一年的歷史來「縮減」回購。我們希望保留整個回購的「備份」副本,無論是作爲單獨的回購還是分支?我們希望在未來再次重申這一點,在需要時可能會將初始分割與新分割合併,但我不確定這是否可行。如果有一種方法可以將所有歷史記錄保存在一個單獨的分支中,並且只保留master分支僅包含去年的歷史記錄,那就太好了,但讓我知道可能的優點和缺點。

我不知道我們擁有的所有可能性/選項,這就是爲什麼我在這裏。我讀了一些關於patches的內容,但我不確定這是否真的是我需要的,或者是否有更好/更容易的東西。你們正在做什麼來照顧這樣的問題,包括利弊?請記住,我仍然需要每個開發人員繼續推拉,最好留在master分支上。

在此先感謝!

+0

您的回購(磁盤大小)有多大? Git應該能夠處理這個數量的提交。你也可以在服務器或網絡問題上尋找過多的負載(作爲比較,linux內核大約800MB,有400K提交,並需要大約半小時才能從git.kernel.org克隆)。 – Rudi

+0

Rudi,回購大約30GB,提交超過10K(.git/objects /文件夾爲12GB),與Linux內核相比沒什麼差別。但是,除了任何可能的網絡問題之外,我不只是試圖修復,然後繼續前進,我也想學習有關這方面的不同方法。謝謝! – RoLYroLLs

+0

[Git刪除歷史記錄提交]的可能重複(http://stackoverflow.com/questions/13091928/git-remove-history-commit) – sschuberth

回答

7

可以在Git SCM博客文章"Replace Kicker"上找到最好的分步說明。

簡短的總結是這樣的:

  • 創建一個新的分支,是要切點,說git branch history哈希
  • 將歷史推送到新的存儲庫。
  • 使用git commit-tree創建一個新基地。
  • 將您的信息history重新發布到您的新基地。
  • 將新截取的master分支推送到服務器。
  • 然後,人們可以使用git replace重新連接歷史記錄。

原來的文章解釋它更好的照片。

在處理涉及合併的複雜歷史時,這可能無法正常工作,具體取決於git rebase --onto--preserve-merges的合作程度。在繼續之前,您應該明顯地測試。

+0

謝謝!我真的喜歡這個過程。我只是測試這個方法。你知道是否有辦法保持這種方法的一半嗎? IE:'master'分支有截斷版本,'history'分支會保留整個歷史記錄,直到我將它們分開爲止?我寧願不必推入單獨的回購。 – RoLYroLLs

+0

爲了加入我上面的評論,我剛剛讀到'git pull {remote}'拉取所有分支,但不爲遠程回購中的任何/所有分支創建本地分支。如果我設法將歷史記錄保留在一個分支中,並在另一個分支上保留所有新的提交,新開發人員最終將從每個分支中提取所有數據(我認爲這是在您的答案中推送新的回購的原因),或者它只拉分支名稱而不是數據? – RoLYroLLs

+0

我對另一個回購做了一些測試,並得到了關於「git pull」得到多少數據的問題的答案。事實上,即使您沒有本地分支跟蹤對特定分支的更改,它也可以獲取所有分支及其跟蹤的更改。所以我把這個歷史放在一個單獨的分支上的想法是不可行的。我將不得不按照您發佈的替換踢球者帖子!謝謝! – RoLYroLLs

0

聲明:您應該首先使用測試回購來執行此操作,因爲此處列出的命令可能會破壞您的數據

您可以通過快速導出機制編輯(即讓腳本編輯)歷史記錄。第一步是運行git fast-export --signed-tags=strip --no-data --full-tree --export-marks=export.marks branch1 branch2 [...] branchN > commits.fi。現在,您可以快速導入所有分支機構。在這個流中,你可以通過刪除commit refs/...中的行到後面的換行符來刪除提交。您還需要從當時新的「第一次」提交中刪除from :<mark>行(並且還有merge :<mark>行,如果您的新歷史記錄以合併開始)。

爲了幫助這個過程,您應該查看修訂圖表,並在沒有合併跨越其歷史記錄的情況下進行修訂。在下面的圖表中,A,D和F是很好的候選人。 B或C確實有問題,即後繼d確實還取決於G和A

A ---- B ---- C ---- D --- E ---- F 
    \    /\  \ /
    \--- G ------- H \--I--J-/ 

隨着export.marks文件可以翻譯提交ID標記流中numers。

您需要爲您的分支提供新名稱,因爲git fast-import不會接受新的歷史記錄,因爲新分支不包含現有分支的提交。

創建新歷史記錄後,您需要將其與git fastimport < manipulated-history.fi一起導入到您現有的回購庫中。

現在該檢查導入是否正確。爲此,您需要將repo克隆到臨時庫中,並在此臨時庫中爲每個新創建的提交創建一個嫁接,以便它具有與以前相同的父級修訂。之後運行git filter-branch newBranch1 newBranch2 [...] newBranchN。如果每個newBranch現在停留在與相應分支相同的提交上,則導入是正確的。

當一切工作到目前爲止,您可以創建一個新的倉庫,並從第一個工作克隆中提取新的分支機構,並將其作爲新的工作倉庫。另外請注意,自移植物can cause harm以來,您不應該在任何地方留下移植物的任何回購。

+0

@Rubi感謝您的支持。由於您提到的圖表問題,不確定此解決方案的效果如何。 – RoLYroLLs