CVS 中有一个中央存储库,我想在本地与 Git 一起使用它,然后将我的更改发送回 CVS。
我每天可以完成什么?
我想完成的任务是:
- 导入分支,
- 以类似 GIT 的格式获取历史记录,以及
- 将我的更改/提交导出回中央服务器
顺便说一句,我还查看了将 git 与 CVS 结合使用的最佳实践。但它没有用,我无法弄清楚我错过了什么或做错了什么。
CVS 中有一个中央存储库,我想在本地与 Git 一起使用它,然后将我的更改发送回 CVS。
我每天可以完成什么?
我想完成的任务是:
顺便说一句,我还查看了将 git 与 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中的更改。
由于工具不兼容,最新版本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.dat
为cvs2git-tmp/git-dump.dat
.
这些文件可以通过以下方式导入到空的 git 存储库中:
cat git-blob.dat git-dump.dat | git fast-import
然后删除TAG.FIXUP
分支并运行gitk --all
查看转换结果。
通过运行检查更多信息:cvs2git --help
。
我相信在你的情况下没有现成的食谱。但是,您可以尝试以下操作:
git cvsimport
并要求 Git 伪装成其他开发人员的 CVS,使用git cvsserver
.