【问题标题】:merging a sparse tag to a branch when migrating from cvs to git从 cvs 迁移到 git 时将稀疏标记合并到分支
【发布时间】:2016-05-06 13:07:44
【问题描述】:

我正在从 cvs 迁移到 git。 (如果你愿意,可以嘲笑,但前提是你的公司已经存在 15 年。)

我有一些老式的 CVS 标记,只标记 repo 中的一些文件, 不是全部。当我查看这些标签时,它看起来就像一个仓库,其中所有未标记的内容都已被删除。这是 cvs/svn 和 git 之间分支模型的一个众所周知的区别。

我想创建一个这样的新分支:

  • 从我的主分支开始,创建一个新的发布分支。
  • 仅替换带有tags/A 标记的文件。
  • 除此之外,仅替换带有tags/B 标记的文件。
  • 然后提交全部内容。

理想情况下,新分支将包含标记文件的旧历史记录以及主分支。

有什么好办法吗?

【问题讨论】:

  • 我从来没有特别需要这样做,但我会先看看cvs2*(从 cvs2git 开始)对它们做了什么。如果所有其他方法都失败了,只需手动完成:使用 cvs2git 转换大部分存储库,然后制作一些特殊情况项目,并使用 filter-branch 和/或嫁接/替换将它们楔入。这只有在你有一个一小部分,否则您可能也需要自动化。

标签: git migration branch cvs git-merge


【解决方案1】:
git checkout -b release master
git merge --no-commit -s ours tags/A tags/B
git checkout tags/A -- .
git checkout tags/B -- .

git commit  # put the above sequence in the commit message if you have love in your heart

第一个命令是“checkout the current master but as the new branch named release:”。

第二个是“设置但不提交来自标签/A 和标签/B 的无操作合并”。在提交之前,您可以安排任何您想要的合并结果。

…特别是第三和第四个命令加载这两个提交中的版本。

【讨论】:

  • 如果他想修复tags/A,那么配方中的git checkout可以是git checkout -b fixA tags/A~。新的提交将在与tags/A 相同的父级之上创建。然后tags/A 可以移动到fixA(或者甚至fixA~,如果它们是相同的)。 (同样,对于提交,您将需要设置各种 GIT_AUTHOR 等环境变量,以赋予其与 tags/A 最初相同的作者/提交者/日期。)
【解决方案2】:

您现在是否能够在 CVS 中为 cvs2git 脚本准备您的 cvs 存储库?逐步检查所有标签并将缺少的文件添加到标签中。 cvs tag 单独使用,没有 -F 将不会移动标签。因此,您可以根据 tag/B 重新应用 tag/A,它只会将其应用于尚未标记的文件,这正是您想要的。

结果可能是您的标签太多,无法实现这一点。我在想 20,000 个标签 x 5 分钟/标签 = 34 天。

但我不知道在 git 中执行它是否会快得多。一旦你在 git 中,你就必须清理所有的 cvs2git 工件:与每个标签相关的修复提交等。但我可以想象,理论上,逐步检查每个标签,检查更多文件,添加它们,修改提交(通过适当的 GIT_ 环境变量保留作者和日期),移动标签,将其与之前的提交进行比较实际上在分支上,以防您可以将标签移回一个。

另外,您的标签位于它们应该位于的命名分支上对您来说很重要吗?因为所有这些修复提交都不会,即使是您的修复。确保您的 master 分支以最优雅和最有意义的方式转换可能是务实的,同时让一些较旧的分支有点硬。

更新

只是一个疯狂的想法。做 cvs2svn,修复标签,然后 svn2git 是否有意义?我知道这听起来有点疯狂,但是 subversion 具有 git 的变更集,但能够像 cvs 一样在逐个文件的基础上工作,因此它可能是修复标签的最佳位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2016-11-24
    相关资源
    最近更新 更多