2015-10-05 31 views
2

我一直在試圖將一個項目子庫解鎖爲一個新的回購庫,但我想分解完整的文件夾路徑,而不僅僅是目標文件夾。如何讓「子樹拆分」保持完整的文件夾層次?

當我過濾,將得到的文件夾結構從目標文件夾,而不是存儲庫根爲父(或其祖先我指定),其有效地打破如類不再正確地匹配文件夾封裝結構:

原始回購:

+- repo/master 
    +- lib1 
    +- lib2 
    +- lib3 
     +- ClassA 
     +- ClassB 
     +- ClassC 

GIT中的命令:

git subtree split -P lib3 -b new-branch 

產生的結構:

+- repo/new-branch 
    +- ClassA 
    +- ClassB 
    +- ClassC 

所需的結構:

+- repo/new-branch 
    +- lib3 
     +- ClassA 
     +- ClassB 
     +- ClassC 

有沒有辦法做到這一點?我已經閱讀了有關重新綁定以某種方式添加根「核心」文件夾,就好像它在分裂之前那裏,但我的git-fu不夠強壯,可悲:(

我嘗試的另一件事是過濾器,分支刪除其他目錄,但我只能似乎刪除一個根級別的文件夾,然後開始混帳,當我試圖別人抱怨。

謝謝:)

+0

是否有任何理由,爲什麼你不能只是創建'master'的一個新的分支:您可以使用普通的拉命令將其導入到另一個回購?這就是你的圖表似乎在說的。 –

+0

我編輯了這個問題以使事情變得更加清晰,但本質上我只想提交該文件夾的提交以創建新的回購。我是否用子樹分裂來咆哮錯誤的樹? –

+0

如果你想要一個回購倉庫裏的一個部分表現得像一個單獨的回購倉庫,那麼我會考慮使用_submodules_,但是這只是我自己。 –

回答

4

git subtree split似乎沒有提供一個選項是什麼你想(但它聽起來很有用,所以也許你可以貢獻一個項目!)

所以,有兩個w唉2這樣做,取決於你想要的。

1)出口的單一目錄(簡單的選擇)

它利用了你想移動到另一個回購的事實,因此,我們可以提取子樹,然後在單獨的步驟重新定位它。

  1. 使用git subtree split提取到中間的分支你想要的文件在你的倉庫(你已經做到了這一點)。

    git subtree split -P lib3 -b new-branch 
    
  2. 創建一個新的空庫:

    git init lib3-repo 
    cd lib3-repo 
    
  3. 添加中間分支的內容作爲一個子

    git subtree add -P lib3 repo new-branch 
    

這應該重寫歷史再次並重新插入缺少的目錄級別。

每當您想要在兩個回購券之間交換歷史記錄時,您都必須通過中間分行(即subtree split,然後subtree pull),但它應該有效。

2)出口任何文件集(更復雜)

保留多個,具體的子樹,你需要git filter-branch

有很多的方法來挑選哪些承諾和文件保留或丟棄,但這個配方使用--index-filter選擇文件,而無需將文件內容的任何訪問。

保留「lib3」和「src/core」目錄中的所有文件,而不以任何方式編輯它們的位置。

git co -b new-branch 
git filter-branch --index-filter \ 
    'git ls-files \ 
     | grep -v "^lib3/\|^src/core/" \ 
     | xargs --no-run-if-empty git rm --cached'; \ 
    HEAD 

在濾波代碼爲一個shell腳本,編輯的Git 指數(我們使用--index-filter,記不清了)。

git ls-filesls相同,只是它列出了回購庫中的文件,而不是工作樹中的文件。

grep -v <pattern>使一切不匹配的模式,並\|的模式是一種替代,所以我們得到要刪除的文件列表。

xargs --no-run-if-empty爲管道輸入中的每個文件名(除非沒有)輸入一個命令。

git rm --cached從索引中刪除文件。

這會創建一個分支(new-branch),它具有所需的過濾文件。

git init new-repo 
cd new-repo 

git remote add origin /path/to/old-repo 
git pull origin new-branch 
+0

是的,像'--root'這樣的標誌會非常有用!好吧,現在試試... –

+0

好的,謝謝 - 那有點工作... 我現在有所有的文件,並有一個根文件夾「核心」,但整個提交歷史記錄缺少「核心」文件夾。我想要的是核心總是在那裏。這可能嗎? –

+0

不,我不相信用'subtree'做到這一點。你必須嘗試'git filter-branch'和/或'git fast-export'來做任何導出多個子樹的事情。 – ams

相關問題