【发布时间】:2016-03-15 17:46:17
【问题描述】:
背景
我们的团队正在使用存储在 CVS 中的代码库,该代码库由客户管理。
在任何可预见的未来,都无法说服客户改用 Git。
因此,为了能够利用 git 的明显优势,我们想要制作 CVS 存储库的 git 副本,使用它并保持两个存储库同步。
第一次尝试
我们解决问题的第一次尝试是:
- 结帐 CVS 存储库
-
git init和git commit在同一目录中一次导入整个树 - 对于每一个新特性,我们创建一个 git 分支,做一些事情,使用
git-cvsexport,并使用cvs提交特性 - 我们每半小时运行一次(从
cron)cvs update、git add .和git commit将 cvs 中出现的新内容传输到 git
这种方法有缺点 - 主要问题是 CVS 和 git 的历史不同。
计划更改
所以我们计划或多或少地以here 描述的方式切换到git cvsimport。
问题
不过,我们可以想象这样的场景:
- 我们在 cvs 上提交了
Ac,在 git 上的 master 分支上提交了Ag(由git cvsimport创建),它们是相似的 - 我们创建了一个特性分支,我们在其上提交
Xg - 我们使用
git cvsexportcommit和cvs commit在cvs 上提交Xc - cvs 解析提交文件中的
$Id $部分,并对文件进行实际更改 - 我们运行
git cvsimport从 cvs 导入更改。这会将Xc转移到git 的主分支并提交Xg'
问题
我们如何告诉 git 提交 Xg 和 Xg' 实际上是同一件事?
根据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