【问题标题】:Git / CVS synchronization issueGit/CVS 同步问题
【发布时间】:2016-03-15 17:46:17
【问题描述】:

背景

我们的团队正在使用存储在 CVS 中的代码库,该代码库由客户管理。
在任何可预见的未来,都无法说服客户改用 Git。

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

第一次尝试

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

  • 结帐 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' 实际上是同一件事?
根据this post 的说法,似乎没有办法做到这一点,因为内容是提交 id 的关键部分,而 git 只使用 id 来识别提交。

解决方法

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

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

额外问题

我们假设我们将从功能分支运行git cvsexportcommit。首先将功能合并到主分支会更好(意味着更容易维护),然后他们发出git cvsexportcommit?会有什么真正的不同吗?

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

提前谢谢你。

【问题讨论】:

  • 分支在 cvs 和 git 中是否都可读和可写,或者是某些 git-writes-only 和其他 cvs-writes-only? (如果两个人都必须能够写作,那你就是在自找麻烦。)我不想给出一个冗长的详细答复,只是为了发现我在回答错误的问题。哦,我知道这是从 12 月 10 日开始的。也许你已经解决了你的问题。
  • 我们使用的是半变通方法——我们使用功能分支中的 cvsexportcommit,但在很多情况下这会失败,因此我们需要经常进行手动调整。是的,两者都需要可写:) 无论如何,我们已经设法说服客户迁移到 git,所以有了新的希望......

标签: git synchronization cvs


【解决方案1】:

是的,双向实时 cvsgit 镜像,根据我们的经验,是一个需要人工照看的微妙且容易出错的事情。我只有一种方式(在 cvs 中提交,实时镜像到只读 git),这足以保持正确。

我们的存储库足够大,以至于没有工具可以足够及时地进行增量更新,因为大多数(至少我们发现)并没有真正做“增量”,它们实际上是从头开始。所以我们推出了自己的方法,使用viewvc 创建了 cvs 存储库的数据库视图,然后我们可以从中在 git 中生成单独的提交。

你应该可以在 git 端使用git cvsimport -k 杀死 CVS 关键字。

我想是的,维护您自己团队的成员列表并让 cvs-->git 工具为再次返回 git 的提交执行特殊代码会很有意义。

我认为,如果您基本上以一种方式进行同步,即在仅在 git 中写入的分支中完成所有工作,那会更简单。定期提交将很容易同步到 CVS 中。您可以通过与 master 定期合并来保持 git 的最新状态。 (或任何您基于的 CVS 分支。)合并提交将作为缺少 git 的合并感知合并提交内容的“合并分支 dev-git 与主”提交提交回 CVS。然后,您可以有一个定期合并窗口,您可以在其中与 CVS 团队安排以允许您执行相反的操作:将您的更改提交到 CVS 分支中。你会用有意义的东西标记你的“dev-git”分支,比如“feature_xyx_20160419”,而 cvs 中的提交评论将是“将 dev-git 合并到 feature_xyz_20160419”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 2016-05-19
    • 2018-12-06
    • 1970-01-01
    • 2013-05-21
    • 2017-06-13
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多