重新组合git存储库并保留分支

时间:2014-11-17 18:03:39

标签: git

我们的应用程序由于遗留原因而分布在大约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的副本,但不讨论保留分支。

1 个答案:

答案 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脚本,允许您从子项目的任何分支拉出。