繁体   English   中英

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

[英]How to import and keep updated a CVS repository in Git?

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

我每天能完成什么?

我想完成的任务是:

  • 进口分支机构,
  • 以类似 GIT 的格式获取历史记录,以及
  • 将我的更改/提交导出回中央服务器

顺便说一句,我还查看了将 git 与 CVS 一起使用的最佳实践 但它没有用,我无法弄清楚我错过了什么或做错了什么。

我过去所做的是:

导入 CVS 存储库

使用:

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

在哪里:

  • target-cvs是保存我的存储库本地副本的目录。
  • cvs是用于引用远程存储库的名称。 所以,我将有cvs/mastercvs/HEAD等由当地指出master
  • authors-file.txt是包含 CVS account 和 Name+email 匹配的文件,每行包含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

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

日常工作

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

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

对于进行中的工作(在当地的分支机构),你应该rebase它们对主人。 因为您将功能分开,所以解决冲突应该更容易。 棘手的部分是一些分支依赖于其他分支,但仍然可以管理。 微提交有很大帮助(就像在任何 git 工作流程中一样)。

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

$ git cvsexportcommit -vc commit-id

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

由于cvsps工具不兼容,最新版本的git cvsimport已损坏。

所以你必须安装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 文档以了解安装步骤。

用法示例:

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

这将创建两个 git fast-import 格式的输出文件。 这些文件的名称由您的选项文件或命令行参数指定。 在示例中,这些文件被命名为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

我相信在你的情况下没有现成的食谱。 但是,您可以尝试以下操作:

  • 使用 Git 手动同步 CVS 数据,或为此编写脚本。 他们将从 CVS 获取信息并将其放入 Git。 这会给你一些 Git 的历史。 不完全干净,不完全可用,但仍然。
  • 使用git cvsimport工具将您的 CVS 存储库迁移到 Git。 并使用git cvsserver要求 Git 假装是其他开发人员的 CVS。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM