Is there a migration tool from CVS to Git?

I intend to switch over from CVS to Git.
In the case of SVN, there seems to be cvs2svn. Is there a similar tool to easily migrate from CVS to Git?

  • Granularity for creating VCS-Repositories
  • Is there an (open source) VCS that can work with a whitelist instead of a blacklist?
  • How to run Git and CVS over the same folder
  • Combine multiple .git repositories while retaining file based commit info
  • Source Control - If, Why, How to start?
  • Tips for using CVS or Subversion as a backup framework for office documents
  • Git and WebScarab installation
  • How to organize repositories with reusable components
  • Why don't I see files after push to Bare git repo
  • How to update the HEAD branch in a mirrored clone?
  • how to see the deleted files using Git Bash?
  • Create a folder structure using LibGit2Sharp?
  • 11 Solutions collect form web for “Is there a migration tool from CVS to Git?”

    The only tool that has incremental import seems to be git-cvsimport. If you want to convert (migrate) from CVS to Git, the best solution for now seems to be mentioned above cvs2git mode of cvs2svn.

    See also Interfaces Frontends And Tools page on Git wiki, section about interaction with other revision control systems.

    cvs2git

    In addition to provided answers, here’s a guide on how to convert cvs to git using cvs2git tool. Here, modulename is a name of CVS directory you want to import.

    Prerequisites

    cvs2svn package (which includes cvs2git command) should be already installed.

    Update: steps 1 and 2 are not fully correct – before attempting, read the comment below by mhagger, the maintainer of cvs2git

    1. checkout modulename

      cvs -d URL co -P modulename
      
    2. create an empty CVSROOT needed by cvs2git

      mkdir modulename/CVSROOT
      
    3. download an example of cvs2git.options at http://cvs2svn.tigris.org/svn/cvs2svn/trunk/cvs2git-example.options (user “guest” with no password)

    4. edit cvs2git.options file. Replace r’test-data/main-cvsrepos’ with ‘modulename’. Edit authors transforms.

      # 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>',
      
    5. run cvs2git to create git temp files

      cvs2git  --options=cvs2git.options --fallback-encoding utf-8
      
    6. create git repository

      mkdir gitrepo && cd gitrepo && git init .
      
    7. import from git temp files created by cvs2git

      cat ../cvs2git-tmp/git-{blob,dump}.dat | git fast-import
      
    8. checkout working copy

      git reset --hard
      

    cvs2svn has a cvs2git mode.

    An alternative might be to use git cvsimport *

    If anyone still has the misfortune of using CVS, you could try “crap” : https://github.com/rcls/crap
    It’s fast (as far as accessing CVS can be fast), supports the messes that you find in cvs repos, and incremental.

    I’ve not tried this myself, but friends have reported good success converting first from CVS to SVN, and then from SVN to Git. It seems that the tools to do those respective transitions have been more thoroughly shaken out than a direct CVS to Git transition.

    You can add fromcvs to the list. It converts well and is extremely fast and also incremental. It does not do sticky tags, only branches, however.

    I’ve tried cvs2git, git-cvsimport and parsecvs.

    cvs2git sometimes (as far as I remember) creates bogus branches for tags.

    git-cvsimport does not support multiple tags for a changeset. It is possible however to grab some additional changes for cvsps to support it and change the original git-cvsimport to something which uses updated cvsps (I’ve tried it and it seems to work). On the advantage side it supports incremental updates and has some logic to properly import merges (but it REQUIRES appropriate format for commit message).

    parsecvs so far gave me the best results. Unfortunately the code available on the web does not compile cleanly with the latest git. The change while not trivial is doable.

    EDIT: It looks like ESR took over both cvsps and parsecvs so there is some hope for CVS->GIT migration. BUT he already mentioned on some mailing list that he may declare some of the tools he took over recently officially dead.

    You can use git cvsimport. It requires cvsps to be installed, but you need to install 2.x, as 3.x is not incompatible anymore.

    Then import CVS repository on empty git. Sample usage:

    git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:anonymous@reponame.cvs.sourceforge.net:/cvsroot/path ModuleName
    

    On OSX you install cvsps-2.1 in the following way (having brew):

    brew tap homebrew/versions
    brew install cvsps2
    brew link  cvsps2
    

    You can also use cvs2git tool which can convert a CVS repository to git. However you need to have access to a CVSROOT directory.

    Check cvs2git documentation for installation steps.

    Example usage:

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

    This would create two output files in git fast-import format. The names of these files are specified by your options file or command-line arguments. In the example, these files are named cvs2git-tmp/git-blob.dat and cvs2git-tmp/git-dump.dat.

    These files can be imported into empty git repository by:

    cat git-blob.dat git-dump.dat | git fast-import
    

    Then delete the TAG.FIXUP branch and run gitk --all to view the results of the conversion.

    Check for more, by running: cvs2git --help.

    I read the answer by Vanuan and mhagger’s comments to it. Unfortunately mhagger didn’t post how to do it with cvs2git. It is all very well written up here: http://www.mcs.anl.gov/~jacob/cvs2svn/cvs2git.html

    I used cvs2git instead of git-cvsimport because the documentation of git-cvsimport suggests to use it instead to avoid the problems of git-cvsimport: https://www.kernel.org/pub/software/scm/git/docs/git-cvsimport.html#issues

    It follows essence of it that worked for me to create a git repository from a sourceforge CVS repository on Debian Sid:

    $ 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
    

    The rsync step is needed because cvs2git needs access to the whole history. A simple checkout is not enough.

    I found cvs-fast-export did an excellent job. I had to download and compile it myself, but didn’t have any significant issues doing so.

    Git Baby is a git and github fan, let's start git clone.