将多个git存储库合并为一个,保留分支历史记录

Ana*_*URI 23 git merge github git-subtree git-branch

我有四个独立的项目.他们有自己的git存储库.和所有项目的分支名称相同.

 /project/
 /project/projA/
 /project/projA/.git/
 /project/projB/
 /project/projB/.git/
 /project/projC/
 /project/projC/.git/
 /project/projD/
 /project/projD/.git/
Run Code Online (Sandbox Code Playgroud)

所有git存储库都具有相同的分支名称,当然还有它们自己的主分支.

我想将所有项目合并为一个如此:

  /Project/.git/
  /project/projA/
  /project/projB/
  /project/projC/
  /project/projD/
Run Code Online (Sandbox Code Playgroud)

我想保留所有分支的历史.

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"
Run Code Online (Sandbox Code Playgroud)

  # 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"
Run Code Online (Sandbox Code Playgroud)

  # 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"
Run Code Online (Sandbox Code Playgroud)

项目合并但我只有V6-006的历史.但我没有其他分支的历史.

Ase*_*nar 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..
Run Code Online (Sandbox Code Playgroud)

结果将是一个存储库,其中包含项目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
Run Code Online (Sandbox Code Playgroud)

但这会使你的树更复杂,因为所有分支都将从main提交开始.

  • 我无法得到它的工作,它给出了一步错误`git的结帐masterA了projectA/master`的话说,'错误:pathspec"masterA"不匹配已知git`任何文件.我应该把什么放在"masterA"中? (2认同)
  • @przemo_li远程repo可以有url启动`http`,`user @ server`或`/ path/to/loca/dir`,所以我不明白为什么这不起作用.但你可以查看`git help clone`来查看一些有趣的选项(--no-hardlinks,--shared,...) (2认同)