我打算从CVS转换到Git。对于SVN,似乎有cvs2svn,是否有类似的工具可以轻松地从CVS迁移到Git?
我打算从CVS转换到Git。对于SVN,似乎有cvs2svn,是否有类似的工具可以轻松地从CVS迁移到Git?
目前唯一拥有增量导入功能的工具似乎是git-cvsimport。如果要从CVS转换(迁移)到Git,目前最好的解决方案似乎是上述cvs2svn的cvs2git模式。
另请参见Git Wiki上的接口、前端和工具页面,关于与其他版本控制系统互动的部分。
以下是使用cvs2git工具将cvs转换为git的指南。其中,modulename是您想要导入的CVS目录的名称。
先决条件:
cvs2svn
软件包(包括cvs2git命令)应该已经安装好了。
更新:步骤1和2并不完全正确 - 在尝试之前,请阅读下面由cvs2git维护者mhagger发表的评论。
检出modulename
cvs -d URL co -P modulename
创建一个空的 CVSROOT,以便 cvs2git 使用。mkdir modulename/CVSROOT
下载cvs2git.options的示例,请访问http://cvs2svn.tigris.org/svn/cvs2svn/trunk/cvs2git-example.options(用户名“guest”,无需密码)
编辑cvs2git.options文件,将r'test-data/main-cvsrepos'替换为'modulename'。编辑作者的转换。
# edit this
run_options.set_project( r'modulename',
# and this
author_transforms={
'jrandom' : ('J. Random', 'jrandom@example.com'),
'mhagger' : 'Michael Haggerty <mhagger@alum.mit.edu>',
运行cvs2git创建git临时文件。 cvs2git --options=cvs2git.options --fallback-encoding utf-8
创建Git仓库。mkdir gitrepo && cd gitrepo && git init .
从通过cvs2git创建的git临时文件中导入
cat ../cvs2git-tmp/git-{blob,dump}.dat | git fast-import
检出工作副本
git reset --hard
cvs2git
转换!你必须针对代码库本身运行它;也就是说,这个目录下面已经包含了 CVSROOT
子目录和许多 filename,v
文件。如果你正在使用集中式 CVS 服务器,那么你所需要的代码库位于服务器上。 - mhaggercvs2git
工具将其转换为 Git。 - mhaggerrsync -av rsync://PROJECT.cvs.sourceforge.net/cvsroot/PROJECT/\* cvs
导入SourceForge CVS存储库,则Vanuan描述的整个过程非常有效(在Windows和Linux上均可)。 - gaborousTypeError: __init__() got multiple values for keyword argument 'blob_filename'
@mhagger“TypeError: __init __()使用多个值为关键字参数'blob_filename'” - Alex如果你还不幸使用CVS,你可以尝试 "crap":https://github.com/rcls/crap
它非常快(就访问CVS而言),支持在cvs存储库中发现的混乱,并且是增量式的。
我自己没有尝试过这种转换方法,但朋友们反馈说将代码从CVS先转换到SVN,再从SVN转换到Git的成功率很高。看来相应的转换工具已经比直接从CVS转换到Git更加成熟可靠。
我已尝试过cvs2git、git-cvsimport和parsecvs。
cvs2git有时(据我回忆)会为标签创建虚假分支。
git-cvsimport不支持一个变更集的多个标签。但是,有可能获取一些额外的变更来支持它,并将原始的git-cvsimport更改为使用更新的cvsps(我尝试过,似乎能够工作)。优点在于它支持增量更新,并具有一些逻辑来正确导入合并(但需要适当的提交消息格式)。
到目前为止,parsecvs给我带来了最好的结果。不幸的是,网上提供的代码不能与最新的git编译,但这种变化虽然不容易,但还是可以实现的。
编辑:看起来ESR接管了cvsps和parsecvs,所以CVS->GIT迁移有一些希望。但他在某些邮件列表中已经提到,他可能会正式宣布他最近接管的一些工具已经死亡。
我阅读了Vanuan的答案和mhagger对其的评论。不幸的是,mhagger没有发布如何使用cvs2git
进行操作的内容。这里有非常好的写作:http://www.mcs.anl.gov/~jacob/cvs2svn/cvs2git.html
我使用了cvs2git
而不是git-cvsimport
,因为git-cvsimport
的文档建议使用它以避免git-cvsimport
的问题:https://www.kernel.org/pub/software/scm/git/docs/git-cvsimport.html#issues
以下是在Debian Sid上从sourceforge CVS存储库创建git存储库的精髓:
$ apt-get install cvs2svn cvs
$ mkdir project.cvs
$ rsync -av rsync://${PROJECT}.cvs.sourceforge.net/cvsroot/${PROJECT}/ project.cvs
$ cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git project.cvs
$ mkdir project.git
$ cd project.git
$ git init
$ cat ../git-blob.dat ../git-dump.dat | git fast-import
rsync
步骤是必须的,因为 cvs2git
需要访问整个历史记录。简单的检出不足以满足要求。
git cvsimport
。它需要安装cvsps
,但你需要安装2.x版本,因为3.x版本不再兼容。
然后在空的git上导入CVS存储库。使用示例:
git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:anonymous@reponame.cvs.sourceforge.net:/cvsroot/path ModuleName
在OSX上,您需要通过以下方式安装cvsps-2.1
(需要安装brew
):
brew tap homebrew/versions
brew install cvsps2
brew link cvsps2
cvs2git
工具将CVS存储库转换为git。但是,你需要访问CVSROOT目录。cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git /path/to/cvs/repo
cvs2git-tmp/git-blob.dat
和cvs2git-tmp/git-dump.dat
。cat git-blob.dat git-dump.dat | git fast-import
然后删除 TAG.FIXUP
分支并运行 gitk --all
来查看转换的结果。
通过运行 cvs2git --help
检查更多信息。