1git-cvsserver(1) 2================ 3 4NAME 5---- 6git-cvsserver - A CVS server emulator for git 7 8SYNOPSIS 9-------- 10 11SSH: 12 13[verse] 14export CVS_SERVER=git-cvsserver 15'cvs' -d :ext:user@server/path/repo.git co <HEAD_name> 16 17pserver (/etc/inetd.conf): 18 19[verse] 20cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver 21 22Usage: 23 24[verse] 25'git-cvsserver' [options] [pserver|server] [<directory> ...] 26 27OPTIONS 28------- 29 30All these options obviously only make sense if enforced by the server side. 31They have been implemented to resemble the linkgit:git-daemon[1] options as 32closely as possible. 33 34--base-path <path>:: 35Prepend 'path' to requested CVSROOT 36 37--strict-paths:: 38Don't allow recursing into subdirectories 39 40--export-all:: 41Don't check for `gitcvs.enabled` in config. You also have to specify a list 42of allowed directories (see below) if you want to use this option. 43 44--version, -V:: 45Print version information and exit 46 47--help, -h, -H:: 48Print usage information and exit 49 50<directory>:: 51You can specify a list of allowed directories. If no directories 52are given, all are allowed. This is an additional restriction, gitcvs 53access still needs to be enabled by the `gitcvs.enabled` config option 54unless '--export-all' was given, too. 55 56 57DESCRIPTION 58----------- 59 60This application is a CVS emulation layer for git. 61 62It is highly functional. However, not all methods are implemented, 63and for those methods that are implemented, 64not all switches are implemented. 65 66Testing has been done using both the CLI CVS client, and the Eclipse CVS 67plugin. Most functionality works fine with both of these clients. 68 69LIMITATIONS 70----------- 71 72Currently cvsserver works over SSH connections for read/write clients, and 73over pserver for anonymous CVS access. 74 75CVS clients cannot tag, branch or perform GIT merges. 76 77git-cvsserver maps GIT branches to CVS modules. This is very different 78from what most CVS users would expect since in CVS modules usually represent 79one or more directories. 80 81INSTALLATION 82------------ 83 841. If you are going to offer anonymous CVS access via pserver, add a line in 85 /etc/inetd.conf like 86+ 87-- 88------ 89 cvspserver stream tcp nowait nobody git-cvsserver pserver 90 91------ 92Note: Some inetd servers let you specify the name of the executable 93independently of the value of argv[0] (i.e. the name the program assumes 94it was executed with). In this case the correct line in /etc/inetd.conf 95looks like 96 97------ 98 cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver 99 100------ 101No special setup is needed for SSH access, other than having GIT tools 102in the PATH. If you have clients that do not accept the CVS_SERVER 103environment variable, you can rename git-cvsserver to cvs. 104 105Note: Newer CVS versions (>= 1.12.11) also support specifying 106CVS_SERVER directly in CVSROOT like 107 108------ 109cvs -d ":ext;CVS_SERVER=git-cvsserver:user@server/path/repo.git" co <HEAD_name> 110------ 111This has the advantage that it will be saved in your 'CVS/Root' files and 112you don't need to worry about always setting the correct environment 113variable. SSH users restricted to git-shell don't need to override the default 114with CVS_SERVER (and shouldn't) as git-shell understands `cvs` to mean 115git-cvsserver and pretends that the other end runs the real cvs better. 116-- 1172. For each repo that you want accessible from CVS you need to edit config in 118 the repo and add the following section. 119+ 120-- 121------ 122 [gitcvs] 123 enabled=1 124 # optional for debugging 125 logfile=/path/to/logfile 126 127------ 128Note: you need to ensure each user that is going to invoke git-cvsserver has 129write access to the log file and to the database (see 130<<dbbackend,Database Backend>>. If you want to offer write access over 131SSH, the users of course also need write access to the git repository itself. 132 133[[configaccessmethod]] 134All configuration variables can also be overridden for a specific method of 135access. Valid method names are "ext" (for SSH access) and "pserver". The 136following example configuration would disable pserver access while still 137allowing access over SSH. 138------ 139 [gitcvs] 140 enabled=0 141 142 [gitcvs "ext"] 143 enabled=1 144------ 145-- 1463. If you didn't specify the CVSROOT/CVS_SERVER directly in the checkout command, 147 automatically saving it in your 'CVS/Root' files, then you need to set them 148 explicitly in your environment. CVSROOT should be set as per normal, but the 149 directory should point at the appropriate git repo. As above, for SSH clients 150 _not_ restricted to git-shell, CVS_SERVER should be set to git-cvsserver. 151+ 152-- 153------ 154 export CVSROOT=:ext:user@server:/var/git/project.git 155 export CVS_SERVER=git-cvsserver 156------ 157-- 1584. For SSH clients that will make commits, make sure their server-side 159 .ssh/environment files (or .bashrc, etc., according to their specific shell) 160 export appropriate values for GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, 161 GIT_COMMITTER_NAME, and GIT_COMMITTER_EMAIL. For SSH clients whose login 162 shell is bash, .bashrc may be a reasonable alternative. 163 1645. Clients should now be able to check out the project. Use the CVS 'module' 165 name to indicate what GIT 'head' you want to check out. This also sets the 166 name of your newly checked-out directory, unless you tell it otherwise with 167 `-d <dir_name>`. For example, this checks out 'master' branch to the 168 `project-master` directory: 169+ 170------ 171 cvs co -d project-master master 172------ 173 174[[dbbackend]] 175Database Backend 176---------------- 177 178git-cvsserver uses one database per git head (i.e. CVS module) to 179store information about the repository for faster access. The 180database doesn't contain any persistent data and can be completely 181regenerated from the git repository at any time. The database 182needs to be updated (i.e. written to) after every commit. 183 184If the commit is done directly by using git (as opposed to 185using git-cvsserver) the update will need to happen on the 186next repository access by git-cvsserver, independent of 187access method and requested operation. 188 189That means that even if you offer only read access (e.g. by using 190the pserver method), git-cvsserver should have write access to 191the database to work reliably (otherwise you need to make sure 192that the database is up-to-date any time git-cvsserver is executed). 193 194By default it uses SQLite databases in the git directory, named 195`gitcvs.<module_name>.sqlite`. Note that the SQLite backend creates 196temporary files in the same directory as the database file on 197write so it might not be enough to grant the users using 198git-cvsserver write access to the database file without granting 199them write access to the directory, too. 200 201You can configure the database backend with the following 202configuration variables: 203 204Configuring database backend 205~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 206 207git-cvsserver uses the Perl DBI module. Please also read 208its documentation if changing these variables, especially 209about `DBI->connect()`. 210 211gitcvs.dbname:: 212 Database name. The exact meaning depends on the 213 selected database driver, for SQLite this is a filename. 214 Supports variable substitution (see below). May 215 not contain semicolons (`;`). 216 Default: '%Ggitcvs.%m.sqlite' 217 218gitcvs.dbdriver:: 219 Used DBI driver. You can specify any available driver 220 for this here, but it might not work. cvsserver is tested 221 with 'DBD::SQLite', reported to work with 222 'DBD::Pg', and reported *not* to work with 'DBD::mysql'. 223 Please regard this as an experimental feature. May not 224 contain colons (`:`). 225 Default: 'SQLite' 226 227gitcvs.dbuser:: 228 Database user. Only useful if setting `dbdriver`, since 229 SQLite has no concept of database users. Supports variable 230 substitution (see below). 231 232gitcvs.dbpass:: 233 Database password. Only useful if setting `dbdriver`, since 234 SQLite has no concept of database passwords. 235 236gitcvs.dbTableNamePrefix:: 237 Database table name prefix. Supports variable substitution 238 (see below). Any non-alphabetic characters will be replaced 239 with underscores. 240 241All variables can also be set per access method, see <<configaccessmethod,above>>. 242 243Variable substitution 244^^^^^^^^^^^^^^^^^^^^^ 245In `dbdriver` and `dbuser` you can use the following variables: 246 247%G:: 248 git directory name 249%g:: 250 git directory name, where all characters except for 251 alpha-numeric ones, `.`, and `-` are replaced with 252 `_` (this should make it easier to use the directory 253 name in a filename if wanted) 254%m:: 255 CVS module/git head name 256%a:: 257 access method (one of "ext" or "pserver") 258%u:: 259 Name of the user running git-cvsserver. 260 If no name can be determined, the 261 numeric uid is used. 262 263Eclipse CVS Client Notes 264------------------------ 265 266To get a checkout with the Eclipse CVS client: 267 2681. Select "Create a new project -> From CVS checkout" 2692. Create a new location. See the notes below for details on how to choose the 270 right protocol. 2713. Browse the 'modules' available. It will give you a list of the heads in 272 the repository. You will not be able to browse the tree from there. Only 273 the heads. 2744. Pick 'HEAD' when it asks what branch/tag to check out. Untick the 275 "launch commit wizard" to avoid committing the .project file. 276 277Protocol notes: If you are using anonymous access via pserver, just select that. 278Those using SSH access should choose the 'ext' protocol, and configure 'ext' 279access on the Preferences->Team->CVS->ExtConnection pane. Set CVS_SERVER to 280'git-cvsserver'. Note that password support is not good when using 'ext', 281you will definitely want to have SSH keys setup. 282 283Alternatively, you can just use the non-standard extssh protocol that Eclipse 284offer. In that case CVS_SERVER is ignored, and you will have to replace 285the cvs utility on the server with git-cvsserver or manipulate your `.bashrc` 286so that calling 'cvs' effectively calls git-cvsserver. 287 288Clients known to work 289--------------------- 290 291- CVS 1.12.9 on Debian 292- CVS 1.11.17 on MacOSX (from Fink package) 293- Eclipse 3.0, 3.1.2 on MacOSX (see Eclipse CVS Client Notes) 294- TortoiseCVS 295 296Operations supported 297-------------------- 298 299All the operations required for normal use are supported, including 300checkout, diff, status, update, log, add, remove, commit. 301Legacy monitoring operations are not supported (edit, watch and related). 302Exports and tagging (tags and branches) are not supported at this stage. 303 304CRLF Line Ending Conversions 305~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 306 307By default the server leaves the '-k' mode blank for all files, 308which causes the cvs client to treat them as a text files, subject 309to crlf conversion on some platforms. 310 311You can make the server use `crlf` attributes to set the '-k' modes 312for files by setting the `gitcvs.usecrlfattr` config variable. 313In this case, if `crlf` is explicitly unset ('-crlf'), then the 314server will set '-kb' mode for binary files. If `crlf` is set, 315then the '-k' mode will explicitly be left blank. See 316also linkgit:gitattributes[5] for more information about the `crlf` 317attribute. 318 319Alternatively, if `gitcvs.usecrlfattr` config is not enabled 320or if the `crlf` attribute is unspecified for a filename, then 321the server uses the `gitcvs.allbinary` config for the default setting. 322If `gitcvs.allbinary` is set, then file not otherwise 323specified will default to '-kb' mode. Otherwise the '-k' mode 324is left blank. But if `gitcvs.allbinary` is set to "guess", then 325the correct '-k' mode will be guessed based on the contents of 326the file. 327 328For best consistency with cvs, it is probably best to override the 329defaults by setting `gitcvs.usecrlfattr` to true, 330and `gitcvs.allbinary` to "guess". 331 332Dependencies 333------------ 334 335git-cvsserver depends on DBD::SQLite. 336 337Copyright and Authors 338--------------------- 339 340This program is copyright The Open University UK - 2006. 341 342Authors: 343 344- Martyn Smith <martyn@catalyst.net.nz> 345- Martin Langhoff <martin@catalyst.net.nz> 346 347with ideas and patches from participants of the git-list <git@vger.kernel.org>. 348 349Documentation 350-------------- 351Documentation by Martyn Smith <martyn@catalyst.net.nz>, Martin Langhoff <martin@catalyst.net.nz>, and Matthias Urlichs <smurf@smurf.noris.de>. 352 353GIT 354--- 355Part of the linkgit:git[7] suite