如何 git 克隆从多个 svn 项目构建的单个 svn 项目

How to git clone a single svn project that has been built from several svn projects

问题总结(详情如下)

如何克隆一个历史悠久的 svn 项目作为单个项目存储库,但它是由多个项目合并而成的,这些项目也有自己的历史。使用 svn 工具,可以无缝访问文件历史的完整长度,无论修改发生在项目融合之前还是之后。这是我们在迁移到 git 后试图实现的目标。

详情

正如其他人discussed,几年前我们已经从多个 svn 项目转移到单个 svn 项目。换句话说,我们从看起来像这样的东西开始

svnrepo/
   frontend/
      trunk
      branches/
         ng/
         ...
      tags/
         1.x
         ...
   backend/
      trunk
      branches/
         ng/
         ...
      tags/
         1.x
         ...

看起来像那样的东西

svnrepo/
    UnifiedProject/
        trunk/
            frontend/
            backend/
        branches/
        tags/

   frontend/
      trunk
      branches/
         ng/
         ...
      tags/
         1.x
         ...
   backend/
      trunk
      branches/
         ng/
         ...
      tags/
         1.x
         ...

请注意,尽管所有文件都已 svn-moved 从 svnrepo/submodule/trunk 到 svnrepo/UnifiedProject/trunk/submodule

,但原始组织仍然存在

这已经完成,在存储库级别使用一些 svn move 命令保留所有历史记录(包括以前从 CVS 到 SVN 的迁移)。假设这次重组发生在 日期 D

日期以来,统一的 svn 存储库积累了大量的历史。现在我们正在尝试从这个 svn 统一存储库迁移到单个 git 存储库。乍一看,这看起来比 this 简单得多,他们从多个 svn 移动到单个 git。但在那种情况下,存储库的统一版本本身还没有历史记录。

使用类似于 git svn clone http://svnrepo/UnifiedProject/ GitUnifiedProject 的命令乍一看效果很好。已检索所有文件、分支和标签。

然而,仔细查看文件历史,我们发现 日期 D 之前的所有历史都已丢失。 git svn clone 命令没有看到来自同一服务器的不同项目的 svn move

现在的问题是:如何从已移动的每个单独文件中检索完整的历史记录(甚至是 日期 D 之前的历史记录)?

另一个灵感来自于此link 这使得同一存储库的两个版本之间存在 link。我在项目的一小部分尝试了这个。比方说 frontend 文件夹。嗯,这个 frontend 与旧存储库的布局不同,因为它现在在 UnifiedProject 新存储库中。似乎将上面的两个 links 结合起来可能是一种不错的方法,但我还没有想出如何做到这一点。

也许另一种方法是直接在其根目录下克隆整个 svn 存储库。这将是巨大的,因为我已经过度简化了上面的结构,并且其他不相关的项目也在回购中。让我们说这是可能的。是否会使目标更容易实现,也许通过手动删除与 UnifiedProject 无关的所有历史记录和项目 (cf this and this)

有没有人试验过类似的用例?

我找到了工作流程。 首先,使用 here 描述的技术,可以 git svn clone 每个单独的存储库并分别重新组织它们,使它们看起来像在统一存储库中所期望的那样。 像这样:

git svn clone --stdlayout http://svnrepo/frontend frontend
cd frontend
mkdir frontend
git mv !(frontend) frontend
git commit -a -m “Moving frontend project into its own subdirectory”

假设您有 git init 一些 StitchingHistory 存储库。然后在此 repo 中,您可以添加所有个人 repo(例如:frontend)。这里的重要选项是 --allow-unrelated-histories

cd ../StitchingHistory
git remote add frontend ../frontend
git fetch frontend
git checkout -b feature/merge-frontend #You can also do this directly on master by omitting this command
git merge --allow-unrelated-histories frontend/master

对所有单独的存储库完成此操作后,请确保所有内容都已合并到 master 分支上。然后,您应该拥有一个在 date D 之前具有完整历史记录的 master,它也恰好具有与您的 repo post-date D[ 相同的目录结构=29=]。

有了它,您可以使用像 previously mentioned 这样的挑选来在 UnifiedProject 开始之前粘合缝合的历史回购。