我们的应用程序由于遗留原因而分布在大约200个git存储库中,并且它成为一个噩梦,因为每个开发都会影响多个存储库,我们在拉取请求的集成过程中会花费大量时间。
因此我们希望迁移到一个单一的git存储库。
但是,由于有几个用户正在对这些存储库进行主动开发,因此我们不希望在迁移到一个存储库期间放弃任何正在进行的开发(分支)。
由于图表中的所有内容都更清晰,我们希望从这种扁平结构出发:
- ProjectA (branch master, dev1, fix1)
- ProjectB (branch master, dev1)
- ProjectC (branch master, dev2, fix1)
到这个层次结构,只有一个主要的git存储库:
Project (branch master, dev1, dev2, fix1)
|- projectA
|- projectB
|- projectC
Git subtree merge似乎是最初的方法,我们可以轻松导入项目A,B和C,但仅限于一个分支,例如 master 。如果我尝试分支 Project 并导入另一个分支,如 dev1 , git read-tree 拒绝我,因为文件已经存在... < / p>
我怎样才能做到这一点?
编辑:这看起来像是this question的副本,但不讨论保留分支。
答案 0 :(得分:0)
我有一个带有一些小脚本的项目,可以使用git(和Redmine)。其中一个从远程URL添加git子树。远程名称与子树合并项目的名称相同。您可以从那里简单地git fetch <remote>
,然后获得子项目的所有分支。
该项目在Github:https://github.com/subogero/redgit
git-addsubtree
脚本:
#!/bin/sh
url=$1
if [ -z "$url" ]; then
echo Please specify subtree URL
exit 1
fi
remote=$(echo $url | sed -r -e 's|^.+[:/]([^:/]+)$|\1|' -e 's/\.git$//')
echo Remote: $remote
branch=$2
[ -z "$branch" ] && branch=master
echo Branch: $branch
root=$(git rev-parse --show-toplevel)
prefix=$(pwd | sed -r -e "s:$root::" -e 's:^/(.+)$:\1/:')
subtree=${prefix}${remote}
echo Subtree: $subtree
git remote add -f $remote $url
[ $? = 0 ] || exit 0
git merge -s ours --no-commit $remote/$branch
if [ $? != 0 ]; then
git remote rm $remote
exit 2
fi
git read-tree --prefix=$subtree/ -u $remote/$branch
git commit -m "Add subtree $subtree from $url"
项目的Makefile将其复制到/usr/lib/git-core
,以便您可以像git addsubtree <URL>
一样使用它。还有一个git-pullsubtree
脚本,允许您从子项目的任何分支拉出。