Autogenerated manpages for v2.46.0-551-gc5ee8
[git-manpages.git] / man1 / git-cvsserver.1
blobf9d88bd1cddc1c3a871c6f9fbc1d12ffe7377e6b
1 '\" t
2 .\"     Title: git-cvsserver
3 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
4 .\" Generator: DocBook XSL Stylesheets v1.79.2 <http://docbook.sf.net/>
5 .\"      Date: 2024-09-10
6 .\"    Manual: Git Manual
7 .\"    Source: Git 2.46.0.551.gc5ee8f2d1c
8 .\"  Language: English
9 .\"
10 .TH "GIT\-CVSSERVER" "1" "2024-09-10" "Git 2\&.46\&.0\&.551\&.gc5ee8f" "Git Manual"
11 .\" -----------------------------------------------------------------
12 .\" * Define some portability stuff
13 .\" -----------------------------------------------------------------
14 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 .\" http://bugs.debian.org/507673
16 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
17 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18 .ie \n(.g .ds Aq \(aq
19 .el       .ds Aq '
20 .\" -----------------------------------------------------------------
21 .\" * set default formatting
22 .\" -----------------------------------------------------------------
23 .\" disable hyphenation
24 .nh
25 .\" disable justification (adjust text to left margin only)
26 .ad l
27 .\" -----------------------------------------------------------------
28 .\" * MAIN CONTENT STARTS HERE *
29 .\" -----------------------------------------------------------------
30 .SH "NAME"
31 git-cvsserver \- A CVS server emulator for Git
32 .SH "SYNOPSIS"
33 .sp
34 SSH:
35 .sp
36 .nf
37 export CVS_SERVER="git cvsserver"
38 \fIcvs\fR \-d :ext:user@server/path/repo\&.git co <HEAD_name>
39 .fi
40 .sp
41 pserver (/etc/inetd\&.conf):
42 .sp
43 .nf
44 cvspserver stream tcp nowait nobody /usr/bin/git\-cvsserver git\-cvsserver pserver
45 .fi
46 .sp
47 Usage:
48 .sp
49 .nf
50 \fIgit\-cvsserver\fR [<options>] [pserver|server] [<directory> \&...\:]
51 .fi
52 .SH "DESCRIPTION"
53 .sp
54 This application is a CVS emulation layer for Git\&.
55 .sp
56 It is highly functional\&. However, not all methods are implemented, and for those methods that are implemented, not all switches are implemented\&.
57 .sp
58 Testing has been done using both the CLI CVS client, and the Eclipse CVS plugin\&. Most functionality works fine with both of these clients\&.
59 .SH "OPTIONS"
60 .sp
61 All these options obviously only make sense if enforced by the server side\&. They have been implemented to resemble the \fBgit-daemon\fR(1) options as closely as possible\&.
62 .PP
63 \-\-base\-path <path>
64 .RS 4
65 Prepend
66 \fIpath\fR
67 to requested CVSROOT
68 .RE
69 .PP
70 \-\-strict\-paths
71 .RS 4
72 Don\(cqt allow recursing into subdirectories
73 .RE
74 .PP
75 \-\-export\-all
76 .RS 4
77 Don\(cqt check for
78 \fBgitcvs\&.enabled\fR
79 in config\&. You also have to specify a list of allowed directories (see below) if you want to use this option\&.
80 .RE
81 .PP
82 \-V, \-\-version
83 .RS 4
84 Print version information and exit
85 .RE
86 .PP
87 \-h, \-H, \-\-help
88 .RS 4
89 Print usage information and exit
90 .RE
91 .PP
92 <directory>
93 .RS 4
94 The remaining arguments provide a list of directories\&. If no directories are given, then all are allowed\&. Repositories within these directories still require the
95 \fBgitcvs\&.enabled\fR
96 config option, unless
97 \fB\-\-export\-all\fR
98 is specified\&.
99 .RE
100 .SH "LIMITATIONS"
102 CVS clients cannot tag, branch or perform Git merges\&.
104 \fIgit\-cvsserver\fR 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\&.
105 .SH "INSTALLATION"
107 .RS 4
108 .ie n \{\
109 \h'-04' 1.\h'+01'\c
111 .el \{\
112 .sp -1
113 .IP "  1." 4.2
115 If you are going to offer CVS access via pserver, add a line in /etc/inetd\&.conf like
117 .if n \{\
118 .RS 4
121    cvspserver stream tcp nowait nobody git\-cvsserver pserver
123 .if n \{\
127 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
129 .if n \{\
130 .RS 4
133    cvspserver stream tcp nowait nobody /usr/bin/git\-cvsserver git\-cvsserver pserver
135 .if n \{\
139 Only anonymous access is provided by pserver by default\&. To commit you will have to create pserver accounts, simply add a gitcvs\&.authdb setting in the config file of the repositories you want the cvsserver to allow writes to, for example:
141 .if n \{\
142 .RS 4
145    [gitcvs]
146         authdb = /etc/cvsserver/passwd
148 .if n \{\
152 The format of these files is username followed by the encrypted password, for example:
154 .if n \{\
155 .RS 4
158    myuser:sqkNi8zPf01HI
159    myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/
160    myuser:$5$\&.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3
162 .if n \{\
166 You can use the
167 \fIhtpasswd\fR
168 facility that comes with Apache to make these files, but only with the \-d option (or \-B if your system supports it)\&.
170 Preferably use the system specific utility that manages password hash creation in your platform (e\&.g\&. mkpasswd in Linux, encrypt in OpenBSD or pwhash in NetBSD) and paste it in the right location\&.
172 Then provide your password via the pserver method, for example:
174 .if n \{\
175 .RS 4
178    cvs \-d:pserver:someuser:somepassword@server:/path/repo\&.git co <HEAD_name>
180 .if n \{\
184 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
185 \fIgit\-cvsserver\fR
187 \fBcvs\fR\&.
189 Note: Newer CVS versions (>= 1\&.12\&.11) also support specifying CVS_SERVER directly in CVSROOT like
191 .if n \{\
192 .RS 4
195    cvs \-d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo\&.git" co <HEAD_name>
197 .if n \{\
201 This has the advantage that it will be saved in your
202 \fICVS/Root\fR
203 files and you don\(cqt need to worry about always setting the correct environment variable\&. SSH users restricted to
204 \fIgit\-shell\fR
205 don\(cqt need to override the default with CVS_SERVER (and shouldn\(cqt) as
206 \fIgit\-shell\fR
207 understands
208 \fBcvs\fR
209 to mean
210 \fIgit\-cvsserver\fR
211 and pretends that the other end runs the real
212 \fIcvs\fR
213 better\&.
216 .RS 4
217 .ie n \{\
218 \h'-04' 2.\h'+01'\c
220 .el \{\
221 .sp -1
222 .IP "  2." 4.2
224 For each repo that you want accessible from CVS you need to edit config in the repo and add the following section\&.
226 .if n \{\
227 .RS 4
230    [gitcvs]
231         enabled=1
232         # optional for debugging
233         logFile=/path/to/logfile
235 .if n \{\
239 Note: you need to ensure each user that is going to invoke
240 \fIgit\-cvsserver\fR
241 has write access to the log file and to the database (see
242 Database Backend\&. If you want to offer write access over SSH, the users of course also need write access to the Git repository itself\&.
244 You also need to ensure that each repository is "bare" (without a Git index file) for
245 \fBcvs commit\fR
246 to work\&. See
247 \fBgitcvs-migration\fR(7)\&.
249 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\&.
251 .if n \{\
252 .RS 4
255    [gitcvs]
256         enabled=0
258    [gitcvs "ext"]
259         enabled=1
261 .if n \{\
266 .RS 4
267 .ie n \{\
268 \h'-04' 3.\h'+01'\c
270 .el \{\
271 .sp -1
272 .IP "  3." 4.2
274 If you didn\(cqt specify the CVSROOT/CVS_SERVER directly in the checkout command, automatically saving it in your
275 \fICVS/Root\fR
276 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
277 \fInot\fR
278 restricted to
279 \fIgit\-shell\fR, CVS_SERVER should be set to
280 \fIgit\-cvsserver\fR\&.
282 .if n \{\
283 .RS 4
286    export CVSROOT=:ext:user@server:/var/git/project\&.git
287    export CVS_SERVER="git cvsserver"
289 .if n \{\
294 .RS 4
295 .ie n \{\
296 \h'-04' 4.\h'+01'\c
298 .el \{\
299 .sp -1
300 .IP "  4." 4.2
302 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\&.
305 .RS 4
306 .ie n \{\
307 \h'-04' 5.\h'+01'\c
309 .el \{\
310 .sp -1
311 .IP "  5." 4.2
313 Clients should now be able to check out the project\&. Use the CVS
314 \fImodule\fR
315 name to indicate what Git
316 \fIhead\fR
317 you want to check out\&. This also sets the name of your newly checked\-out directory, unless you tell it otherwise with
318 \fB\-d <dir\-name>\fR\&. For example, this checks out
319 \fImaster\fR
320 branch to the
321 \fBproject\-master\fR
322 directory:
324 .if n \{\
325 .RS 4
328    cvs co \-d project\-master master
330 .if n \{\
334 .SH "DATABASE BACKEND"
336 \fIgit\-cvsserver\fR uses one database per Git head (i\&.e\&. CVS module) to store information about the repository to maintain consistent CVS revision numbers\&. The database needs to be updated (i\&.e\&. written to) after every commit\&.
338 If the commit is done directly by using \fBgit\fR (as opposed to using \fIgit\-cvsserver\fR) the update will need to happen on the next repository access by \fIgit\-cvsserver\fR, independent of access method and requested operation\&.
340 That means that even if you offer only read access (e\&.g\&. by using the pserver method), \fIgit\-cvsserver\fR 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 \fIgit\-cvsserver\fR is executed)\&.
342 By default it uses SQLite databases in the Git directory, named \fBgitcvs\&.<module\-name>\&.sqlite\fR\&. 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 \fIgit\-cvsserver\fR write access to the database file without granting them write access to the directory, too\&.
344 The database cannot be reliably regenerated in a consistent form after the branch it is tracking has changed\&. Example: For merged branches, \fIgit\-cvsserver\fR only tracks one branch of development, and after a \fIgit merge\fR an incrementally updated database may track a different branch than a database regenerated from scratch, causing inconsistent CVS revision numbers\&. \fBgit\-cvsserver\fR has no way of knowing which branch it would have picked if it had been run incrementally pre\-merge\&. So if you have to fully or partially (from old backup) regenerate the database, you should be suspicious of pre\-existing CVS sandboxes\&.
346 You can configure the database backend with the following configuration variables:
347 .SS "Configuring database backend"
349 \fIgit\-cvsserver\fR uses the Perl DBI module\&. Please also read its documentation if changing these variables, especially about \fBDBI\->connect()\fR\&.
351 gitcvs\&.dbName
352 .RS 4
353 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 (\fB;\fR)\&. Default:
354 \fI%Ggitcvs\&.%m\&.sqlite\fR
357 gitcvs\&.dbDriver
358 .RS 4
359 Used DBI driver\&. You can specify any available driver for this here, but it might not work\&. cvsserver is tested with
360 \fIDBD::SQLite\fR, reported to work with
361 \fIDBD::Pg\fR, and reported
362 \fBnot\fR
363 to work with
364 \fIDBD::mysql\fR\&. Please regard this as an experimental feature\&. May not contain colons (\fB:\fR)\&. Default:
365 \fISQLite\fR
368 gitcvs\&.dbuser
369 .RS 4
370 Database user\&. Only useful if setting
371 \fBdbDriver\fR, since SQLite has no concept of database users\&. Supports variable substitution (see below)\&.
374 gitcvs\&.dbPass
375 .RS 4
376 Database password\&. Only useful if setting
377 \fBdbDriver\fR, since SQLite has no concept of database passwords\&.
380 gitcvs\&.dbTableNamePrefix
381 .RS 4
382 Database table name prefix\&. Supports variable substitution (see below)\&. Any non\-alphabetic characters will be replaced with underscores\&.
385 All variables can also be set per access method, see above\&.
387 .it 1 an-trap
388 .nr an-no-space-flag 1
389 .nr an-break-flag 1
391 .ps +1
392 \fBVariable substitution\fR
393 .RS 4
395 In \fBdbDriver\fR and \fBdbUser\fR you can use the following variables:
398 .RS 4
399 Git directory name
403 .RS 4
404 Git directory name, where all characters except for alphanumeric ones,
405 \fB\&.\fR, and
406 \fB\-\fR
407 are replaced with
408 \fB_\fR
409 (this should make it easier to use the directory name in a filename if wanted)
413 .RS 4
414 CVS module/Git head name
418 .RS 4
419 access method (one of "ext" or "pserver")
423 .RS 4
424 Name of the user running
425 \fIgit\-cvsserver\fR\&. If no name can be determined, the numeric uid is used\&.
428 .SH "ENVIRONMENT"
430 These variables obviate the need for command\-line options in some circumstances, allowing easier restricted usage through git\-shell\&.
432 GIT_CVSSERVER_BASE_PATH
433 .RS 4
434 This variable replaces the argument to \-\-base\-path\&.
437 GIT_CVSSERVER_ROOT
438 .RS 4
439 This variable specifies a single directory, replacing the
440 \fB<directory>\&.\&.\&.\fR
441 argument list\&. The repository still requires the
442 \fBgitcvs\&.enabled\fR
443 config option, unless
444 \fB\-\-export\-all\fR
445 is specified\&.
448 When these environment variables are set, the corresponding command\-line arguments may not be used\&.
449 .SH "ECLIPSE CVS CLIENT NOTES"
451 To get a checkout with the Eclipse CVS client:
453 .RS 4
454 .ie n \{\
455 \h'-04' 1.\h'+01'\c
457 .el \{\
458 .sp -1
459 .IP "  1." 4.2
461 Select "Create a new project \(-> From CVS checkout"
464 .RS 4
465 .ie n \{\
466 \h'-04' 2.\h'+01'\c
468 .el \{\
469 .sp -1
470 .IP "  2." 4.2
472 Create a new location\&. See the notes below for details on how to choose the right protocol\&.
475 .RS 4
476 .ie n \{\
477 \h'-04' 3.\h'+01'\c
479 .el \{\
480 .sp -1
481 .IP "  3." 4.2
483 Browse the
484 \fImodules\fR
485 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\&.
488 .RS 4
489 .ie n \{\
490 \h'-04' 4.\h'+01'\c
492 .el \{\
493 .sp -1
494 .IP "  4." 4.2
496 Pick
497 \fBHEAD\fR
498 when it asks what branch/tag to check out\&. Untick the "launch commit wizard" to avoid committing the \&.project file\&.
501 Protocol notes: If you are using anonymous access via pserver, just select that\&. Those using SSH access should choose the \fIext\fR protocol, and configure \fIext\fR access on the Preferences\(->Team\(->CVS\(->ExtConnection pane\&. Set CVS_SERVER to "\fBgit cvsserver\fR"\&. Note that password support is not good when using \fIext\fR, you will definitely want to have SSH keys setup\&.
503 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 \fIgit\-cvsserver\fR or manipulate your \fB\&.bashrc\fR so that calling \fIcvs\fR effectively calls \fIgit\-cvsserver\fR\&.
504 .SH "CLIENTS KNOWN TO WORK"
506 .RS 4
507 .ie n \{\
508 \h'-04'\(bu\h'+03'\c
510 .el \{\
511 .sp -1
512 .IP \(bu 2.3
514 CVS 1\&.12\&.9 on Debian
517 .RS 4
518 .ie n \{\
519 \h'-04'\(bu\h'+03'\c
521 .el \{\
522 .sp -1
523 .IP \(bu 2.3
525 CVS 1\&.11\&.17 on MacOSX (from Fink package)
528 .RS 4
529 .ie n \{\
530 \h'-04'\(bu\h'+03'\c
532 .el \{\
533 .sp -1
534 .IP \(bu 2.3
536 Eclipse 3\&.0, 3\&.1\&.2 on MacOSX (see Eclipse CVS Client Notes)
539 .RS 4
540 .ie n \{\
541 \h'-04'\(bu\h'+03'\c
543 .el \{\
544 .sp -1
545 .IP \(bu 2.3
547 TortoiseCVS
549 .SH "OPERATIONS SUPPORTED"
551 All the operations required for normal use are supported, including checkout, diff, status, update, log, add, remove, commit\&.
553 Most CVS command arguments that read CVS tags or revision numbers (typically \-r) work, and also support any git refspec (tag, branch, commit ID, etc)\&. However, CVS revision numbers for non\-default branches are not well emulated, and cvs log does not show tags or branches at all\&. (Non\-main\-branch CVS revision numbers superficially resemble CVS revision numbers, but they actually encode a git commit ID directly, rather than represent the number of revisions since the branch point\&.)
555 Note that there are two ways to checkout a particular branch\&. As described elsewhere on this page, the "module" parameter of cvs checkout is interpreted as a branch name, and it becomes the main branch\&. It remains the main branch for a given sandbox even if you temporarily make another branch sticky with cvs update \-r\&. Alternatively, the \-r argument can indicate some other branch to actually checkout, even though the module is still the "main" branch\&. Tradeoffs (as currently implemented): Each new "module" creates a new database on disk with a history for the given module, and after the database is created, operations against that main branch are fast\&. Or alternatively, \-r doesn\(cqt take any extra disk space, but may be significantly slower for many operations, like cvs update\&.
557 If you want to refer to a git refspec that has characters that are not allowed by CVS, you have two options\&. First, it may just work to supply the git refspec directly to the appropriate CVS \-r argument; some CVS clients don\(cqt seem to do much sanity checking of the argument\&. Second, if that fails, you can use a special character escape mechanism that only uses characters that are valid in CVS tags\&. A sequence of 4 or 5 characters of the form (underscore (\fB"_"\fR), dash (\fB"\-"\fR), one or two characters, and dash (\fB"\-"\fR)) can encode various characters based on the one or two letters: \fB"s"\fR for slash (\fB"/"\fR), \fB"p"\fR for period (\fB"\&."\fR), \fB"u"\fR for underscore (\fB"_"\fR), or two hexadecimal digits for any byte value at all (typically an ASCII number, or perhaps a part of a UTF\-8 encoded character)\&.
559 Legacy monitoring operations are not supported (edit, watch and related)\&. Exports and tagging (tags and branches) are not supported at this stage\&.
560 .SS "CRLF Line Ending Conversions"
562 By default the server leaves the \fB\-k\fR mode blank for all files, which causes the CVS client to treat them as a text files, subject to end\-of\-line conversion on some platforms\&.
564 You can make the server use the end\-of\-line conversion attributes to set the \fB\-k\fR modes for files by setting the \fBgitcvs\&.usecrlfattr\fR config variable\&. See \fBgitattributes\fR(5) for more information about end\-of\-line conversion\&.
566 Alternatively, if \fBgitcvs\&.usecrlfattr\fR config is not enabled or the attributes do not allow automatic detection for a filename, then the server uses the \fBgitcvs\&.allBinary\fR config for the default setting\&. If \fBgitcvs\&.allBinary\fR is set, then file not otherwise specified will default to \fI\-kb\fR mode\&. Otherwise the \fB\-k\fR mode is left blank\&. But if \fBgitcvs\&.allBinary\fR is set to "guess", then the correct \fB\-k\fR mode will be guessed based on the contents of the file\&.
568 For best consistency with \fIcvs\fR, it is probably best to override the defaults by setting \fBgitcvs\&.usecrlfattr\fR to true, and \fBgitcvs\&.allBinary\fR to "guess"\&.
569 .SH "DEPENDENCIES"
571 \fIgit\-cvsserver\fR depends on DBD::SQLite\&.
572 .SH "GIT"
574 Part of the \fBgit\fR(1) suite