聲明:您應該首先使用測試回購來執行此操作,因爲此處列出的命令可能會破壞您的數據。
您可以通過快速導出機制編輯(即讓腳本編輯)歷史記錄。第一步是運行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以來,您不應該在任何地方留下移植物的任何回購。
您的回購(磁盤大小)有多大? Git應該能夠處理這個數量的提交。你也可以在服務器或網絡問題上尋找過多的負載(作爲比較,linux內核大約800MB,有400K提交,並需要大約半小時才能從git.kernel.org克隆)。 – Rudi
Rudi,回購大約30GB,提交超過10K(.git/objects /文件夾爲12GB),與Linux內核相比沒什麼差別。但是,除了任何可能的網絡問題之外,我不只是試圖修復,然後繼續前進,我也想學習有關這方面的不同方法。謝謝! – RoLYroLLs
[Git刪除歷史記錄提交]的可能重複(http://stackoverflow.com/questions/13091928/git-remove-history-commit) – sschuberth