如何修复SVN中部分目录结构的分支到Git迁移

时间:2013-03-18 12:01:44

标签: git svn import branch svn2git

我正在尝试将包含Java EE应用程序的SVN存储库转换为Git存储库。原始存储库包含Java EE项目的每个部分的文件夹,该文件夹在历史记录中作为单独的项目进行维护。对于其中两个项目,还有一个“生产” - 分支(再次,两个独立的分支),每当新版本进入生产主干时,它就会合并到生产中。

当我将它导入一个单一的git存储库时(据我所知是最好的做法)master中的所有内容都很好,但是当我切换到分支时我只获得该分支的文件以及大多数其他文件夹和文件消失。

存储库布局:

/
trunk/
   project1/
   project2/
   project3/
   project4/
branches/
   project3-production-branch/
   project4-production-branch/
tags/

我发现了Eric Gwin关于这个问题的帖子,但我看不出有任何解决方案。 http://comments.gmane.org/gmane.comp.ide.eclipse.git/77

我可能会在这里忽略一些非常基本的东西,但我担心唯一的解决方案是单独导入项目?有关如何导入整个SVN-repo并在Git中获取工作分支的任何建议?

1 个答案:

答案 0 :(得分:1)

初始情况

将其转换为单个存储库后,master(或trunk)中的目录结构如下所示:

project1/
project2/
project3/
project4/

第一次提交project3-production-branch后的结构看起来像这样:

project3/

或者它直接包含project3的内容:

.project
src/
test/

这取决于从Subversion中复制分支的位置。

在第一种情况下,可以跳过下一步。

在这两种情况下,所有其他项目都在分支上被删除(您应该在第一次提交的差异中看到)并且需要恢复,请参阅第二步。

步骤1:重写分支以将所有内容移动到子目录(如果需要)

请参阅filter-branch中的“将整个树移动到子目录”中的示例,并仅在分支上执行该操作,如下所示:

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t\"*-&project3/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' \
     master..project3-production-branch

步骤2:重写分支以恢复其他项目

在此步骤中,我们要撤消在第一个分支提交中删除其他项目。这可以使用以下方法完成:

branch="project3-production-branch"
parent=`git merge-base $branch master` # or replace master with trunk if needed
paths="project1 project2 project4"
git filter-branch -f --index-filter \
"git reset -q $parent -- $paths" --tag-name-filter cat -- \
$parent..$branch

对于分支的所有提交,它会重置创建分支时所处状态的其他路径。