如何在Git中导入并保持更新CVS存储库?

时间:2012-07-06 12:57:54

标签: git cvs git-svn git-cvs

CVS中有一个中央存储库,我想在本地使用Git,然后将我的更改发送回CVS。

我每天能做到什么?

我想完成的任务是:

  • 导入分支,
  • 以GIT格式获取历史记录,
  • 将我的更改/提交导出回集中服务器
顺便说一句,我也看了Best practices for using git with CVS。但它没有用,我无法弄清楚我错过了什么或做错了什么。

3 个答案:

答案 0 :(得分:44)

我过去所做的是:

导入CVS存储库

使用:

$ git cvsimport -C target-cvs -r cvs -k -vA authors-file.txt -d $CVSROOT module

其中:

  • target-cvs是保存我的本地存储库副本的目录。
  • cvs是用于引用远程存储库的名称。因此,cvs/master本地指向cvs/HEADmaster等。
  • authors-file.txt是包含CVS帐户与姓名+电子邮件之间匹配的文件,每行包含userid=User Name <useremail@hostname>
  • $CVSROOT是CVS资源库服务器。如果我使用来自某个sourceforge存储库的匿名克隆,那么我会使用::pserver:anonymous@project_name.cvs.sourceforge.net:/cvsroot/project_name
  • module是我要克隆的存储库中的模块。如果存储库只有一个模块,则可能与project_name相同。

更新存储库

可以重复我之前写的命令。在该特定示例中,它应该在target-cvs的父目录中运行。为了使将来更容易,您可能想要配置一些变量(您可以在How to export revision history from mercurial or git to cvs?的答案中阅读更多详细信息)

$ git cvsimport

这足以使git中的本地存储库与CVS中的远程存储库保持同步。

日常工作

从现在开始,每个更改都应该在本地git分支中进行。一个功能,一个分支。为此,我使用了“ A successful Git branching model ”中描述的工作流程。唯一的区别是 master 指向CVS,但从概念上讲,可以在此处应用相同的工作流程。这只是一个惯例。

在CVS中推送提交后,它将在下一次更新(git cvsimport)中返回到master。然后,您可以删除实现该功能的本地分支。

对于正在进行的工作(在本地分支机构中),您应rebase反对主人。由于您将功能分开,因此解决冲突应该更容易。棘手的部分是当一些分支依赖于其他分支,但仍然可管理。微提交有很多帮助(如任何git工作流程)。

如果每个本地分支都已重新定位且主持人从未接触过(除了更新),那么git cvsexportcommit应该可以正常工作。请记住,它适用于一次提交。这有点乏味,但总比没有好。鉴于前面的示例,命令应该类似于:

$ git cvsexportcommit -vc commit-id

如果您只具有对远程CVS的只读访问权限,那么您可以通过电子邮件发送补丁程序或将您的git存储库公开,以便委托人可以抓取您的补丁程序以应用它们。在这种情况下,与CVS的正常工作流程没有什么不同。同样,在下一次更新中,您将看到 master 中的更改。

答案 1 :(得分:7)

由于git cvsimport tool incompatibility,最新版本cvsps已损坏。

因此您需要安装cvsps-2.1

在OSX上你可以(有brew):

brew tap homebrew/versions
brew install cvsps2
brew unlink cvsps
brew link --overwrite cvsps2

像往常一样导入空git存储库,例如:

git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:anonymous@reponame.cvs.sourceforge.net:/cvsroot/path ModuleName

您还可以使用cvs2git工具将CVS存储库转换为git。但是,您需要访问CVSROOT目录。

检查cvs2git documentation是否有安装步骤。

使用示例:

cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git /path/to/cvs/repo

这将以git快速导入格式创建两个输出文件。这些文件的名称由选项文件或命令行参数指定。在示例中,这些文件名为cvs2git-tmp/git-blob.datcvs2git-tmp/git-dump.dat

这些文件可以通过以下方式导入空git存储库:

cat git-blob.dat git-dump.dat | git fast-import

然后删除TAG.FIXUP分支并运行gitk --all以查看转化结果。

通过运行cvs2git --help来检查更多内容。

答案 2 :(得分:2)

我相信在你的情况下没有准备好使用食谱。但是,您可以尝试以下方法:

  • 手动将CVS数据与Git同步,或为其编写脚本。他们将从CVS获取信息并将其发送给Git。这将在Git中为您提供某种历史。不完全清洁,不完全可用,但仍然。
  • 使用git cvsimportgit cvsserver将您的CVS存储库迁移到Git。并请Git使用{{1}}假装为其他开发人员的CVS。