Git / CVS同步问题

时间:2015-12-10 07:27:24

标签: git synchronization cvs

背景

我们的团队正在使用存储在CVS中的代码库,该代码库由客户端管理 在任何可预见的未来,没有办法说服客户切换到Git。

因此,为了能够使用git的明显优势,我们想制作CVS repo的git副本,使用它并保持两个repos同步。

首次尝试

我们解决问题的第一个尝试是:

  • 结帐CVS回购
  • git initgit commit在同一目录中一次导入整个树
  • 对于每个新功能,我们制作一个git分支,执行这些操作,使用git-cvsexport,并使用cvs提交功能
  • 我们每运行半小时(croncvs updategit add .git commit将cvs中的新内容转移到git

这种方法有缺点 - 主要问题是CVS和git的历史不一样。

计划更改

因此,我们计划以here描述的方式切换到git cvsimport,或多或少。

问题

尽管如此,我们仍然可以对这种情况进行成像:

  • 我们在cvs上提交了Ac,在git上的master分支上提交了Ag(由git cvsimport制作),这些都是相似的
  • 我们制作了一个功能分支,我们在其上进行提交Xg
  • 我们使用git cvsexportcommitcvs commit在cvs上进行提交Xc
  • cvs解析提交文件中的$Id $个部分,并对文件进行实际更改
  • 我们运行git cvsimport从cvs导入更改。这会将Xc转移到git的主分支并进行提交Xg'

问题

我们如何告诉git提交XgXg'实际上是一回事?
根据{{​​3}},似乎没有办法做到这一点,因为内容是提交id的关键部分,而git只使用id来识别提交。

解决方法

为了解决这个问题,我想到了以下解决方案:

  • 我们可以使用git cvsimport制作补丁,并跳过由我们的团队创建的提交,而不是发布cvsps,我们会通过作者的电子邮件识别这些提交。这不会创建提交Xg',因此我们必须特别注意合适的分支合并。
  • 我们永远不会将功能分支合并到master中,所以我们永远不会有冲突。看起来很简单,但我想这会使功能分支变得有用,但仍然没有明确的git历史。

奖金问题

我们假设我们将从功能分支运行git cvsexportcommit。首先将功能合并到主分支会更好(意味着更容易维护)吗?问题git cvsexportcommit?会有什么不同吗?

或许,我们的整个想法都是错误的,我们应该考虑使用替代解决方案吗?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

是的,根据我们的经验,双向直播cvs< - > git镜像是一种微妙且容易出错的事情,需要手动保姆。我只有一种方式(提交cvs,实时镜像到只读git),这很难保持正确。

我们的存储库足够大,没有任何工具可以及时地进行增量更新,因为大多数(至少我们发现)并没有真正做到"增量"它们有效再次从头开始。所以我们使用viewvc 创建了一个cvs repo的数据库视图,然后我们可以在git中生成单独的提交。

您应该可以使用git cvsimport -k来杀死git端的CVS关键字。

我想是的,保留一份你自己团队的成员列表,并且使用cvs - > git工具执行特殊代码,这些代码将再次返回到git中会非常有意义。

我认为如果你基本上以同一方式进行同步,通过在仅在git中编写的分支中完成所有工作,会更简单。定期提交将简单地同步到CVS中。你可以通过定期与master合并来跟上git的最新状态。 (或者你所基于的任何CVS分支。)合并提交将作为"合并分支dev-git与master"一起提交回CVS。提交缺少git的合并感知合并提交内容。然后你可以有一个定期的合并窗口,在那里你可以与CVS团队安排,让你做相反的事情:用你的更改向CVS分支做一次提交。你标记了你的" dev-git"有意义的分支" feature_xyx_20160419" cvs中的提交注释将是"将dev-git合并到feature_xyz_20160419"。