从cvs迁移到git时将稀疏标记合并到分支

从cvs迁移到git时将稀疏标记合并到分支,git,migration,branch,cvs,git-merge,Git,Migration,Branch,Cvs,Git Merge,我正在从cvs迁移到git。(如果你愿意,可以嘲笑,但前提是你的公司已经存在15年了。) 我有一些旧的CVS标记,只标记repo中的一些文件,而不是所有文件。当我查看这些标签时,它看起来就像一个回购协议,其中所有未标记的内容都已被删除。这是cvs/svn和git之间的分支模型的一个众所周知的区别 我想做一个这样的新分支: 从我的主分支开始,创建一个新的发布分支 仅替换标记为标记/A的文件 然后,除此之外,仅替换标记为标记/B的文件 然后把所有的都交出来 理想情况下,新分支将包含标记文件的旧历

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

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

我想做一个这样的新分支:

  • 从我的主分支开始,创建一个新的发布分支
  • 仅替换标记为
    标记/A
    的文件
  • 然后,除此之外,仅替换标记为
    标记/B
    的文件
  • 然后把所有的都交出来
理想情况下,新分支将包含标记文件的旧历史以及主分支


有没有一个好方法可以做到这一点?

现在在CVS中,您是否能够在事后为cvs2git脚本准备CVS repo?逐步浏览所有标记,并将缺少的文件添加到标记中
cvs标记本身,如果没有
,则-F
不会移动标记。因此,您可以基于标记/B重新应用标记/A,它将仅将其应用于尚未标记的文件,这正是您所需要的

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

但我不知道用git做是否会快得多。一旦进入git,就必须清理所有cvs2git工件:与每个标记关联的fixup提交等。但我可以想象,在理论上,一步一步地遍历每个标记,签出更多的文件,添加它们,修改提交(通过适当的GIT_u环境变量保留作者和日期),移动标记,将其与分支上的上一个提交进行比较,以防您只需将标记移回一个即可

另外,标记位于它们应该位于的命名分支上对您来说重要吗?因为有了所有这些修正提交,即使有了你的修正,它们也不会是。确保您的
master
分支以最优雅、最有意义的方式进行转换,同时让一些较旧的分支变得有些生硬,这可能是一种务实的做法

更新


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

现在在cvs中,您能够在事后为cvs2git脚本准备cvs repo吗?逐步浏览所有标记,并将缺少的文件添加到标记中
cvs标记本身,如果没有
,则-F
不会移动标记。因此,您可以基于标记/B重新应用标记/A,它将仅将其应用于尚未标记的文件,这正是您所需要的

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
结果可能是您的标签太多,无法实现这一点。我认为20000个标签x 5分钟/标签=34天

但我不知道用git做是否会快得多。一旦进入git,就必须清理所有cvs2git工件:与每个标记关联的fixup提交等。但我可以想象,在理论上,一步一步地遍历每个标记,签出更多的文件,添加它们,修改提交(通过适当的GIT_u环境变量保留作者和日期),移动标记,将其与分支上的上一个提交进行比较,以防您只需将标记移回一个即可

另外,标记位于它们应该位于的命名分支上对您来说重要吗?因为有了所有这些修正提交,即使有了你的修正,它们也不会是。确保您的
master
分支以最优雅、最有意义的方式进行转换,同时让一些较旧的分支变得有些生硬,这可能是一种务实的做法

更新

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

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
第一个命令是“签出当前主机,但作为名为release的新分支:”

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

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

第一个命令是“签出当前主机,但作为名为release的新分支:”

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


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

我从来没有这样做过,但我先看看
cvs2*
(从cvs2git开始)对它们做了什么。如果所有其他方法都失败了,只需手工操作:使用cvs2git转换大部分存储库,然后制作一些特例项,并使用过滤器分支和/或嫁接/替换将它们插入。这只有在你有一小部分的时候才实用,否则你可能也需要自动化。我从来没有特别需要这样做,但我会先看看
cvs2*
(从cvs2git开始)对它们做了什么。如果所有其他方法都失败了,只需手工操作:使用cvs2git转换大部分存储库,然后制作一些特例项,并使用过滤器分支和/或嫁接/替换将它们插入。这只有在你有一小部分的时候才实用,否则你可能也需要自动化。也许如果他想修复
标签/a
,那么配方中的git签出就可以了<