现在我有几个用git跟踪的项目。现在,我想制作一个大项目,为以前的每个项目都有几个子文件夹,并保留他们的历史以及大项目的历史。
基本上我现在拥有的是
projecta/
projectb/
projectc/
bigproject/
我想要的是
bigproject/
projecta/
projectb/
projectc/
这是否可能在不丢失历史的情况下实现?
干杯
答案 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中。
存储库设置(将创建两个存储库,一个位于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 ..
将这个新的合并代码作为远程添加到p1
,p2
,并将相应的代码从主分支作为项目名称推送到远程
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 ..
我们现在可以转到新初始化的仓库并合并分支p1
,p2
cd merged && git merge p1 && git merge p2
我们完成了。简单的gitk
或git log --pretty --oneline
会显示所有提交给您的内容。