簡體   English   中英

如何將git存儲庫與相關分支合並

[英]How do I merge git repositories with related branches

由於歷史原因,我目前有以下項目結構:

  • PART0:

    • branch0
    • BRANCH1
  • 第1部分:

    • branch0
    • BRANCH1

通過從兩個存儲庫中檢出相同日期的提交來構建項目的二進制文件,因此我需要例如part0 - master(01.04.2013)和part1 - master(01.04.2013)。 檢查不同日期的部件將不起作用。

我現在想要將這兩個存儲庫合並為一個結構

  • 梳子:
    • branch0
    • BRANCH1

其中master中的提交是按照part0 - master和part1 - master的提交日期排序的。

如果我使用我發現的描述合並方案,我將得到一個歷史

part0 - master(everything)+ part1 - master(everything)之后

所以任何提交的結賬都不會起作用,因為要么我只得到part0(在合並part1之前),要么得到最新的part0 - master與過時的part1 - master。

我終於在上面發布的鏈接中解決了這個問題。 首先是圖片中的問題:

repo0: A -- B -- C -- D -- E
             \
              F -- G -- H

repo1: A' -- B' -- C' -- D' -- E'
              \
               F' -- G' -- H'

如果提交A和A'對應並且以運行的形式獲得項目,則需要同時將A和A'簽出到它們各自的目錄中,比如proj0和proj1。

在存儲庫中,文件和目錄放在/中。

目標存儲庫應如下所示:

A -- A' -- B -- B' -- C -- C' -- D -- D' -- E -- E'
                 \
                  F -- F' -- G -- G' -- H -- H'

所以我首先將存儲庫提交的所有內容移動到最終目錄中(當然是在副本中):

git clone --mirror path/repo0 repo0
git filter-branch --tree-filter "(mkdir -p proj0 ; find * -maxdepth 0 ! -iname proj0 -exec mv {} proj0/ \;)" -- --all

git clone --mirror path/repo1 repo1
git filter-branch --tree-filter "(mkdir -p proj1 ; find * -maxdepth 0 ! -iname proj1 -exec mv {} proj1/ \;)" -- --all

現在我可以合並這兩個,首先我創建一個新的存儲庫,舊的存儲庫作為遙控器:

git init new
git remote add proj0 path/repo0
git remote add proj1 path/repo1

git fetch --all

然后我按分支合並,我只是將它們命名為BranchE和BranchH。 由於它們從項目開始就存在,我必須得到第一次提交,這是通過虛擬分支完成的:

git checkout -b dummy remotes/proj0/BranchE
git checkout -b start `git log --topo-order --reverse | head -n 1 | sed s/"commit \(.*\)"/"\1"/`
git checkout -b merge start

git merge -m "merge" remotes/proj1/BranchE
git rebase --onto start start merge

git branch -D start
git branch -D dummy
git branch -m merge BranchE

我為BranchH做了同樣的事情。 直到現在的缺點是,histroy現在看起來像這樣:

A -- A' -- B -- B' -- C -- C' -- D -- D' -- E -- E'
 \
  \
   \
    A' -- B -- B' -- F -- F' -- G -- G' -- H -- H'

最后要做的是將歷史的相似部分組合在一起,這是通過以下命令完成的:

git checkout BranchE
git rebase `git log --oneline | grep "commit comment of last common commit B'" | sed -r s/"(^[a-f0-9]+) .*"/"\1"/` BranchH

Etvoilá,你得到了理想的結果。

暫無
暫無

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

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