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

Jat*_*tra 35 git cvs git-svn git-cvs

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

我每天能做到什么?

我想完成的任务是:

  • 进口分店,
  • 以GIT格式获取历史,以及
  • 将我的更改/提交导出回集中服务器

顺便说一下,我也看过了使用git和CVS的最佳实践.但它没有用,我无法弄清楚我错过了什么或做错了什么.

gpo*_*poo 47

我过去做的是:

导入CVS存储库

使用:

$ git cvsimport -C target-cvs -r cvs -k -vA authors-file.txt -d $CVSROOT module
Run Code Online (Sandbox Code Playgroud)

哪里:

  • target-cvs 是保存我的本地存储库副本的目录.
  • cvs是用于引用远程存储库的名称.所以,我会cvs/master,cvs/HEAD等通过在本地指出master.
  • 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.为了使将来更容易,您可能需要配置一些变量(您可以在" 如何将修订历史从mercurial或git导出到cvs? "的答案中阅读更多详细信息 )

$ git cvsimport
Run Code Online (Sandbox Code Playgroud)

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

日常工作

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

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

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

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

$ git cvsexportcommit -vc commit-id
Run Code Online (Sandbox Code Playgroud)

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

  • 当有新信息可用时,有时需要修改答案. (3认同)
  • [cvsimport](https://www.kernel.org/pub/software/scm/git/docs/git-cvsimport.html)手册页中充满了警告,弃用和更多警告.它建议使用cvs2git代替. (2认同)

ken*_*orb 7

git cvsimport由于cvsps 工具不兼容,最近的版本被破坏了.

所以你要安装cvsps-2.1.

在OSX上你可以(拥有brew):

brew tap homebrew/versions
brew install cvsps2
brew unlink cvsps
brew link --overwrite cvsps2
Run Code Online (Sandbox Code Playgroud)

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

git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:anonymous@reponame.cvs.sourceforge.net:/cvsroot/path ModuleName
Run Code Online (Sandbox Code Playgroud)

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

检查cvs2git文档以了解安装步骤.

用法示例:

cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git /path/to/cvs/repo
Run Code Online (Sandbox Code Playgroud)

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

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

cat git-blob.dat git-dump.dat | git fast-import
Run Code Online (Sandbox Code Playgroud)

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

通过运行检查更多:cvs2git --help.