我的 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需要。
我知道下面的答案,但他们没有解决我的问题。
答案 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。
创建 NewRepo
cd NewProject
git init
将 Repo1 和 Repo2 添加为submodule
,如
git submodule add https://.../Repo1 Project1
git submodule add https://.../Repo2 Project2
reset
特定快照的子模块
cd Project1
git reset [--hard] C
cd ../Project2
git reset [--hard] F
commit
快照C-F,以便日后恢复
commit -m 'release x.xx'
重复前面的步骤3,4,因为您需要同步时间点(A-C,G-F,G-R)
恢复任何同步点,如
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>