合并git项目没有共同提交

时间:2013-11-19 15:50:11

标签: git

现在我有几个用git跟踪的项目。现在,我想制作一个大项目,为以前的每个项目都有几个子文件夹,并保留他们的历史以及大项目的历史。

基本上我现在拥有的是

projecta/
projectb/
projectc/
bigproject/

我想要的是

bigproject/
    projecta/
    projectb/
    projectc/

这是否可能在不丢失历史的情况下实现?

干杯

2 个答案:

答案 0 :(得分:3)

你可以尝试:

#Preparing the repos: moving files in subdirectories
cd projecta
mkdir projecta
git mv file1 file2 dir1 dir2 projecta 
git commit -am "Moved file"
#Do it for each other repos

#Actually merging
git clone url_to_projecta bigproject
cd bigproject
git remote add b url_to_projectb
git remote add c url_to_projectc
git fetch --all
git merge b/master
git merge c/master

用简单的英语:你可以合并Git树,即使它们没有任何共同点,所以你只需要:

  • 进入你的一个回购
  • 取其他人(你现在有几棵没有共同提交的树)
  • 创建合并提交,合并这些树

就是这样。

如果你想拥有一个类似的文件系统:

bigproject/
  projecta/
  projectb/
  projectc/

最容易的是先处理它

答案 1 :(得分:0)

如果您可以保留4个回购,我认为这是使用git-submodules的完美案例。

如果您只想将它​​们合并到一个repo中,您可以将它们中的每一个用作新repo上的分支,然后将它们全部合并到一个repo中。

2 repos的样本说明

存储库设置(将创建两个存储库,一个位于proj/p1/p1,另一个位于proj/p2/p2

mkdir -p proj/p1/p1 proj/p2/p2 proj/merged
touch proj/p1/p1/f1 proj/p1/p1/f2 proj/p2/p2/f3
cd proj/p1/p1/ && git init && git add . && git commit -m "proj 1" && cd ../..
cd p2/p2/ && git init && git add . && git commit -m "proj 2" && cd ../..

我们现在将repo p1中的所有代码移动到其中名为p1的文件夹

cd p1/p1/ && git rm -r --cached "*" && cd ..
mv p1/.git . && git add . && git commit -m "moved" && cd ..

我们接下来将repo p2中的所有代码移动到其中名为p2的文件夹

cd p2/p2/ && git rm -r --cached "*" && cd ..
mv p2/.git . && git add . && git commit -m "moved" && cd ..

我们现在初始化一个全新的repo merged以获得所有合并的代码

cd merged && git init && touch f4 && git add . && git commit -m "init" && cd ..

将这个新的合并代码作为远程添加到p1p2,并将相应的代码从主分支作为项目名称推送到远程

cd p1 && git remote add merged ../merged/ && git push merged master:p1 && cd ..
cd p2 && git remote add merged ../merged/ && git push merged master:p2 && cd ..

我们现在可以转到新初始化的仓库并合并分支p1p2

cd merged && git merge p1 && git merge p2

我们完成了。简单的gitkgit log --pretty --oneline会显示所有提交给您的内容。