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