2013-04-07 128 views
4

也許已經有一個解決方案了,但其他問題似乎解決了稍有不同的問題(或者我真的不明白它們)。從Git存儲庫拆分子目錄並保留子目錄中所有文件的歷史記錄_now_

我的意圖是分離一個Git倉庫的子目錄,並使其成爲一個獨立的存儲庫,同時保持歷史完整,但只有子目錄的歷史。 This question第一次似乎做的伎倆,但後來我注意到它的缺陷:

git filter-branch --subdirectory-filter只保留提交涉及到給定的子目錄。但這意味着提交將被刪除,影響該子目錄現在的中的文件,但已從其他位置移動到那裏。

我注意到這一點,因爲我'清理'存儲庫的第一次提交是'將所有東西都移到子目錄X'。這意味着我的文件之前已經在另一個位置,但那時的提交併未保留。

那麼我需要的是一個命令(或命令序列):

  • 刪除存儲庫中的所有承諾
  • 除了包含文件的提交是
    • 是在給定子目錄現在或
    • 是這些文件在其他位置的先前版本。

B)
可能還有一些這些提交的還含有不符合這些條件的文件。如果可以從存儲庫中完全修剪這些文件,那將是一個不錯的附加組件。


編輯:

以上鍊接的溶液拉動新的存儲庫以回購的根目錄中的子目錄的內容。正如@Amber指出的那樣,這會對已存在於根目錄中的文件造成麻煩。所以我想實現的是:

原始目錄結構:

\Old-Repo 
    \.git 
    \ABC 
    |- dir content 
    \DEF 
    |- dir content 
    \GHI 
    |- dir content 

分離的存儲庫的目錄結構應該是:

\New-Repo-DEF 
    \.git 
    \DEF 
    |- dir content 

,而不是:

\New-Repo-DEF 
    \.git 
    content of old DEF subdirectory 

然後,我會通過定期提交將內容從DEF子目錄移動到根目錄。

+1

這樣做的問題是 - Git如何代表目前位於頂級目錄之外的路徑? – Amber 2013-04-07 22:57:05

+0

真的有必要把子目錄拉上一層嗎?我很樂意把這個子目錄作爲一個子目錄留在新的存儲庫中(然後將內容提交到主目錄,然後定期提交)(請參閱我編輯的問題) – 2013-04-08 10:37:06

回答

0

根據歷史記錄的複雜程度,在用--subdirectory-filter提取子目錄之前,重寫它並移動git filter-branch --tree-filter(如描述的here)可能是可行的。

換句話說,如果git log -- somedir顯示「移動文件XYZ到somedir」爲最早提交的somedir目錄,你可以做git filter-branch --tree-filter 'insert a fairly foolproof script here that moves files XYZ to somedir' HEAD。這樣,您可以在提取子庫之前理清目錄結構。

前幾天我在一個相當小的存儲庫(大約150次提交,線性歷史記錄)上做了這個工作,並且它工作正常,但我認爲它不會在沒有嚴重自動化的情況下進行擴展。

相關問題