Migration from CVS to Git looses merges
- From
Urs Thuermann <urs@isnogud.escape.de>
- Date
- Jun 25, 2017, 07:12 UTC
- Message-ID
- <ygfd19stua3.fsf@tehran.isnogud.escape.de>
I want to convert several old CVS repositories to Git. Some of these CVS repositories contain branches, which have later been merged to the main trunk. When I try to convert using cvs2git or git cvsimport the branches appear in the new git repository but they are not merged to the master branch.
Here is an example of how the branches in the CVS repository were created and merged:
cd /tmp
export CVSROOT=$PWD/CVS cvs init
mkdir CVS/foo
cvs co foo cd foo
(date; seq 10; date) > bar
cvs add bar
cvs ci -m msg1 # rev 1.1 sleep 1
printf "1c\n%s\n.\nwq\n" "`date`" | ed bar
cvs ci -m msg2 # rev 1.2 sleep 1
cvs tag -b a-branch sleep 1
printf "1c\n%s\n.\nwq\n" "`date`" | ed bar
cvs ci -m msg3 # rev 1.3 sleep 1
cvs up -r a-branch
printf "12c\n%s\n.\nwq\n" "`date`" | ed bar
cvs ci -m msg-b1 # rev 1.2.2.1 sleep 1
printf "12c\n%s\n.\nwq\n" "`date`" | ed bar
cvs ci -m msg-b2 # rev 1.2.2.2 sleep 1
cvs up -A
cvs up -j a-branch
cvs ci -m "Merge branch a-branch" # rev 1.4Now I have tried 2 ways to convert this to git:
1. mkdir g; cd g; git cvsimport -A <file> -m foo 2. mkdir g; cd g; git init; cvs2git --blobfile=foo.blob --dumpfile=foo.dump --username=urs ../CVS/foo cat foo.blob foo.dump | git fast-import
In both cases, the branch "a-branch" is in the git repository but is not merged with the master branch, i.e. rev 1.4 has only parent 1.3 but not 1.2.2.2. I also tried cvsimport with several regexes passed using -M to match "Merge branch a-branch", but still the same result.
How should the CVS repository be converted to git, so that the commit corresponding to rev 1.4 has two parents, 1.3 and 1.2.2.2?
urs