从cvs迁移到git

时间:2016-05-06 13:07:44

标签: git migration branch cvs git-merge

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

我有一些旧的CVS标签,只标记回购中的一些文件,并非全部。当我检查这些标签时,它看起来像一个已删除所有未标记的回购。这是cvs / svn和git之间分支模型的众所周知的差异。

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

  • 从我的主分支开始,并建立一个新的发布分支。
  • 仅替换标有tags/A
  • 的文件
  • 然后,只替换标有tags/B
  • 的文件
  • 然后全部投入。

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

有没有好办法呢?

2 个答案:

答案 0 :(得分:1)

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

可能会发现您只是拥有太多标签才能实现这一目标。我想2万个标签x 5分钟/标签= 34天。

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

此外,您的标签是否位于他们应该使用的指定分支上,这对您来说很重要吗?因为所有那些fixup提交他们都不会,即使你的修正。确保您的UNWIND分支以最优雅和最有意义的方式转换,同时让一些较旧的分支变得有点硬,这可能是务实的。

<强>更新

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

答案 1 :(得分: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

第一个命令是“结帐当前主人,但作为名为release的新分支:”。

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

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