Git:两​​个项目,每个项目都在一个回购中。将子目录中的新回购与单个线性历史相结合

时间:2015-10-29 11:35:49

标签: git

我的 Repo1 Repo2 分别包含 Project1 Project2 。每个回购都有自己的历史:

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

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

我想创建 NewRepo ,其中包含 NewProject NewProject 包含 Project1 Project2 作为独立的子目录。两个回购的历史应该合并为一个线性历史。

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

Q Git HowTo需要。

我知道下面的答案,但他们没有解决我的问题。

3 个答案:

答案 0 :(得分:0)

这是一个简单的描述,可能会错过重要的部分,但也许会引导你走向正确的方向。

首先创建新的repo(假设存储库位于目录结构中的相同位置)

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,但该工具不在我的舒适区域内。

答案 1 :(得分:0)

这不是我要求的,但它令人满意地解决了我的问题。

作为起点,我使用了this answer

  1. 创建 NewRepo

    cd NewProject
    git init
    
  2. Repo1 Repo2 添加为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
    

答案 2 :(得分: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>