woensdag, november 09, 2005


The 28th of October me and my girlfriend went for a walk in the woods. There are lots of markings in the woods, of different colours representing different routes. The idea was to take a route which would be about 5km and we should complete it in an hour or so. So, we took the orange route, which was 5.5km. Three and a half hours later we finally got out of the forrest... :-) Some kids had apparantly moved some of the markings...

dinsdag, november 08, 2005

CVS to GIT and back

The first step is to import a CVS tree into GIT:

mkdir foobar.git
cd foobar.git
git-cvsimport -p x -v -d :ext:takis@cvs.sourceforge.net:/cvsroot/someproject foobar


We will not make any modifications to the project in that directory, this directory is purely intended to be a GIT conversion of the CVS repository. Instead, we'll create a clone of that archive and do our hackery in there:


git clone -l foobar.git/ foobar-pi.git/


The "l" flag makes sure that git uses hard links instead of copying files, if possible.

Next, we'll make some modifications to the project and commit them using git-commit or cg-commit. As said earlier, we'll make those modifications in the foobar-pi.git directory:

cd foobar-pi.git
... do stuff ...
cg-commit


If new changes are committed in the CVS repository, we need to fetch those in our foobar.git repository, which is kind of a GIT mirror of the online CVS repository.


cd foobar.git
git-cvsimport -p x -v -d :ext:takis@cvs.sourceforge.net:/cvsroot/someproject foobar



Now, we'll pull in the CVS-commits to the clone directory.

cd foobar-pi.git
git pull



This results in a way to have a nice GIT repository of a project being hosted using CVS. Your GIT repository makes it easy to view changes in the project as you've got the full history locally on your system.

To prepare you modifications to be send as a patch, do the following:

git-format-patch origin..HEAD


This will give you a set of files, containing patches, which you can post to a mailinglist or maintainer.

If you've got write access to the CVS-repository, you probably want to commit these patches back into the CVS yourself. To do this, checkout the CVS repository somewhere on your filesystem:

export CVS_RSH=ssh
...


Get into the CVS working directory, and set the environment variable GIT_DIR to point to the .git directory within your git directory:

export GIT_DIR=/usr/local/src/foobar-pi.git/.git/


View the GIT-logs and select which commits you want to push into the CVS-repository:

git-log


Copy and paste the commit-identifier (being an SHA1-hash) and use it as a parameter to git-cvsexportcommit:

git-cvsexportcommit 4a20cbafdf25a141b31a8333284a332d1a4d6072
unset GIT_DIR


Do not forget to unset the GIT_DIR environment variable!

This will output:

$VAR1 = '4a20cbafdf25a141b31a8333284a332d1a4d6072';
...
Ready for you to commit, just run:

cvs commit -F .msg Uiml/uiml.net.build


Repeat the command shown above:

cvs commit -F .msg Uiml/uiml.net.build


The patch which you wrote and committed in your clone GIT tree, is now committed back into the CVS repository.

Now, you can resync your GIT-CVS mirror tree:

cd foobar.git
git-cvsimport -p x -v -d :ext:takis@cvs.sourceforge.net:/cvsroot/someproject foobar


Now, your patches which you committed in the CVS repository, will be pulled back into the GIT-tree which acts as a mirror of the CVS-repository.

Now, you'll want to merge this back into your GIT-clone tree, which is where you do your actual work:

cd foobar-pi.git
git pull


Now, you've come full circle. You patches which were initially committed in foobar-pi.git, were committed to the CVS tree, and pulled back into the mirror GIT tree (foobar.git) and finally back into your clone/working GIT tree (foobar-pi.git). Ofcourse your patches were already in foobar-pi.git and GIT will notice this.

Oneway CVS to GIT

The first step is to import a CVS tree into GIT:

mkdir foobar.git
cd foobar.git
git-cvsimport -p x -v -d :ext:takis@cvs.sourceforge.net:/cvsroot/someproject foobar


We will not make any modifications to the project in that directory, this directory is purely intended to be a GIT conversion of the CVS repository. Instead, we'll create a clone of that archive and do our hackery in there:


git clone -l foobar.git/ foobar-pi.git/


The "l" flag makes sure that git uses hard links instead of copying files, if possible.

Next, we'll make some modifications to the project and commit them using git-commit or cg-commit. As said earlier, we'll make those modifications in the foobar-pi.git directory:

cd foobar-pi.git
... do stuff ...
cg-commit


If new changes are committed in the CVS repository, we need to fetch those in our foobar.git repository, which is kind of a GIT mirror of the online CVS repository.


cd foobar.git
git-cvsimport -p x -v -d :ext:takis@cvs.sourceforge.net:/cvsroot/someproject foobar



Now, we'll pull in the CVS-commits to the clone directory.

cd foobar-pi.git
git pull



This results in a way to have a nice GIT repository of a project being hosted using CVS. Your GIT repository makes it easy to view changes in the project as you've got the full history locally on your system.

To prepare you modifications to be send as a patch, do the following:

git-format-patch origin..HEAD


This will give you a set of files, containing patches, which you can post to a mailinglist or maintainer.