2009-11-23 80 views
0

我目前正在使用svn(服務器是版本1.4,這意味着沒有現代合併工具可用)的項目。如何將Git合併一個只包含trunk子文件夾的分支?

我想合併一個分支,並在其中工作了幾個星期。問題在於當創建分支時,它僅作爲子文件夾的副本。

項目的SVN結構:

/trunk/folder1 
       /file1 
       /file2 
     folder2 
     folder3 
     ... 

現在,我努力將分支合併回主幹。

現在的問題是,創建分支的人只複製/樹幹/文件夾1,而不是整個樹幹。這爲git-svn創建了一個問題,因爲它認爲我在該文件夾中創建了一堆文件。

git co master 
git merge branch1 
... 
create mode 100644 trunk/file1 
create mode 100644 trunk/file2 

(假設該文件最初在/trunk/folder1/file1

我沒有使用SVN這個原來的原因,是因爲太多的conflickts的。 (svn merge需要服務器1.5+,我們只在1.4,svnmerge.py一次只能合併小塊,並且需要很多心理負擔...我已經用了半天​​時間纔得到半途)

使用git merge似乎很有前途,但起初我需要告訴git使用我的主分支的子文件夾作爲合併目標。這是如何完成的?

回答

5

合併策略subtree專爲此用例而創建。它在遠程分支中查找與本地分支中的子目錄中的文件相匹配的文件,如果它找到它們,則會在調用「正常」合併策略之前重寫所有路徑以使兩個目錄結構匹配。

所以,儘量

git merge -s subtree branch1 
+0

謝謝,但直接在主分支上嘗試這個命令只是創建文件(正如我在我的問題中所述)。我該如何告訴git使用哪個目錄? – 2009-11-23 22:01:53

+0

這似乎工作(從主人/文件夾1應用時)。我仍然錯過了向svn回覆,但git合併運行真的非常快 – 2009-11-23 22:43:16

0

對於一次性的解決方案,我會在我的本地git倉庫的工作副本中採用那個令人討厭的「子文件夾分支」,爲了安全起見,關閉臨時工作分支(「tmp-subdir」),然後使用git filter-branch該工作分支將其所有文件移動到適當的位置。因爲這可能缺少「主幹」文件的其餘部分,所以我會分支出主幹(「tmp-trunk」),然後重播/從「tmp-subdir」挑選所有的變更集到「TMP-主幹」。

然後應該可以將它與「trunk」合併。

這應該有效,但可能有人會拿出一個單線來實現相同的事情。 :-)

+0

有趣的策略。但一個關鍵問題是如何使用'git filter-branch'將所有文件移動到子目錄 – 2009-11-23 20:03:37

+0

使用'--tree-filter'選項和一些shell腳本魔法。但你肯定會更好使用[Jörg的'git merge -s subtree'單行程](http://stackoverflow.com/questions/1783876/how-to-git-merge-a-branch-that-only -contains-A-子目錄-的幹線/ 1785690#1785690)。 – ndim 2009-11-23 20:36:31

1

它看起來像你需要使用合併策略。

對於首先合併,看看下面的參考資料:由馬庫斯·普林茨

  • 的Git文檔中How to use the subtree merge strategy

    • Subtree merging and you(應該是目前在Git的文檔howto/using-merge-subtree.html,在/usr/share/doc/git-<version>上Linux的)。

    或使用艾利Pennarun git-subtree工具,在InterfacesFrontendsAndTools頁面上的Git維基提及。

    對於後續的合併應該夠指定子樹合併策略:

    $ git pull -s subtree <remote> 
    

    $ git merge -s subtree <branch> 
    
  • 相關問題