簡體   English   中英

如何Git合並僅包含主干子文件夾的分支?

[英]How to Git merge a branch that only contains a subfolder of trunk?

我目前正在使用svn(服務器為1.4版,這意味着沒有可用的現代合並工具)進行項目。

我想合並一個分支,並在其中工作幾個星期。 問題在於創建分支時,它只是作為子文件夾的副本而創建的。

項目的SVN結構:

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

現在,我正在努力將分支合並回主干。

現在的問題是創建分支的那個人只復制了/ trunk / folder1而不是整個主干。 這給git-svn帶來了一個問題,因為它認為我在該文件夾中創建了一堆文件。

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

(假設文件最初位於/trunk/folder1/file1

我之所以不使用svn的最初原因是因為沖突太多。 svn merge需要服務器1.5+,而我們僅在1.4上, svnmerge.py一次只能合並小塊數據,並且需要很多精神負擔...我用了半天的時間才完成一半)

使用git merge看起來很有希望,但是首先我需要告訴git使用我的master分支的子文件夾作為合並目標。 怎么做?

subtree合並策略是專門為該用例創建的。 它在遠程分支中查找與本地分支的子目錄中的文件匹配的文件,如果找到了它們,則在調用“常規” recursive合並策略之前,它將重寫所有路徑以使兩個目錄結構匹配。

所以,嘗試

git merge -s subtree branch1

看來您需要使用子樹合並策略。

對於第一次合並 ,請查看以下參考資料:

或者使用Avery Pennarun的git-subtree工具,該工具在Git wiki的InterfacesFrontendsAndTools頁面上提到。

對於后續合並 ,足以指定子樹合並策略:

$ git pull -s subtree <remote>

要么

$ git merge -s subtree <branch>

對於一次性解決方案,我會在本地git repo的工作副本中使用該煩人的“子文件夾分支”,為安全起見從一個臨時工作分支(“ tmp-subdir”)中分支出來,然后在其上使用git filter-branch工作分支將其所有文件移動到正確的位置。

由於可能缺少“ trunk”的其余文件,因此我將分支到“ trmp-trunk”分支,然后將所有更改集從“ tmp-subdir”重播/ cherry-pick到“ tmp-trunk” ”。

然后應該可以將其與“ trunk”合並。

這應該起作用,但是可能有人會想出一種方法來實現相同的目的。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM