2017-06-01 98 views
0

我的項目的一些點分離GitHub庫開始用原型,然後我開發在它上面的實際解決方案。這項工作是順序進行的,即每個新的開發分支在完成某個功能(然後刪除)後都會重新合併爲主,所以我有一個很好的線性歷史記錄。現在我注意到原型本身可能是有用的,我想從這個存儲庫中提取它並創建一個新的。在歷史

爲了更好地說明我的觀點,這是我的歷史看起來像現在(讓我們說,TAG意味着在歷史上任意選擇的點時原型開始成爲一個解決方案):

current repo: (ROOT)-----(commits)-----(TAG)--------(commits)---(HEAD) 

這是怎麼我想它看起來:

current repo: (ROOT)-----(commits)-----(TAG)--------(commits)---(HEAD) 
new repo:  (ROOT)-----(commits)-----(TAG == HEAD) 

方的問題:是否有可能使它完全割裂開來,使它們看起來就像這樣:

current repo: (TAG == ROOT)----(commits)-----(HEAD) 
new repo:  (ROOT)-----------(commits)-----(TAG == HEAD) 

回答

1

你可以做任何你想要的。對於「原型」回購,我將通過創建一個「鏡像」克隆

git clone --mirror url/to/old/repo/origin 

爲了使回購的原型版本是非常簡單的開始。您必須將master移回標記最後一個原型版本的TAG。你必須找到那個提交。假設其SHA值爲ABC123;然後

git reset --hard ABC123 

如果從最近的歷史上任何其他標籤或分支,您可能需要將其刪除。但既然你說這是一個簡單的,線性的歷史,那就不應該有太多的事情。然後你可以清理它,如果你想。有幾種方法;我通常跟

rm -r .git/logs 
git gc --aggressive --prune=now 

這就是現在你的原型回購。這會讓你看到第一張照片。

現在,如果您還想從「解決方案」回購中刪除原型歷史記錄,那麼我將再次從新的克隆開始。如果這將取代原始回購,一個普通的克隆是好的;如果你使用這個來開始一個新的回購,我會建議一個鏡像克隆。

從那裏,有很多方法可以做到這一點,但如何

git rebase -i --root 

的編輯器,每犯行彈出。單獨留下第一個人。通過(包括)第一個「解決方案」提交將第二個提交中的第一個單詞更改爲squash,然後保存並退出編輯器。

經過一些工作,一個新的編輯器會顯示來自壓扁的提交的合併提交消息。不管你想要什麼,保存並退出。

如果這是一個普通的克隆,並且您正在替換原始的回購庫,那麼您現在強制推回主回收站。請注意,這是上游轉賬,其他任何使用回購的人都必須從中恢復。 (請參閱git rebase文檔。)

+0

謝謝。我使用了答案的第一部分,但不得不停下來考慮壓縮原始回購,因爲我有人在分揀。 –

+0

還有另一種選擇,稱爲「淺克隆」,可能在這種情況下起作用。有多種選項可以設置它(當克隆可能是最簡單的時候,'depth = N'),但它所做的只是包括「更新」的歷史記錄,同時仍然保留了提交ID(這將有助於保持與叉的歷史一致性) –