将多个git存储库合并为一个,保持分支历史。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (40)

我有四个不同的项目。他们有自己的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的历史,但我没有其他分支机构的历史。

提问于
用户回答回答于

那个解决办法和你尝试的差不多。只有当你的不同项目没有公共文件时才能工作(否则很难解决冲突)。

# 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最后一次提交之前有一些提交日期,但这不应该是一个问题(历史树将更容易阅读)

for i in $(git branch -r |grep projectA|awk -F'/' '{print $2}'); do
  git checkout $i projectA/$i
  git rebase $i main
done

但是,这会使树更加复杂,因为所有分支都将从main承诺..。

扫码关注云+社区