2010-07-07 61 views
4

我添加了一些文件到錯誤的版本庫,直到後來才意識到,一旦它們已經有很多歷史(只是線性版本,沒有分支或任何東西)。是否可以將一堆文件從一個git存儲庫移動到另一個,同時保留(大部分)歷史記錄?

是否可以獲取這些文件並將它們與其歷史一起移動到另一個git存儲庫?我不關心他們的殘餘物是否保留在現有的殘留物中,只要新的物品具有這一切。

+0

我不是GIT專家,但你可以:1.克隆目標回購。 2.將錯誤的來源推入克隆目標。 3.重新設置你想保留的變更集。 4.只將這些變更集推回原始回購?正如我所說,我不是GIT專家,所以我甚至不知道這是否可能。 – 2010-07-07 07:55:56

+0

同時結帳[this](http://stackoverflow.com/questions/1365541/how-to-move-files-from-one-git-repo-to-another-not-a-clone-preserving-history)(附近重複)問題。有了成千上萬的觀點,這可能是更權威的答案。 – 2012-05-09 18:50:35

回答

2

使用git log -p <filename> > <patchfile>(請參閱doc),您可以導出文件的全部歷史記錄,然後通過git apply --reverse --index <patchfile>將其應用於其他存儲庫。但是這不會重新創建提交,並且我haven't figured out開關爲git-apply來執行此操作。

如果您想擺脫原始回購中的文件,請參閱"How do I remove sensitive files from git’s history?"

+1

我結束了對git log -p的輸出進行ruby腳本編寫,並將其轉換爲一系列patch/git add/git commit - 對於這個簡單的案例來說工作得很好,即使它感覺真的錯了。 – taw 2010-07-09 03:05:54

+1

@taw你會介意發佈該腳本作爲[我的問題]的答案(http://stackoverflow.com/questions/3194240/how-can-a-patchfile-created-with-git-log-p-filename-是應用到創建 - 所有)然後呢?一個解決方法總比沒有好,未來的訪問者可能會喜歡這個幫助 – 2010-07-09 03:57:13

+0

隨着git版本1.7.10.3'git apply --reverse --indexed '將返回'錯誤:未知選項'索引' – oschrenk 2012-05-31 13:47:09

0

您可以在您正在重做的分支上嘗試一個git format-patch,爲最後提交的補丁生成不正確的補丁。
請參閱this SO question

然後,您會將這些路徑應用於正確的回購。
而你會爲你的當前分支reset --hard擺脫額外的提交。

2

你可以做如下的事情。

  1. 使用git fetch將包含所需文件的分支的頂端從錯誤的存儲庫中拖到正確的存儲庫中。
  2. 使用git filter-branch--tree-filter--index-filter一起從取出的分支中除去所需文件以外的所有內容。
  3. 使用git rebase或重新應用整理提交到適當的存儲庫中的主分支。
相關問題