2014-04-09 75 views
0

我有兩個存儲庫,AB。我想將A中的所有文件及其歷史記錄的子集複製到BB有它自己的歷史記錄,我也想保留它;它不是一個新的,新的儲存庫。如何在git中從另一個倉庫提取一系列提交?

你看,A有28,000個提交。除了最近的30個左右外,我都不在乎。爲了簡單討論,假設我對#1至#27,970的提交不感興趣,但我想保留提交#27,971至#28,000的歷史記錄。

我試過兩種不同的方法。

  • 壁球通過#27970提交提交的#1,A(使用git rebase -i)成一個單一的提交,然後git pullAB。我在這裏碰到的麻煩是在A重新綁定期間,git無法應用某些提交的錯誤很多。我不太瞭解A中的這些提交,所以我無法修復它們。 (另外,它採取了一種時間來執行變基 - 多小時,我還沒有完成)的A
  • 下載的快照(即,沒有歷史)在提交#27970,並放置在B ,併爲新鮮文件做一個git addgit commit。然後從A(使用git format-patch)爲第27,971到第28,000號提交創建補丁,並將該補丁應用於B。這一切似乎工作正常,除了它沒有維護給定文件的提交歷史。也就是說,在應用修補程序後,似乎所有30次提交的更改都立即發生:歷史記錄未保留。

有一個簡單的方法可以做到這一點!

+0

我可以想出許多不同的方法來做你想做的事情,但我會用第一個最簡單的方法來回答我的頭。另外,你是否基本上只想創建一個新的'B',它是'A'的克隆,但是隻有最近的30次提交? –

+0

@Cupcake我編輯了我的問題:'B'有它自己的文件;它不是一個新的回購。 – stepthom

+0

'B'包含什麼樣的文件,它們與'A'中的文件有什麼關係?如果它們是相同的文件但共享不同的歷史記錄(就像您在重新綁定後會得到的內容一樣),那麼當您將文件從'A'合併到'B'時,您不會感到驚訝。要非常小心你如何解決這些衝突。 –

回答

2

所以我研究了兩種可能的選擇來做你想找的。其中之一是使回購A淺克隆,但根據the documentation

淺庫有許多限制的(你不能複製或讀取它,也不是來自也不把它推) ,但如果您只關注一個歷史悠久的大型項目的近期歷史,並且希望將修補程序作爲補丁發送,就足夠了。

無法執行基本的網絡選項,如推送和從淺回購獲取聽起來像一個很大的限制,所以我認爲這下一個選項可能會更好。而不是讓一個淺回購的,你可以嘗試做一個孤兒分支開始提交master~29,然後重訂在它上面的承諾master~28..master

git checkout --orphan root master~29 
git add . 
git commit -m "Add your message here" 

這將關閉啓動你的孤兒的分支,以新包含提交的歷史記錄狀態的根提交master~29。接下來你要變基後裔提交重回巔峯(這將保存歷史,除了提交日期,這將必然因爲重訂更新):

git rebase --preserve-merges --onto root master~29 master 
# or `-p` for short 
git rebase -p --onto root master~29 master 

這將重建的master休息在新的根目錄之上,同時還保留任何合併提交。如果你想確認的master這個新版本是一樣的舊人,只是用更短的歷史,那麼就做一個diff底墊後立即:

git diff [email protected]{1} master 

我強烈建議您測試此首先互相剋隆

Documentation for orphan branches

+0

謝謝!你的孤兒分行策略爲我工作。請注意,我完成了上述所有命令來存儲'A',然後''將'A'拉入'B'。由於某種原因,有一些兼併衝突要照顧,但沒有辦法處理。 – stepthom

相關問題