|  | git-cvsserver(1) | 
|  | ================ | 
|  |  | 
|  | NAME | 
|  | ---- | 
|  | git-cvsserver - A CVS server emulator for git | 
|  |  | 
|  | SYNOPSIS | 
|  | -------- | 
|  |  | 
|  | SSH: | 
|  |  | 
|  | [verse] | 
|  | export CVS_SERVER="git cvsserver" | 
|  | 'cvs' -d :ext:user@server/path/repo.git co <HEAD_name> | 
|  |  | 
|  | pserver (/etc/inetd.conf): | 
|  |  | 
|  | [verse] | 
|  | cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver | 
|  |  | 
|  | Usage: | 
|  |  | 
|  | [verse] | 
|  | 'git cvsserver' [options] [pserver|server] [<directory> ...] | 
|  |  | 
|  | OPTIONS | 
|  | ------- | 
|  |  | 
|  | All these options obviously only make sense if enforced by the server side. | 
|  | They have been implemented to resemble the linkgit:git-daemon[1] options as | 
|  | closely as possible. | 
|  |  | 
|  | --base-path <path>:: | 
|  | Prepend 'path' to requested CVSROOT | 
|  |  | 
|  | --strict-paths:: | 
|  | Don't allow recursing into subdirectories | 
|  |  | 
|  | --export-all:: | 
|  | Don't check for `gitcvs.enabled` in config. You also have to specify a list | 
|  | of allowed directories (see below) if you want to use this option. | 
|  |  | 
|  | -V:: | 
|  | --version:: | 
|  | Print version information and exit | 
|  |  | 
|  | -h:: | 
|  | -H:: | 
|  | --help:: | 
|  | Print usage information and exit | 
|  |  | 
|  | <directory>:: | 
|  | You can specify a list of allowed directories. If no directories | 
|  | are given, all are allowed. This is an additional restriction, gitcvs | 
|  | access still needs to be enabled by the `gitcvs.enabled` config option | 
|  | unless '--export-all' was given, too. | 
|  |  | 
|  |  | 
|  | DESCRIPTION | 
|  | ----------- | 
|  |  | 
|  | This application is a CVS emulation layer for git. | 
|  |  | 
|  | It is highly functional. However, not all methods are implemented, | 
|  | and for those methods that are implemented, | 
|  | not all switches are implemented. | 
|  |  | 
|  | Testing has been done using both the CLI CVS client, and the Eclipse CVS | 
|  | plugin. Most functionality works fine with both of these clients. | 
|  |  | 
|  | LIMITATIONS | 
|  | ----------- | 
|  |  | 
|  | Currently cvsserver works over SSH connections for read/write clients, and | 
|  | over pserver for anonymous CVS access. | 
|  |  | 
|  | CVS clients cannot tag, branch or perform GIT merges. | 
|  |  | 
|  | 'git-cvsserver' maps GIT branches to CVS modules. This is very different | 
|  | from what most CVS users would expect since in CVS modules usually represent | 
|  | one or more directories. | 
|  |  | 
|  | INSTALLATION | 
|  | ------------ | 
|  |  | 
|  | 1. If you are going to offer anonymous CVS access via pserver, add a line in | 
|  | /etc/inetd.conf like | 
|  | + | 
|  | -- | 
|  | ------ | 
|  | cvspserver stream tcp nowait nobody git-cvsserver pserver | 
|  |  | 
|  | ------ | 
|  | Note: Some inetd servers let you specify the name of the executable | 
|  | independently of the value of argv[0] (i.e. the name the program assumes | 
|  | it was executed with). In this case the correct line in /etc/inetd.conf | 
|  | looks like | 
|  |  | 
|  | ------ | 
|  | cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver | 
|  |  | 
|  | ------ | 
|  | No special setup is needed for SSH access, other than having GIT tools | 
|  | in the PATH. If you have clients that do not accept the CVS_SERVER | 
|  | environment variable, you can rename 'git-cvsserver' to `cvs`. | 
|  |  | 
|  | Note: Newer CVS versions (>= 1.12.11) also support specifying | 
|  | CVS_SERVER directly in CVSROOT like | 
|  |  | 
|  | ------ | 
|  | cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name> | 
|  | ------ | 
|  | This has the advantage that it will be saved in your 'CVS/Root' files and | 
|  | you don't need to worry about always setting the correct environment | 
|  | variable. SSH users restricted to 'git-shell' don't need to override the default | 
|  | with CVS_SERVER (and shouldn't) as 'git-shell' understands `cvs` to mean | 
|  | 'git-cvsserver' and pretends that the other end runs the real 'cvs' better. | 
|  | -- | 
|  | 2. For each repo that you want accessible from CVS you need to edit config in | 
|  | the repo and add the following section. | 
|  | + | 
|  | -- | 
|  | ------ | 
|  | [gitcvs] | 
|  | enabled=1 | 
|  | # optional for debugging | 
|  | logfile=/path/to/logfile | 
|  |  | 
|  | ------ | 
|  | Note: you need to ensure each user that is going to invoke 'git-cvsserver' has | 
|  | write access to the log file and to the database (see | 
|  | <<dbbackend,Database Backend>>. If you want to offer write access over | 
|  | SSH, the users of course also need write access to the git repository itself. | 
|  |  | 
|  | You also need to ensure that each repository is "bare" (without a git index | 
|  | file) for `cvs commit` to work. See linkgit:gitcvs-migration[7]. | 
|  |  | 
|  | [[configaccessmethod]] | 
|  | All configuration variables can also be overridden for a specific method of | 
|  | access. Valid method names are "ext" (for SSH access) and "pserver". The | 
|  | following example configuration would disable pserver access while still | 
|  | allowing access over SSH. | 
|  | ------ | 
|  | [gitcvs] | 
|  | enabled=0 | 
|  |  | 
|  | [gitcvs "ext"] | 
|  | enabled=1 | 
|  | ------ | 
|  | -- | 
|  | 3. If you didn't specify the CVSROOT/CVS_SERVER directly in the checkout command, | 
|  | automatically saving it in your 'CVS/Root' files, then you need to set them | 
|  | explicitly in your environment. CVSROOT should be set as per normal, but the | 
|  | directory should point at the appropriate git repo. As above, for SSH clients | 
|  | _not_ restricted to 'git-shell', CVS_SERVER should be set to 'git-cvsserver'. | 
|  | + | 
|  | -- | 
|  | ------ | 
|  | export CVSROOT=:ext:user@server:/var/git/project.git | 
|  | export CVS_SERVER="git cvsserver" | 
|  | ------ | 
|  | -- | 
|  | 4. For SSH clients that will make commits, make sure their server-side | 
|  | .ssh/environment files (or .bashrc, etc., according to their specific shell) | 
|  | export appropriate values for GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, | 
|  | GIT_COMMITTER_NAME, and GIT_COMMITTER_EMAIL. For SSH clients whose login | 
|  | shell is bash, .bashrc may be a reasonable alternative. | 
|  |  | 
|  | 5. Clients should now be able to check out the project. Use the CVS 'module' | 
|  | name to indicate what GIT 'head' you want to check out. This also sets the | 
|  | name of your newly checked-out directory, unless you tell it otherwise with | 
|  | `-d <dir_name>`. For example, this checks out 'master' branch to the | 
|  | `project-master` directory: | 
|  | + | 
|  | ------ | 
|  | cvs co -d project-master master | 
|  | ------ | 
|  |  | 
|  | [[dbbackend]] | 
|  | Database Backend | 
|  | ---------------- | 
|  |  | 
|  | 'git-cvsserver' uses one database per git head (i.e. CVS module) to | 
|  | store information about the repository for faster access. The | 
|  | database doesn't contain any persistent data and can be completely | 
|  | regenerated from the git repository at any time. The database | 
|  | needs to be updated (i.e. written to) after every commit. | 
|  |  | 
|  | If the commit is done directly by using `git` (as opposed to | 
|  | using 'git-cvsserver') the update will need to happen on the | 
|  | next repository access by 'git-cvsserver', independent of | 
|  | access method and requested operation. | 
|  |  | 
|  | That means that even if you offer only read access (e.g. by using | 
|  | the pserver method), 'git-cvsserver' should have write access to | 
|  | the database to work reliably (otherwise you need to make sure | 
|  | that the database is up-to-date any time 'git-cvsserver' is executed). | 
|  |  | 
|  | By default it uses SQLite databases in the git directory, named | 
|  | `gitcvs.<module_name>.sqlite`. Note that the SQLite backend creates | 
|  | temporary files in the same directory as the database file on | 
|  | write so it might not be enough to grant the users using | 
|  | 'git-cvsserver' write access to the database file without granting | 
|  | them write access to the directory, too. | 
|  |  | 
|  | You can configure the database backend with the following | 
|  | configuration variables: | 
|  |  | 
|  | Configuring database backend | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | 'git-cvsserver' uses the Perl DBI module. Please also read | 
|  | its documentation if changing these variables, especially | 
|  | about `DBI->connect()`. | 
|  |  | 
|  | gitcvs.dbname:: | 
|  | Database name. The exact meaning depends on the | 
|  | selected database driver, for SQLite this is a filename. | 
|  | Supports variable substitution (see below). May | 
|  | not contain semicolons (`;`). | 
|  | Default: '%Ggitcvs.%m.sqlite' | 
|  |  | 
|  | gitcvs.dbdriver:: | 
|  | Used DBI driver. You can specify any available driver | 
|  | for this here, but it might not work. cvsserver is tested | 
|  | with 'DBD::SQLite', reported to work with | 
|  | 'DBD::Pg', and reported *not* to work with 'DBD::mysql'. | 
|  | Please regard this as an experimental feature. May not | 
|  | contain colons (`:`). | 
|  | Default: 'SQLite' | 
|  |  | 
|  | gitcvs.dbuser:: | 
|  | Database user. Only useful if setting `dbdriver`, since | 
|  | SQLite has no concept of database users. Supports variable | 
|  | substitution (see below). | 
|  |  | 
|  | gitcvs.dbpass:: | 
|  | Database password. Only useful if setting `dbdriver`, since | 
|  | SQLite has no concept of database passwords. | 
|  |  | 
|  | gitcvs.dbTableNamePrefix:: | 
|  | Database table name prefix. Supports variable substitution | 
|  | (see below). Any non-alphabetic characters will be replaced | 
|  | with underscores. | 
|  |  | 
|  | All variables can also be set per access method, see <<configaccessmethod,above>>. | 
|  |  | 
|  | Variable substitution | 
|  | ^^^^^^^^^^^^^^^^^^^^^ | 
|  | In `dbdriver` and `dbuser` you can use the following variables: | 
|  |  | 
|  | %G:: | 
|  | git directory name | 
|  | %g:: | 
|  | git directory name, where all characters except for | 
|  | alpha-numeric ones, `.`, and `-` are replaced with | 
|  | `_` (this should make it easier to use the directory | 
|  | name in a filename if wanted) | 
|  | %m:: | 
|  | CVS module/git head name | 
|  | %a:: | 
|  | access method (one of "ext" or "pserver") | 
|  | %u:: | 
|  | Name of the user running 'git-cvsserver'. | 
|  | If no name can be determined, the | 
|  | numeric uid is used. | 
|  |  | 
|  | Eclipse CVS Client Notes | 
|  | ------------------------ | 
|  |  | 
|  | To get a checkout with the Eclipse CVS client: | 
|  |  | 
|  | 1. Select "Create a new project -> From CVS checkout" | 
|  | 2. Create a new location. See the notes below for details on how to choose the | 
|  | right protocol. | 
|  | 3. Browse the 'modules' available. It will give you a list of the heads in | 
|  | the repository. You will not be able to browse the tree from there. Only | 
|  | the heads. | 
|  | 4. Pick 'HEAD' when it asks what branch/tag to check out. Untick the | 
|  | "launch commit wizard" to avoid committing the .project file. | 
|  |  | 
|  | Protocol notes: If you are using anonymous access via pserver, just select that. | 
|  | Those using SSH access should choose the 'ext' protocol, and configure 'ext' | 
|  | access on the Preferences->Team->CVS->ExtConnection pane. Set CVS_SERVER to | 
|  | "'git cvsserver'". Note that password support is not good when using 'ext', | 
|  | you will definitely want to have SSH keys setup. | 
|  |  | 
|  | Alternatively, you can just use the non-standard extssh protocol that Eclipse | 
|  | offer. In that case CVS_SERVER is ignored, and you will have to replace | 
|  | the cvs utility on the server with 'git-cvsserver' or manipulate your `.bashrc` | 
|  | so that calling 'cvs' effectively calls 'git-cvsserver'. | 
|  |  | 
|  | Clients known to work | 
|  | --------------------- | 
|  |  | 
|  | - CVS 1.12.9 on Debian | 
|  | - CVS 1.11.17 on MacOSX (from Fink package) | 
|  | - Eclipse 3.0, 3.1.2 on MacOSX (see Eclipse CVS Client Notes) | 
|  | - TortoiseCVS | 
|  |  | 
|  | Operations supported | 
|  | -------------------- | 
|  |  | 
|  | All the operations required for normal use are supported, including | 
|  | checkout, diff, status, update, log, add, remove, commit. | 
|  | Legacy monitoring operations are not supported (edit, watch and related). | 
|  | Exports and tagging (tags and branches) are not supported at this stage. | 
|  |  | 
|  | CRLF Line Ending Conversions | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | By default the server leaves the '-k' mode blank for all files, | 
|  | which causes the cvs client to treat them as a text files, subject | 
|  | to crlf conversion on some platforms. | 
|  |  | 
|  | You can make the server use `crlf` attributes to set the '-k' modes | 
|  | for files by setting the `gitcvs.usecrlfattr` config variable. | 
|  | In this case, if `crlf` is explicitly unset ('-crlf'), then the | 
|  | server will set '-kb' mode for binary files. If `crlf` is set, | 
|  | then the '-k' mode will explicitly be left blank. See | 
|  | also linkgit:gitattributes[5] for more information about the `crlf` | 
|  | attribute. | 
|  |  | 
|  | Alternatively, if `gitcvs.usecrlfattr` config is not enabled | 
|  | or if the `crlf` attribute is unspecified for a filename, then | 
|  | the server uses the `gitcvs.allbinary` config for the default setting. | 
|  | If `gitcvs.allbinary` is set, then file not otherwise | 
|  | specified will default to '-kb' mode. Otherwise the '-k' mode | 
|  | is left blank. But if `gitcvs.allbinary` is set to "guess", then | 
|  | the correct '-k' mode will be guessed based on the contents of | 
|  | the file. | 
|  |  | 
|  | For best consistency with 'cvs', it is probably best to override the | 
|  | defaults by setting `gitcvs.usecrlfattr` to true, | 
|  | and `gitcvs.allbinary` to "guess". | 
|  |  | 
|  | Dependencies | 
|  | ------------ | 
|  | 'git-cvsserver' depends on DBD::SQLite. | 
|  |  | 
|  | Copyright and Authors | 
|  | --------------------- | 
|  |  | 
|  | This program is copyright The Open University UK - 2006. | 
|  |  | 
|  | Authors: | 
|  |  | 
|  | - Martyn Smith <martyn@catalyst.net.nz> | 
|  | - Martin Langhoff <martin@catalyst.net.nz> | 
|  |  | 
|  | with ideas and patches from participants of the git-list <git@vger.kernel.org>. | 
|  |  | 
|  | Documentation | 
|  | -------------- | 
|  | Documentation by Martyn Smith <martyn@catalyst.net.nz>, Martin Langhoff <martin@catalyst.net.nz>, and Matthias Urlichs <smurf@smurf.noris.de>. | 
|  |  | 
|  | GIT | 
|  | --- | 
|  | Part of the linkgit:git[1] suite |