GIT将两个存储库合并到一个新的存储库中,一个应该是一个分支



我想将存储库带入存储库,但是第二个存储库应该进入分支

A - B - C - D -  E -  F - G - H Repo1
           A1 - B1 - C1 Repo2

克里特

git init reponew

添加一个遥控器并获取旧的repo repo1

git remote add -f Repo1 ....outputRepo1

将文件从repo1/master合并为new/master

git merge Repo1/master --allow-unrelated-histories

新的存储库Reponew看起来像:

A - B - C - D -  E -  F - G - H master

现在,我已经在特定的提交和结帐

上创建了一个新的分支机构
git branch branchX 200303b0b215cc0fb2d92f50ffc9d7df8bbaab74
git checkout branchX

添加一个遥控器并获取旧的repo repo1

git remote add -f Repo2 ....outputRepo2

将文件从repo1/master合并为new/master

git merge -Xtheirs Repo2/master --allow-unrelated-histories

现在,新的存储库收益看起来像这样:

                 A1 - B1 - C1 branchX
                                     
A - B - C  - - - - - - - - - - - - - -
          
           D - E - - - - - F - G - H master

看来这是由合并日期为

的合并请求引起的

,但我像这样欠下它:

A - B - C - D - E - - - - - F - G - H master
          
            - - - A1 - B1 - C1 branchX

在之后,"移动"提交的主要方法是使用rebase。合并只能在两个历史中添加新的提交。
但是rebase并不能真正移动Commist,而是在指定的onto之后重播它们。因此,如果在旧提交中仍然有参考(分支或标签),它们将在整个提交历史记录中可用。

在您的情况下,您想将Repo2/master的历史记录到提交C

所以解决方案是:

git branch branchX --no-track Repo2/master
git rebase -Xtheirs 200303b0b215cc0fb2d92f50ffc9d7df8bbaab74 branchX

您应该得到想要的结果。


@Torek建议,也有filter-branchfilter-branch允许您通过在每个重写的提交上应用过滤器来重写提交历史记录。它主要用于删除错误承诺的敏感数据(例如密码),从历史记录中删除大文件或更改存储库的根文件夹。filter-branch的优点是它也将移动标签。
它还将用空消息过滤。

使用filter-branch,有一个--parent-filter允许您在过滤时更改提交的父。
它将过滤所有列出的引用,因此要移动标签,我们必须在当前branchXgit tag --merged branchX中列出所有标签,然后用--tag-name-filter cat进行过滤它们。

,命令将是:

git branch branchX --no-track Repo2/master
git filter-branch 
    --parent-filter 'test $GIT_COMMIT = <FULL-commit-id-of-A1> && echo "-p 200303b0b215cc0fb2d92f50ffc9d7df8bbaab74" || cat' 
    --tag-name-filter cat 
    -- branchX $(git tag --merged branchX)

然后,您将拥有重写的历史记录,但仍然可以使用 refs/original/前缀的参考文献。

如果可以,则可以删除原始引用(rm -rf .git/refs/original/),否则您可以还原它们(cp -r .git/refs/original/refs .git && rm -rf .git/refs/original/)。

最新更新