38

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

我每天可以完成什么?

我想完成的任务是:

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

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

4

3 回答 3

53

我过去所做的是:

导入 CVS 存储库

使用:

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

在哪里:

  • target-cvs是保存我的存储库本地副本的目录。
  • cvs是用于引用远程存储库的名称。因此,我将在本地使用cvs/master,cvs/HEAD等指向master
  • authors-file.txt是包含 CVS 帐户和 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它们与 master 对抗。因为您将功能分开,所以应该更容易解决冲突。棘手的部分是当一些分支依赖于其他分支时,但仍然可以管理。微提交有很大帮助(就像在任何 git 工作流程中一样)。

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

$ git cvsexportcommit -vc commit-id

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

于 2012-07-15T07:05:11.873 回答
7

由于工具不兼容,最新版本git cvsimport已损坏。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 文档了解安装步骤。

示例用法:

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

于 2015-03-18T13:46:18.520 回答
2

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

  • 手动将 CVS 数据与 Git 同步,或为此编写脚本。他们将从 CVS 获取信息并将其放入 Git。这会给你一些 Git 的历史。不完全清洁,不完全可用,但仍然。
  • 使用. _ _ git cvsimport并要求 Git 伪装成其他开发人员的 CVS,使用git cvsserver.
于 2012-07-10T13:46:52.070 回答