有没有一种从CVS迁移到Git的迁移工具?

63

我打算从CVS转换到Git。对于SVN,似乎有cvs2svn,是否有类似的工具可以轻松地从CVS迁移到Git?


1
我不是git专家,但是http://git-scm.com/docs/gitcvs-migration这个怎么样? - Alessandro Jacopson
12个回答

32

3
增量导入和迁移有什么区别? - Harold L. Brown
3
“增量导入”意味着您正在同时使用CVS,迁移是停止使用CVS并转移到Git(可能借助于“git-cvsserver”)的过程。 - Jakub Narębski

18

cvs2git

以下是使用cvs2git工具将cvs转换为git的指南。其中,modulename是您想要导入的CVS目录的名称。

先决条件:

cvs2svn软件包(包括cvs2git命令)应该已经安装好了。

更新:步骤1和2并不完全正确 - 在尝试之前,请阅读下面由cvs2git维护者mhagger发表的评论。

  1. 检出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
    

    20
    这个答案是错误的!你不能从一个已经检出的代码库的工作副本进行 cvs2git 转换!你必须针对代码库本身运行它;也就是说,这个目录下面已经包含了 CVSROOT 子目录和许多 filename,v 文件。如果你正在使用集中式 CVS 服务器,那么你所需要的代码库位于服务器上。 - mhagger
    14
    我是 cvs2svn/cvs2git 的维护者 Vanuan,我说这是不可能的。cvs2git 需要访问包含所有文件版本的“filename,v”文件的文件系统历史记录。一个已检出的工作副本只包含项目的单个版本。cvs2svn 不知道如何从服务器检索旧版本。因此,这是不可能的。你一定是通过运行与上述描述不同的命令来搞混了自己。 - mhagger
    4
    @Vanuan:sourceforge 允许您使用 rsync 下载您的 CVS 代码库。这与检出不同,它会提供整个代码库,包括其历史记录。获取完整代码库后,您可以使用 cvs2git 工具将其转换为 Git。 - mhagger
    1
    确实,mhagger是正确的,但如果您使用rsync -av rsync://PROJECT.cvs.sourceforge.net/cvsroot/PROJECT/\* cvs导入SourceForge CVS存储库,则Vanuan描述的整个过程非常有效(在Windows和Linux上均可)。 - gaborous
    1
    @mhagger TypeError: __init__() got multiple values for keyword argument 'blob_filename' @mhagger“TypeError: __init __()使用多个值为关键字参数'blob_filename'” - Alex
    显示剩余8条评论

    13

    10

    如果你还不幸使用CVS,你可以尝试 "crap":https://github.com/rcls/crap

    它非常快(就访问CVS而言),支持在cvs存储库中发现的混乱,并且是增量式的。


    4
    "垃圾"就是救命稻草。这是到目前为止唯一对我起作用的东西! - York
    对我也起作用了,只是它有一个密码问题 - 我不得不修补代码以使用我的密码作为后备... :-( - einpoklum
    ...然后是标签错误的问题。 因此,我有一个带有一些补丁的存储库副本,在这里,您可能会发现有用。 - einpoklum

    7

    13
    git cvsimport在处理除了最简单的CVS代码库之外的其他代码库时会出现问题,并且会悄悄地给出错误的结果。例如,请参考其文档中的“ISSUES”部分(http://www.kernel.org/pub/software/scm/git/docs/git-cvsimport.html),或运行其单元测试。 - mhagger

    6

    我自己没有尝试过这种转换方法,但朋友们反馈说将代码从CVS先转换到SVN,再从SVN转换到Git的成功率很高。看来相应的转换工具已经比直接从CVS转换到Git更加成熟可靠。


    2
    我是cvs-fast-export的维护者。我曾经维护过cvsps和parse2cvs,并且密切评估了cvs-fastimport和cvs2git。
    CVS到git的转换是一个困难、令人讨厌的问题,有一些棘手的边缘情况。所有现有的转换工具都有已知的限制,有些相当严重。
    我建议首先尝试cvs-fast-export。它产生比任何其他工具更好、更快的转换,除了在罕见的情况下它会干净地失败并退出。如果你遇到了罕见但可怕的“分支循环错误”,请尝试使用cvs2git。
    不要相信cvs-fastimport,它相当有bug,经常搞砸分支合并。
    更多信息,请参见http://www.catb.org/esr/cvs-fast-export/

    2

    我已尝试过cvs2git、git-cvsimport和parsecvs。

    cvs2git有时(据我回忆)会为标签创建虚假分支。

    git-cvsimport不支持一个变更集的多个标签。但是,有可能获取一些额外的变更来支持它,并将原始的git-cvsimport更改为使用更新的cvsps(我尝试过,似乎能够工作)。优点在于它支持增量更新,并具有一些逻辑来正确导入合并(但需要适当的提交消息格式)。

    到目前为止,parsecvs给我带来了最好的结果。不幸的是,网上提供的代码不能与最新的git编译,但这种变化虽然不容易,但还是可以实现的。

    编辑:看起来ESR接管了cvspsparsecvs,所以CVS->GIT迁移有一些希望。但他在某些邮件列表中已经提到,他可能会正式宣布他最近接管的一些工具已经死亡。


    是的,经过严格比较后,我放弃了cvsps,转而选择parsecvs。后来,我赋予了cvsparse发送快速导入流的能力,它变成了cvs-fast-export。 - ESR

    2

    我阅读了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 需要访问整个历史记录。简单的检出不足以满足要求。


    1
    你可以使用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文档以获取安装步骤。
    示例用法:
    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 检查更多信息。


    1
    感谢您提供有关cvsps版本的提示 - 我一直卡在那里。 - Mark
    cvsimport 的 man 页面充满了警告、废弃信息和更多的警告。它建议使用 cvs2git 替代。 - Edward Falk

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接