现在我有几个使用Git跟踪的项目。现在,我想创建一个大型项目,其中包含以前每个项目的多个子文件夹,并保留它们的历史记录,同时还要保留大型项目的历史记录。
所以基本上我现在拥有的是
projecta/
projectb/
projectc/
bigproject/
And what i want is
bigproject/
projecta/
projectb/
projectc/
不丢失历史记录还有可能实现吗?
干杯
现在我有几个使用Git跟踪的项目。现在,我想创建一个大型项目,其中包含以前每个项目的多个子文件夹,并保留它们的历史记录,同时还要保留大型项目的历史记录。
所以基本上我现在拥有的是
projecta/
projectb/
projectc/
bigproject/
And what i want is
bigproject/
projecta/
projectb/
projectc/
不丢失历史记录还有可能实现吗?
干杯
您可以尝试以下方法:
#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/
git merge
不会让你轻易地合并没有共同历史的分支。(至少在我需要它的时候它没有这样做,最后我用 git filter-branch
做了一些非常丑陋的事情来解决它) - JB.如果您可以维护4个仓库,我认为这是使用git-submodules的完美案例。
如果您想将它们合并为一个单独的仓库,您可以将每个仓库用作新仓库上的分支,然后将它们全部合并到一个仓库中。
仓库设置(将创建两个仓库,一个在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 ../..
我们现在将存储库 p1
中的所有代码移动到名为 p1
的文件夹中。
cd p1/p1/ && git rm -r --cached "*" && cd ..
mv p1/.git . && git add . && git commit -m "moved" && cd ..
p2
的文件夹中。cd p2/p2/ && git rm -r --cached "*" && cd ..
mv p2/.git . && git add . && git commit -m "moved" && cd ..
现在我们初始化一个全新的仓库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
命令将向您展示所有提交。
bigproject/
路径里面已经有什么东西了吗?还是只是一个用来接收projectA
、projectB
、projectC
文件夹的占位符? - JB.