【问题标题】:How do I merge git repositories with related branches如何将 git 存储库与相关分支合并
【发布时间】:2013-05-24 08:07:32
【问题描述】:

由于历史原因,我目前有以下项目结构:

  • 第 0 部分:

    • 主人
    • branch0
    • 分支1
  • 第 1 部分:

    • 主人
    • branch0
    • 分支1

项目的二进制文件是通过从两个存储库中检查相同日期的提交来构建的,所以我需要例如第 0 部分 - 主 (01.04.2013) 和第 1 部分 - 主 (01.04.2013)。签出不同日期的零件是行不通的。

我现在想将这两个存储库合并为一个,具有结构

  • 梳:
    • 主人
    • 分支0
    • 分支1

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

如果我使用我找到的描述的合并方案,我将获得一个历史

part0 - master(一切)+ part1 - master(一切)之后

因此,任何提交的签出都不起作用,因为要么我只得到 part0(在合并 part1 之前),要么我得到了最新的 part0 - master 和一个过时的 part1 - master。

【问题讨论】:

标签: git merge repository branch


【解决方案1】:

我终于对上面发布的链接感到困惑。首先是图片中的问题:

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 --镜像路径/repo0 repo0 git filter-branch --tree-filter "(mkdir -p proj0 ; find * -maxdepth 0 !-iname proj0 -exec mv {} proj0/ \;)" -- --all git clone --镜像路径/repo1 repo1 git filter-branch --tree-filter "(mkdir -p proj1 ; find * -maxdepth 0 !-iname proj1 -exec mv {} proj1/ \;)" -- --all

现在我可以将两者合并,首先我创建一个新的存储库,将旧的存储库作为遥控器:

git初始化新 git 远程添加 proj0 路径/repo0 git 远程添加 proj1 路径/repo1 git fetch --all

然后我逐个分支合并,我只是将它们命名为 BranchE 和 BranchH。由于它们从项目开始就存在,所以我必须获得第一个提交,这是通过 dummy-branch 完成的:

git checkout -b 虚拟遥控器/proj0/BranchE git checkout -b start `git log --topo-order --reverse |头-n 1 | sed s/"提交\(.*\)"/"\1"/` git checkout -b 合并开始 git merge -m "合并" 遥控器/proj1/BranchE git rebase --onto start 开始合并 git 分支 -D 开始 git 分支 -D 虚拟 git 分支 -m 合并分支 E

我为 BranchH 做了同样的事情。到目前为止的缺点是,历史现在看起来像这样:

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

最后要做的是将历史的相似部分汇集在一起​​,这是通过以下命令完成的:

git checkout 分支E git rebase `git log --oneline | grep "最后一次共同提交 B' 的提交评论" | sed -r s/"(^[a-f0-9]+) .*"/"\1"/`BranchH

等等,你得到了想要的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多