我有四个独立的项目。他们有自己的git存储库。和所有项目的分支名称相同。
/project/
/project/projA/
/project/projA/.git/
/project/projB/
/project/projB/.git/
/project/projC/
/project/projC/.git/
/project/projD/
/project/projD/.git/
所有git存储库都具有相同的分支名称,当然还有自己的主分支。
我想将所有项目合并为一个:
/Project/.git/
/project/projA/
/project/projB/
/project/projC/
/project/projD/
我想保留所有分支的历史。
ps - >我对所有回购都有相同的分支机构名称。 例如:用于所有四个项目的分支名称:V6-004
我尝试了 子模块 和 子树 ,但两者都没有解决问题。
我也试过了。
$ mkdir new_parent_project
$ cd new_parent_project
$ git init
# Now we need to create the initial commit. This is essential.
$ touch README.md
$ git add README.md
$ git commit -am "initial commit"
后
# merge project ProjA into subdirectory ProjA
$ git remote add -f ProjA http://GitUrl
$ git merge -s ours --no-commit ProjA/V6-006
$ git read-tree --prefix=ProjA/ -u ProjA/V6-006
$ git commit -m "merging ProjA into subdir: ProjA"
后
# merge project ProjB into subdirectory ProjB
$ git remote add -f ProjB http://GitUrl
$ git merge -s ours --no-commit ProjB/V6-006
$ git read-tree --prefix=ProjB/ -u ProjB/V6-006
$ git commit -m "merging ProjB into subdir: ProjB"
项目已合并,但我只有V6-006的历史。但我没有其他分支的历史。
答案 0 :(得分:12)
这个解决方案与您尝试的内容相差不远。 这仅适用于您的不同项目没有公共文件(否则可能难以解决冲突)
# create a new repo:
git init all_projects
cd all_project
# to make it more easy to understand, let's create a new branch
git checkout -b main
# import 1st project
git remote add projectA http://projectA
git fetch --all --tags
git checkout masterA projectA/master
git rebase masterA main
# move the main branch to the current state
git branch main -f
# Now your branch main is at the same state as your A project
# import 2st project
git remote add projectB http://projectB
git fetch --all --tags
git checkout masterB projectB/master
git rebase masterB main
# move the main branch to the current state
git branch main -f
# Now your branch main contains all commits from projectA and projectB
# etc..
结果将是一个存储库,其中包含来自项目A的所有提交,然后是来自项目B的所有提交,即使项目B在项目A的最后一次提交之前有一些日期提交,但这不应该是一个问题(和历史树将更容易阅读)
编辑:抱歉,我注意到这并没有解决您的问题,无法获得所有远程分支机构。也许您可以找到基于that question的解决方案,具体如下:
for i in $(git branch -r |grep projectA|awk -F'/' '{print $2}'); do
git checkout $i projectA/$i
git rebase $i main
done
但这会使您的树更复杂,因为所有分支都将从main
提交...