Git:两个项目,每个项目在一个仓库中。在新的仓库中合并为子目录,具有单一的线性历史记录

3

我有一个名为Repo1和一个名为Repo2的仓库,分别包含Project1Project2。每个仓库都有自己的历史记录:

Repo1 / Project1
   history: A -> C -> G -> L

Repo2 / Project2
   history: B -> F -> R

我想创建一个名为NewRepo的仓库,用来托管NewProjectNewProject包含Project1Project2作为独立的子目录。两个仓库的历史记录应该合并成一个单一的线性历史记录。

NewRepo / NewProject
            |_ Project1
            |_ Project2
   history: A -> B -> C -> F -> G -> L -> R

Q 需要Git使用指南。


我知道下面的答案,但它们不能解决我的问题。


首先创建第三个仓库,将两个分支推送到其中(使用不同的名称)。然后问问自己:是否有一种模式可以根据这两个分支的提交来合并?例如,您可能希望按时间顺序排列提交。在这种情况下,您可以按照https://dev59.com/OoPba4cB1Zd3GeqPtYr5#25930104中概述的过程进行操作。 - jub0bs
@Jubobs 两个仓库都是通过 git tfs clone .. 创建的,不包括分支,但仍然包含大量合并提交,所以我卡在了挑选提交上。不幸的是,我找不到将合并提交铺平成单一线性历史记录的方法。 - participant
这回答解决了你的问题吗?[如何合并两个Git存储库?](https://dev59.com/O3M_5IYBdhLWcg3wUxdB) - Inigo
3个回答

0

使用 git subtree 就是这么简单

cd NewRepo
git init
# commit something pointless to have one commit in NewRepo
git subtree add --prefix=Project1 path/to/Repo1 <branch>
git subtree add --prefix=Project2 path/to/Repo2 <branch>

0

虽然不完全符合我的要求,但已经满足了我的需求。

作为起点,我使用了这个答案

  1. 创建NewRepo

    cd NewProject
    git init
    
  2. Repo1Repo2作为submodule添加,如下所示

    git submodule add https://.../Repo1 Project1
    git submodule add https://.../Repo2 Project2
    
  3. reset子模块到特定快照

    cd Project1
    git reset [--hard] C
    cd ../Project2
    git reset [--hard] F
    
  4. commit C-F 快照,以便未来方便还原

    commit -m 'release x.xx'
    
  5. 重复上述步骤 3,4,每当需要一个同步点时 (A-C, G-F, G-R)

  6. 还原任何同步点,如下所示

    git reset [--hard] 'release x.xx'
    git submodule update
    

0

这只是一个简单的描述,可能会漏掉重要的部分,但也许它会引导你朝着正确的方向。

首先创建新的仓库(假设仓库在目录结构中的相同位置)

mkdir -P NewRepo/NewProject
cd NewRepo
git init

然后逐个添加您的旧存储库

git remote add repo1 ../Repo1
git fetch repo1  # This will add Repo1 including the git history to NewRepo

然后将您的分支移动到Repo1中正确的位置。假设您在Repo1中顶部有一个主分支,您可以执行以下操作:

git reset --hard repo1/master

或者

git checkout repo1/master

现在你可以将文件移动到正确的目录中。添加并提交。
mv Project1 NewProject
git add NewProject
git commit -m 'Moved Project1 to NewProject'

接下来Repo2的步骤也是一样的。

这里你可能想要移除远程仓库。

git remote remove repo1
git remote remove repo2

历史记录不应该是一个大问题。gitk --all会以正确的方式显示历史记录。如果您想更改顺序,您可以随时使用git rebase -i
git rebase -i <oldest commit to handle>

这将启动您喜欢的编辑器,并列出所有提交。在这里,您可以重新排列它们的顺序。当您保存并退出编辑器时,git 将从您所在的位置应用更改。也就是说,旧的历史记录将保留。

如果您真的非常想改变历史记录,您还可以使用命令 git filter-branch,但是那个工具超出了我的舒适区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接