1

我正在尝试将包含 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 中获得工作分支的任何建议?

4

1 回答 1

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

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

于 2013-03-18T15:50:36.493 回答