问题标签 [reposurgeon]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
155 浏览

mercurial - 将 git-fast-import 流增量导入到 Mercurial?

我正在转换一些较旧的存储库,并根据需要对它们进行拼接和切割,以获得一个未来的存储库。历史上的一些疤痕组织(其中大部分是由于以前的 VCS 中的语义造成的)也必须去除,但总的来说,转换似乎很顺利。

只是需要很长时间。

背景:我正在使用reposurgeon基于git-fast-import流的工作。目标格式是 Mercurial。

如何在旧 VCS 仍处于活动状态时导入引入到旧 VCS 中的新代码增量,这样我就不必每次都运行完整的转换例程?

0 投票
0 回答
205 浏览

svn - 稍后使用“hg 移植”来拼接另一个存储库的内容

如果您想了解实际问题,请滚动到问题的底部。我只是觉得有必要解释一下情况。

事态

在我们公司,由于历史原因,我们有几个版本控制系统。目前我们正在尝试迁移到任何 git-fast-import兼容的分布式版本控制系统,真的,但我们目前的选择是 Mercurial。我现在说,因为一旦你迈出了这一步,在大多数情况下,从一个 DVCS 迁移到另一个 DVCS 会更容易。

我们基本上有三个我们想要加入的代码库以及一个已经提交到一个 SVN 存储库中的部分,我们想要将其分离出来。

所以我们有:

  1. 一个古老的 CVS 存储库
  2. 一个巨大的 (26 GiB) SVN 存储库,其中包含近 7000 个修订版,其中包含大量代码、一些实验性代码和实际垃圾(在转换过程中被过滤掉)以及来自不同版本的构建产品——它们旨在被分离到一个存储库中甚至只是他们自己的文件夹结构)
  3. 一个包含相关代码的 SVN 存储库,但不与其他两个共享文件(将其视为作为文件夹拼接)

巨大的 repo ( 2. ) 包含 CVS repo ( 1. ) 在不同时间点的状态快照。显然,CVS 存储库中没有任何标记,因为这可能很有用。最重要的是,快照在该快照状态之上应用了补丁。

也就是说2.中的一个子文件夹层次结构大致对应于1 .. 但是,无需担心它,因为我们的想法是在最初将其中一个文件夹拼接到不同的路径名下之后停用它们。所以这里没有命名冲突。

到目前为止我所做的

  • 经过一些研究,我选择了reposurgeon作为我选择的工具。这是一个非常强大的工具,实际上可以在git-fast-import流上进行外科手术。我热情地向任何负责类似迁移的人推荐它。
  • 至此,庞大存储库的转换已完全覆盖。文件和文件夹已被删除,旧符号已被删除。问题已被解决,诸如关闭分支(在 SVN 中)然后从另一个同名修订版中重新打开它之类的问题已得到修复,以使它们看起来是连续的。基本上所有的手术都做完了。(结果是 ~350 MiB 作为git-fast-import流,顺便说一句)
  • 较小的 SVN 存储库也主要包括在内,尽管仍有一些小任务。但是,由于我从庞大的 SVN 存储库中获得的经验,我相信这只是几个小时的事情。
  • 最后但并非最不重要的 CVS 存储库。我尝试了许多不同的工具,包括cvs-fast-export现在由 Eric S. Raymond 维护的reposurgeon. 我还考虑过转换为 SVN,只是发现cvs2svn用于执行此操作的工具集 () 也已扩展为导出到 Mercurial。

问题

虽然 SVN 转换需要很长时间才能达到我们可以称之为完成的地步,但 CVS 转换仍在进行中。

由于 CVS 没有存储库范围的修订历史记录,所有工具都必须尝试解析 RCS 文件并理解其内容以拼凑拼图。

通过在编辑器中编辑锁定的 RCS 文件(备份后),我能够手动删除一些非常糟糕的伤疤。这样,一些无效的修订(RCS 和 CVS 对什么是有效修订号有不同的想法)以及在某些文件中作为标记出现的符号和在其他文件中作为分支出现的符号已被清除。

我还能够预处理(CVS)存储库以删除我们不需要的许多分支和标签,在我们感兴趣的分支之前(rcsfile.py来自rcsgrep帮助)。基本上在那个特定点之前,我们只想要MAIN/ trunk/ default/的内容master,不管你想怎么称呼它。

但是,一些工具完全失败(例如cvs-fast-export崩溃),而另一些工具给出的结果有些混乱。

还不错,可以通过reposurgeon. 但是,六个分支甚至从未进入转换后的存储库。

例如,原因似乎在所有情况下,所有工具都会被您在 SVN 中找不到的特定特性所迷惑。

如果分支标签被强制“移动” cvs tag -B(但是,旧版本仍保留在文件中。

现在,新分支可能在原始分支发生后数小时、数天或数月开始。这似乎是让所有这些工具感到不安的原因。

虽然将孤立的分支也包括在内并修补那些“伤口”会很酷,但这不是优先事项。处理的大多数文件cvs tag -B不是源文件,而是类似文件GNUmakefile或其他项目文件。

但是,问题仍然存在,CVS 转换还没有完成,还需要一些时间。

经理们变得不耐烦了……

问题

是否可以先将两个 SVN 存储库拼接到一个 Hg 存储库中,然后(当 CVS 转换完成时)在这些更改中拼接,而无需初始化另一个不相关的 Hg 存储库?

(CVS repo)拼接不会导致路径冲突,我必须提前说。另一个存储库旨在通过其自己的子目录进行拼接,因此不会发生名称冲突。

我知道推送和拉取可以将两年前的提交引入今天某人的存储库。但是,这是否意味着 ahg transplant也有可能成功?即我可以期望能够将十年前的那些提交移植到联合 Hg 存储库中吗?

这样我可以将迁移分成几个阶段。

  1. 将两个 SVN 存储库合并为一个 Hg 存储库 - 基本上是现在
  2. 从现在开始的几周/几个月内,在转换后的(到 Hg 的)CVS 回购中拼接

通过(或任何其他扩展)这在技术上是否可行?hg transplanthg

如果是这样,我也会感谢有关潜在警告的任何建议。

0 投票
2 回答
274 浏览

git - Reposurgeon 创建分支而不是标签

我正在尝试按照本教程将 CVS 转换为 GIT:http: //www.catb.org/~esr/reposurgeon/dvcs-migration-guide.html

总体上看起来不错,但是对于某些 CVS 标记(看起来它从存储库中的某个时间点开始,然后再执行)而不是 GIT 标记,创建了 GIT 分支。

知道为什么首先创建分支而不是标签吗?

这些主要是由自动构建工具(基本上每个构建一个)+发布分支(每个发布一个)构建时创建的分支。有数百个,所以我想确保它们不是作为分支创建的,而是作为标签创建的。

reposurgeon 是否能够做到这一点,甚至是适合这项工作的工具吗?

仅供参考 - 做这个答案:https ://stackoverflow.com/a/16404411/3821009提供:

结果是:

所以看起来这里有些东西没有正确连接。你知道这可能是什么原因吗?

0 投票
1 回答
130 浏览

git - 如何将一组 mercurial 存储库转换为 git 存储库?

我有的

我目前有一组包含源代码的 mercurial 存储库。他们对分支使用“分叉存储库”方案。因此,功能“分支”可能如下所示:

一旦cool_feature准备好进入黄金时段,我们hg pull将其转换为 master ,使其看起来像这样:

到那时,cool_feature将具有与它相同的东西,master并且可以将其丢弃。

尽管D→E→F在某些时间点位于单独的存储库中,但它们始终位于 mercurial 中的“默认”分支上。我们不使用命名分支来管理这些数据。

这在 mercurial 中运行良好,但我们正计划迁移到 git 并且 git 做的事情有点不同。当然,您仍然可以在 git 中创建 repos,但 git 分支是短暂的,因此可用于短期分支。

我想要的是

我想将其转换为单个 git 存储库,该存储库使用分支来管理仍在库存中的工作。在流程方面,我们将基本上使用“git flow”。拉取请求将在分支之间,一旦工作完成,分支将被删除。

我试过的

我不能简单地使用 hg's convert,因为它不理解多个存储库。事实上,整个 hg-git 生态系统中的每个工具似乎都想将 git 分支转换为 hg 分支,反之亦然。(尽管有证据表明各个社区在实践中使用它们的方式非常不同。)

一个想法是将它们拉到一个存储库中,对其进行转换,然后让 git 对其进行排序。毕竟,git 只需要标记头部。这个想法的问题是大多数工具拒绝转换多头存储库,如果他们这样做了,git 会像往常一样悄悄地丢弃未标记的头。如果有可能在事后给它们贴上标签,我还没有弄清楚。

另一个想法是,在 mercurial 中,将这些变更集移动到命名分支,并让存储库转换器完成工作。这很棘手,因为分支并不总是从一个点开始:

这种情况通常发生在两个开发人员一起开始一个项目时,但最终没有与他们的起点完全相同的变更集。但是没有一个点可以选择作为创建分支的“上线”。

另一个棘手的情况是当第一个修订是合并时:

这里,分支的“根”是和E之间的合并。鉴于它是一个合并修订版,我还不清楚你如何将它重新设置为一个新分支。CD

由于其他原因,我已经通过 reposurgeon 运行转换,所以我可以使用一些相当精美的工具来在飞行中对其进行修改。但是每次转换都需要大约 20 个小时,因此尝试一堆不成功的东西被证明是非常昂贵的。

但似乎既然人们确实从 hg 转换为 git 并且这些都是常用的分支方案,那么肯定有人已经解决了这个问题。欢迎任何关于使用什么工具或尝试什么策略的想法。如何做到这一点?

0 投票
2 回答
102 浏览

git - 使用 reposurgeon 将 svn repo 转换为 Git 时如何跳过前 N 次提交?

使用 reposurgeon 将 subversion 存储库转换为 Git 时,如何跳过前两次提交?

第一次 svn 提交使用错误的分支布局 ( trunk, tags, branches) 导入代码,第二次提交将其全部删除。

第三次提交是对正确分支布局 ( subdir/trunk, subdir/tags, subdir/branches) 的导入。

这个错误的开始似乎让 reposurgeon 感到困惑,因为生成的 Git 存储库只有一个提交:最初的错误开始。以后的所有提交都将被忽略。

这是我尝试过的:

0 投票
3 回答
3927 浏览

git - 将 Git 存储库从 ISO-8859-1 切换为 UTF-8 编码的源代码文件

本周末我将使用fast-export将一个大型 Mercurial 项目转换为 Git 。我已经测试了几次,结果很好。

我们还想将我们的源代码编码(许多带有变音符号的德语注释/字符串文字)从 ISO-8859-1 转换为 UTF-8(repo 中的所有其他非 java 文件应保持原样),并且Git 迁移为我们提供了一个机会,因为无论如何每个人都需要再次克隆。但是,我没有找到一个好的方法。

  1. 我已经尝试过git filter-tree --tree-filter ...来自SO 的评论中的方法。然而,虽然这看起来很理想,但由于存储库的大小(大约 200000 个提交,18000 个代码文件),这将花费比我周末更多的时间。我已经尝试直接从具有 72 个内核的 linux VM 上的 64GB tmpfs 卷运行它(在一个高度优化的版本中,文件列表被分块并且子列表被并行转换(使用GNU 并行)),它仍然会需要几天...
  2. 或者,我尝试了一种简单的方法,即在任何活动分支上单独执行转换并提交更改。但是,结果并不令人满意,因为在合并或挑选预转换提交时,我几乎总是会遇到冲突。
  3. 现在我再次运行方法 1,但没有尝试重写所有分支的完整历史记录(--allas <rev-list>),而是仅从当前活动分支可访问的所有提交,并且无法通过某些过去的提交(希望)是所有当前的前身分支(branch-a branch-b branch-c --not old-tag-before-branch-a-b-c-forked-offas <rev-list>)。它仍在运行,但我担心我不能真正相信结果,因为这似乎是一个非常糟糕的主意。
  4. 我们可以像方法 2 一样使用正常提交来切换主分支中的编码,但这又会使从/到主控的樱桃采摘修复成为一场灾难。而且它会引入很多编码问题,因为开发人员在主分支和非转换分支之间切换时肯定会忘记更改他们的 IDE 设置。

所以现在,不知何故,我觉得最好的解决方案可能就是坚持 ISO-8859-1。

有人有想法吗?有人提到,也许reposurgeon基本上可以使用它的transcode操作来完成方法 1,其性能要好得多,git filter-tree --tree-filter ...但我不知道它是如何工作的。

0 投票
1 回答
243 浏览

git - 使用 reposurgeon 将多项目 Subversion 存储库迁移到 Git

我正在尝试使用 reposurgeon 将 Subversion 存储库转换为 Git,该存储库包含多个具有以下布局的项目:

我试过这个 reposurgeon 脚本:

但结果是一个 Git 存储库,每个组都有一个分支。

有没有办法将转换限制为单个项目?

0 投票
0 回答
46 浏览

git - 如何告诉 reposurgeon 转换带有空格标签的 SVN 存储库?

我尝试使用 reposurgeon 4.0 来转换带有空格标签的 SVN 存储库(例如V 4.1.x snapshot)。

让我们考虑一下我实际上需要这样的标签(并且有十分之一)。删除这些标签不是一种选择。另外,我不想使用其他工具,因为我想评估这个工具。

我想告诉工具将其重命名为 V_4.1.x_snapshot,因此我尝试在 .lift 文件中使用命令。我尝试了下面列出的几种语法,但它总是失败,并在 conversion.log 文件上显示脚本中止消息。

后一个是假设可以在那里使用正则表达式的试验。

另外,我想了解如何告诉 reposurgeon 保留空文件夹。

有人可以帮忙吗?最好的问候 JL

0 投票
1 回答
248 浏览

git - 使用 reposurgeon 将没有中继的 svn 存储库迁移到 git

我正在尝试将旧的 svn 存储库转换为 git。在阅读了几篇描述使用 git-svn 执行此任务的缺点的文章之后,特别是对于具有非标准布局的存储库,我决定尝试一下 reposurgeon。在最初使用来自 Ubuntu 软件包源 (4.3) 的版本后,我切换到最新的版本(4.14;从源代码构建)以防万一。

遗憾的是,到目前为止,我只能生成一个空的 git 存储库。似乎我无法弄清楚如何正确使用 reposurgeon。

这是我要转换的 svn 存储库的基本结构:

  • 分支机构
    • 1.0.x
    • 1.1.x
  • 标签
    • 发展
      • 1.0.0
      • 1.0.1
      • 1.0.2
      • 1.1.0
    • 生产
      • 1.0.0
      • 1.0.1

存储库中还有更多内容,但这就是它的要点。这里要注意的重要一点是

  1. 没有后备箱
  2. 标签结构不平坦

现在我正在尝试运行最少的步骤。我使用http://www.catb.org/~esr/reposurgeon/repository-editing.html#quickstart作为指导方针,因此在为存储库创建作者地图后,我执行了以下操作:

当我read project-mirror在 reposurgeon 中运行时(project-mirror 是我使用 repotool 创建的镜像的目录),我得到以下输出:

首先创建一个 SVN 转储(使用repotool exportsvnadmin dump在我的本地镜像上)并读取它会导致相同的结果。

运行rebuild project-git产生以下结果:

这将创建一个空的 git 存储库:没有提交、没有分支、没有标签。我不希望我在上面发布的命令链会导致我想要的结果(毕竟文档中甚至提到到达那里是一个迭代过程),但我希望至少有一些提交和/ 或 git 存储库中的分支。

任何正确方向的指针将不胜感激。

PS:还需要注意的是,在此过程中,SVN 服务器可以而且不得以任何方式进行更改。我只有对相关存储库的读取权限。我对此 SVN 服务器没有任何形式的管理访问权限。

0 投票
0 回答
66 浏览

git - Windows 上的 Reposurgeon

是否可以reposurgeonWindows不闯入代码的情况下使用?或者这是Linux唯一的工具吗?基本上我崩溃了:

输出:

reposurgeon: 0: 忽略空存储库

但是我已经设置REMOTE_URL了变量Makefile

对于 svn,将 REMOTE_URL 设置为指向要转换的远程存储库;您可以为此使用 svn: URL 或 rsync: UIRL。

在 Linux 上,我有相同的设置,而且 Linux 似乎没有任何问题。