【问题标题】:How to fix branches of partial directory structure in SVN to Git migration如何修复 SVN 中部分目录结构的分支到 Git 迁移
【发布时间】:2013-03-06 18:17:49
【问题描述】:

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

【问题讨论】:

  • 你是怎么导入的?你试过git svn clone--stdlayout开关吗?
  • 我建议您将问题重命名为更具体的问题,例如“如何修复 SVN 中部分目录结构的分支到 Git 迁移”。
  • @desert69 我是使用svn2git导入的,但也尝试使用winklerweb.net/index.php/blog/4-eclipse/…中描述的方法,结果相同。

标签: git svn import branch svn2git


【解决方案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

第二步:重写分支恢复其他项目

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

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

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

【讨论】:

  • 还没有尝试过,但我担心假设会被打破。当我在 GIT 中签出 project3-production-branch 时,project3 文件夹消失了,所有文件最终都在 repo 的根目录中。从技术上讲,我可以移动它们并提交更改,但必须拥有其他文件才能使分支有意义。现在去看看这个。
  • 好的,这对问题很有帮助。如果您查看分支的历史,它是从主干开始(并且开始看起来合理)还是完全独立?第一次提交有很多删除和添加(可能重命名)?仍然可以解决这个问题,但首先需要单独传递filter-branch。在filter-branch 中搜索“将整个树移动到子目录中”。
  • 在尝试了概述的解决方案并进行了一些测试,并与 svn 和 svn 与分支进行了比较之后,现在看来一切正常,并且应该是这样。该解决方案按概述工作,但在父级(第 2 行)中的“主干”上确实出现错误(认为它说“没有这样的对象”)。尽管如此,重写工作正常(带有错误消息)。之后,我使用 git mv 从分支中移动了适当的文件夹,因此它们最终位于子文件夹中,而不是位于 repo 的根目录中。谢谢:)
  • 好的,那么分支已经被称为master(取决于你如何从SVN迁移)。我更新了我的答案,如果你用第一步重做,即使分支上较旧的提交也是正确的,因为你不必做git mv 提交。
猜你喜欢
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2021-09-24
  • 2016-02-02
相关资源
最近更新 更多