]>
Commit | Line | Data |
---|---|---|
3fda8c4c ML |
1 | git-cvsserver(1) |
2 | ================ | |
3 | ||
4 | NAME | |
5 | ---- | |
2de9b711 | 6 | git-cvsserver - A CVS server emulator for Git |
3fda8c4c | 7 | |
3fda8c4c ML |
8 | SYNOPSIS |
9 | -------- | |
693b6327 FL |
10 | |
11 | SSH: | |
12 | ||
3fda8c4c | 13 | [verse] |
da9973c6 | 14 | export CVS_SERVER="git cvsserver" |
3fda8c4c ML |
15 | 'cvs' -d :ext:user@server/path/repo.git co <HEAD_name> |
16 | ||
693b6327 FL |
17 | pserver (/etc/inetd.conf): |
18 | ||
19 | [verse] | |
20 | cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver | |
21 | ||
22 | Usage: | |
23 | ||
24 | [verse] | |
de613050 | 25 | 'git-cvsserver' [<options>] [pserver|server] [<directory> ...] |
693b6327 | 26 | |
414abf15 ÆAB |
27 | DESCRIPTION |
28 | ----------- | |
29 | ||
30 | This application is a CVS emulation layer for Git. | |
31 | ||
32 | It is highly functional. However, not all methods are implemented, | |
33 | and for those methods that are implemented, | |
34 | not all switches are implemented. | |
35 | ||
36 | Testing has been done using both the CLI CVS client, and the Eclipse CVS | |
37 | plugin. Most functionality works fine with both of these clients. | |
38 | ||
693b6327 FL |
39 | OPTIONS |
40 | ------- | |
41 | ||
42 | All these options obviously only make sense if enforced by the server side. | |
5162e697 | 43 | They have been implemented to resemble the linkgit:git-daemon[1] options as |
693b6327 FL |
44 | closely as possible. |
45 | ||
46 | --base-path <path>:: | |
47 | Prepend 'path' to requested CVSROOT | |
48 | ||
49 | --strict-paths:: | |
50 | Don't allow recursing into subdirectories | |
51 | ||
52 | --export-all:: | |
226bccb9 FL |
53 | Don't check for `gitcvs.enabled` in config. You also have to specify a list |
54 | of allowed directories (see below) if you want to use this option. | |
693b6327 | 55 | |
3240240f SB |
56 | -V:: |
57 | --version:: | |
693b6327 FL |
58 | Print version information and exit |
59 | ||
3240240f SB |
60 | -h:: |
61 | -H:: | |
62 | --help:: | |
693b6327 FL |
63 | Print usage information and exit |
64 | ||
65 | <directory>:: | |
acc5e287 DS |
66 | The remaining arguments provide a list of directories. If no directories |
67 | are given, then all are allowed. Repositories within these directories | |
68 | still require the `gitcvs.enabled` config option, unless `--export-all` | |
69 | is specified. | |
693b6327 | 70 | |
3fda8c4c ML |
71 | LIMITATIONS |
72 | ----------- | |
3fda8c4c | 73 | |
48a8c26c | 74 | CVS clients cannot tag, branch or perform Git merges. |
3fda8c4c | 75 | |
48a8c26c | 76 | 'git-cvsserver' maps Git branches to CVS modules. This is very different |
b2475703 FL |
77 | from what most CVS users would expect since in CVS modules usually represent |
78 | one or more directories. | |
79 | ||
3fda8c4c ML |
80 | INSTALLATION |
81 | ------------ | |
b30cc0da | 82 | |
031a027a | 83 | 1. If you are going to offer CVS access via pserver, add a line in |
b30cc0da | 84 | /etc/inetd.conf like |
0fc8573d FD |
85 | + |
86 | -- | |
87 | ------ | |
b30cc0da ML |
88 | cvspserver stream tcp nowait nobody git-cvsserver pserver |
89 | ||
0fc8573d | 90 | ------ |
893c365a FL |
91 | Note: Some inetd servers let you specify the name of the executable |
92 | independently of the value of argv[0] (i.e. the name the program assumes | |
93 | it was executed with). In this case the correct line in /etc/inetd.conf | |
94 | looks like | |
b30cc0da | 95 | |
0fc8573d | 96 | ------ |
893c365a | 97 | cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver |
b30cc0da | 98 | |
0fc8573d | 99 | ------ |
031a027a | 100 | |
4b81f690 | 101 | Only anonymous access is provided by pserver by default. To commit you |
c057bad3 SV |
102 | will have to create pserver accounts, simply add a gitcvs.authdb |
103 | setting in the config file of the repositories you want the cvsserver | |
104 | to allow writes to, for example: | |
031a027a ÆAB |
105 | |
106 | ------ | |
107 | ||
c057bad3 SV |
108 | [gitcvs] |
109 | authdb = /etc/cvsserver/passwd | |
031a027a ÆAB |
110 | |
111 | ------ | |
f745acb0 | 112 | The format of these files is username followed by the encrypted password, |
c057bad3 SV |
113 | for example: |
114 | ||
115 | ------ | |
4b81f690 CMAB |
116 | myuser:sqkNi8zPf01HI |
117 | myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/ | |
118 | myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3 | |
c057bad3 SV |
119 | ------ |
120 | You can use the 'htpasswd' facility that comes with Apache to make these | |
a7775c7e | 121 | files, but only with the -d option (or -B if your system suports it). |
c057bad3 | 122 | |
a7775c7e CMAB |
123 | Preferably use the system specific utility that manages password hash |
124 | creation in your platform (e.g. mkpasswd in Linux, encrypt in OpenBSD or | |
125 | pwhash in NetBSD) and paste it in the right location. | |
70d5dd1f | 126 | |
031a027a ÆAB |
127 | Then provide your password via the pserver method, for example: |
128 | ------ | |
4b81f690 | 129 | cvs -d:pserver:someuser:somepassword@server:/path/repo.git co <HEAD_name> |
031a027a | 130 | ------ |
48a8c26c | 131 | No special setup is needed for SSH access, other than having Git tools |
0fc8573d | 132 | in the PATH. If you have clients that do not accept the CVS_SERVER |
ba020ef5 | 133 | environment variable, you can rename 'git-cvsserver' to `cvs`. |
54842895 | 134 | |
db218723 | 135 | Note: Newer CVS versions (>= 1.12.11) also support specifying |
54842895 FL |
136 | CVS_SERVER directly in CVSROOT like |
137 | ||
138 | ------ | |
4b81f690 | 139 | cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name> |
54842895 FL |
140 | ------ |
141 | This has the advantage that it will be saved in your 'CVS/Root' files and | |
142 | you don't need to worry about always setting the correct environment | |
ba020ef5 JN |
143 | variable. SSH users restricted to 'git-shell' don't need to override the default |
144 | with CVS_SERVER (and shouldn't) as 'git-shell' understands `cvs` to mean | |
2fd02c92 | 145 | 'git-cvsserver' and pretends that the other end runs the real 'cvs' better. |
0fc8573d | 146 | -- |
3fda8c4c ML |
147 | 2. For each repo that you want accessible from CVS you need to edit config in |
148 | the repo and add the following section. | |
0fc8573d FD |
149 | + |
150 | -- | |
151 | ------ | |
3fda8c4c ML |
152 | [gitcvs] |
153 | enabled=1 | |
b30cc0da | 154 | # optional for debugging |
da0005b8 | 155 | logFile=/path/to/logfile |
3fda8c4c | 156 | |
0fc8573d | 157 | ------ |
ba020ef5 | 158 | Note: you need to ensure each user that is going to invoke 'git-cvsserver' has |
febe7dcc FL |
159 | write access to the log file and to the database (see |
160 | <<dbbackend,Database Backend>>. If you want to offer write access over | |
2de9b711 | 161 | SSH, the users of course also need write access to the Git repository itself. |
d55820ce | 162 | |
2de9b711 | 163 | You also need to ensure that each repository is "bare" (without a Git index |
a41a32bf MO |
164 | file) for `cvs commit` to work. See linkgit:gitcvs-migration[7]. |
165 | ||
febe7dcc | 166 | [[configaccessmethod]] |
a192a909 | 167 | All configuration variables can also be overridden for a specific method of |
d55820ce FL |
168 | access. Valid method names are "ext" (for SSH access) and "pserver". The |
169 | following example configuration would disable pserver access while still | |
170 | allowing access over SSH. | |
171 | ------ | |
172 | [gitcvs] | |
173 | enabled=0 | |
174 | ||
175 | [gitcvs "ext"] | |
176 | enabled=1 | |
177 | ------ | |
0fc8573d | 178 | -- |
2c2d02a6 SC |
179 | 3. If you didn't specify the CVSROOT/CVS_SERVER directly in the checkout command, |
180 | automatically saving it in your 'CVS/Root' files, then you need to set them | |
181 | explicitly in your environment. CVSROOT should be set as per normal, but the | |
2de9b711 | 182 | directory should point at the appropriate Git repo. As above, for SSH clients |
ba020ef5 | 183 | _not_ restricted to 'git-shell', CVS_SERVER should be set to 'git-cvsserver'. |
0fc8573d FD |
184 | + |
185 | -- | |
0fc8573d | 186 | ------ |
4b81f690 CMAB |
187 | export CVSROOT=:ext:user@server:/var/git/project.git |
188 | export CVS_SERVER="git cvsserver" | |
0fc8573d FD |
189 | ------ |
190 | -- | |
2c2d02a6 SC |
191 | 4. For SSH clients that will make commits, make sure their server-side |
192 | .ssh/environment files (or .bashrc, etc., according to their specific shell) | |
193 | export appropriate values for GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, | |
194 | GIT_COMMITTER_NAME, and GIT_COMMITTER_EMAIL. For SSH clients whose login | |
195 | shell is bash, .bashrc may be a reasonable alternative. | |
b30cc0da ML |
196 | |
197 | 5. Clients should now be able to check out the project. Use the CVS 'module' | |
48a8c26c | 198 | name to indicate what Git 'head' you want to check out. This also sets the |
2c2d02a6 SC |
199 | name of your newly checked-out directory, unless you tell it otherwise with |
200 | `-d <dir_name>`. For example, this checks out 'master' branch to the | |
201 | `project-master` directory: | |
0fc8573d FD |
202 | + |
203 | ------ | |
4b81f690 | 204 | cvs co -d project-master master |
0fc8573d | 205 | ------ |
3fda8c4c | 206 | |
febe7dcc | 207 | [[dbbackend]] |
76a8788c | 208 | DATABASE BACKEND |
febe7dcc FL |
209 | ---------------- |
210 | ||
2de9b711 | 211 | 'git-cvsserver' uses one database per Git head (i.e. CVS module) to |
2fdc0cfc MO |
212 | store information about the repository to maintain consistent |
213 | CVS revision numbers. The database needs to be | |
214 | updated (i.e. written to) after every commit. | |
0f76a543 | 215 | |
483bc4f0 | 216 | If the commit is done directly by using `git` (as opposed to |
ba020ef5 JN |
217 | using 'git-cvsserver') the update will need to happen on the |
218 | next repository access by 'git-cvsserver', independent of | |
0f76a543 FL |
219 | access method and requested operation. |
220 | ||
221 | That means that even if you offer only read access (e.g. by using | |
ba020ef5 | 222 | the pserver method), 'git-cvsserver' should have write access to |
febe7dcc | 223 | the database to work reliably (otherwise you need to make sure |
7560f547 | 224 | that the database is up to date any time 'git-cvsserver' is executed). |
febe7dcc | 225 | |
2de9b711 | 226 | By default it uses SQLite databases in the Git directory, named |
febe7dcc FL |
227 | `gitcvs.<module_name>.sqlite`. Note that the SQLite backend creates |
228 | temporary files in the same directory as the database file on | |
229 | write so it might not be enough to grant the users using | |
ba020ef5 | 230 | 'git-cvsserver' write access to the database file without granting |
0f76a543 | 231 | them write access to the directory, too. |
febe7dcc | 232 | |
6d169227 | 233 | The database cannot be reliably regenerated in a |
2fdc0cfc MO |
234 | consistent form after the branch it is tracking has changed. |
235 | Example: For merged branches, 'git-cvsserver' only tracks | |
0b444cdb | 236 | one branch of development, and after a 'git merge' an |
2fdc0cfc MO |
237 | incrementally updated database may track a different branch |
238 | than a database regenerated from scratch, causing inconsistent | |
239 | CVS revision numbers. `git-cvsserver` has no way of knowing which | |
240 | branch it would have picked if it had been run incrementally | |
241 | pre-merge. So if you have to fully or partially (from old | |
242 | backup) regenerate the database, you should be suspicious | |
243 | of pre-existing CVS sandboxes. | |
244 | ||
febe7dcc FL |
245 | You can configure the database backend with the following |
246 | configuration variables: | |
247 | ||
248 | Configuring database backend | |
249 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
250 | ||
ba020ef5 | 251 | 'git-cvsserver' uses the Perl DBI module. Please also read |
febe7dcc | 252 | its documentation if changing these variables, especially |
6cf378f0 | 253 | about `DBI->connect()`. |
febe7dcc | 254 | |
da0005b8 | 255 | gitcvs.dbName:: |
febe7dcc | 256 | Database name. The exact meaning depends on the |
a5d86f74 | 257 | selected database driver, for SQLite this is a filename. |
febe7dcc FL |
258 | Supports variable substitution (see below). May |
259 | not contain semicolons (`;`). | |
260 | Default: '%Ggitcvs.%m.sqlite' | |
261 | ||
da0005b8 | 262 | gitcvs.dbDriver:: |
febe7dcc FL |
263 | Used DBI driver. You can specify any available driver |
264 | for this here, but it might not work. cvsserver is tested | |
265 | with 'DBD::SQLite', reported to work with | |
266 | 'DBD::Pg', and reported *not* to work with 'DBD::mysql'. | |
267 | Please regard this as an experimental feature. May not | |
a5d86f74 | 268 | contain colons (`:`). |
febe7dcc FL |
269 | Default: 'SQLite' |
270 | ||
271 | gitcvs.dbuser:: | |
da0005b8 | 272 | Database user. Only useful if setting `dbDriver`, since |
febe7dcc FL |
273 | SQLite has no concept of database users. Supports variable |
274 | substitution (see below). | |
275 | ||
da0005b8 NTND |
276 | gitcvs.dbPass:: |
277 | Database password. Only useful if setting `dbDriver`, since | |
febe7dcc FL |
278 | SQLite has no concept of database passwords. |
279 | ||
6aeeffd1 JE |
280 | gitcvs.dbTableNamePrefix:: |
281 | Database table name prefix. Supports variable substitution | |
282 | (see below). Any non-alphabetic characters will be replaced | |
283 | with underscores. | |
284 | ||
febe7dcc FL |
285 | All variables can also be set per access method, see <<configaccessmethod,above>>. |
286 | ||
287 | Variable substitution | |
288 | ^^^^^^^^^^^^^^^^^^^^^ | |
da0005b8 | 289 | In `dbDriver` and `dbUser` you can use the following variables: |
febe7dcc FL |
290 | |
291 | %G:: | |
2de9b711 | 292 | Git directory name |
febe7dcc | 293 | %g:: |
2de9b711 | 294 | Git directory name, where all characters except for |
031fd4b9 | 295 | alphanumeric ones, `.`, and `-` are replaced with |
febe7dcc FL |
296 | `_` (this should make it easier to use the directory |
297 | name in a filename if wanted) | |
298 | %m:: | |
2de9b711 | 299 | CVS module/Git head name |
febe7dcc FL |
300 | %a:: |
301 | access method (one of "ext" or "pserver") | |
302 | %u:: | |
ba020ef5 | 303 | Name of the user running 'git-cvsserver'. |
febe7dcc FL |
304 | If no name can be determined, the |
305 | numeric uid is used. | |
306 | ||
03bd0d60 PM |
307 | ENVIRONMENT |
308 | ----------- | |
309 | ||
310 | These variables obviate the need for command-line options in some | |
311 | circumstances, allowing easier restricted usage through git-shell. | |
312 | ||
acc5e287 DS |
313 | GIT_CVSSERVER_BASE_PATH:: |
314 | This variable replaces the argument to --base-path. | |
03bd0d60 | 315 | |
acc5e287 DS |
316 | GIT_CVSSERVER_ROOT:: |
317 | This variable specifies a single directory, replacing the | |
318 | `<directory>...` argument list. The repository still requires the | |
319 | `gitcvs.enabled` config option, unless `--export-all` is specified. | |
03bd0d60 PM |
320 | |
321 | When these environment variables are set, the corresponding | |
322 | command-line arguments may not be used. | |
323 | ||
76a8788c | 324 | ECLIPSE CVS CLIENT NOTES |
ee75d4cd ML |
325 | ------------------------ |
326 | ||
327 | To get a checkout with the Eclipse CVS client: | |
328 | ||
b30cc0da ML |
329 | 1. Select "Create a new project -> From CVS checkout" |
330 | 2. Create a new location. See the notes below for details on how to choose the | |
331 | right protocol. | |
332 | 3. Browse the 'modules' available. It will give you a list of the heads in | |
333 | the repository. You will not be able to browse the tree from there. Only | |
334 | the heads. | |
661c3e9b | 335 | 4. Pick `HEAD` when it asks what branch/tag to check out. Untick the |
b30cc0da ML |
336 | "launch commit wizard" to avoid committing the .project file. |
337 | ||
abda1ef5 | 338 | Protocol notes: If you are using anonymous access via pserver, just select that. |
b30cc0da ML |
339 | Those using SSH access should choose the 'ext' protocol, and configure 'ext' |
340 | access on the Preferences->Team->CVS->ExtConnection pane. Set CVS_SERVER to | |
ca768288 | 341 | "`git cvsserver`". Note that password support is not good when using 'ext', |
b30cc0da ML |
342 | you will definitely want to have SSH keys setup. |
343 | ||
344 | Alternatively, you can just use the non-standard extssh protocol that Eclipse | |
345 | offer. In that case CVS_SERVER is ignored, and you will have to replace | |
ba020ef5 JN |
346 | the cvs utility on the server with 'git-cvsserver' or manipulate your `.bashrc` |
347 | so that calling 'cvs' effectively calls 'git-cvsserver'. | |
ee75d4cd | 348 | |
76a8788c | 349 | CLIENTS KNOWN TO WORK |
ee75d4cd ML |
350 | --------------------- |
351 | ||
ad0f8c9e FL |
352 | - CVS 1.12.9 on Debian |
353 | - CVS 1.11.17 on MacOSX (from Fink package) | |
354 | - Eclipse 3.0, 3.1.2 on MacOSX (see Eclipse CVS Client Notes) | |
355 | - TortoiseCVS | |
ee75d4cd | 356 | |
76a8788c | 357 | OPERATIONS SUPPORTED |
3fda8c4c ML |
358 | -------------------- |
359 | ||
360 | All the operations required for normal use are supported, including | |
361 | checkout, diff, status, update, log, add, remove, commit. | |
96bc8f66 MO |
362 | |
363 | Most CVS command arguments that read CVS tags or revision numbers | |
364 | (typically -r) work, and also support any git refspec | |
365 | (tag, branch, commit ID, etc). | |
366 | However, CVS revision numbers for non-default branches are not well | |
367 | emulated, and cvs log does not show tags or branches at | |
368 | all. (Non-main-branch CVS revision numbers superficially resemble CVS | |
369 | revision numbers, but they actually encode a git commit ID directly, | |
370 | rather than represent the number of revisions since the branch point.) | |
371 | ||
372 | Note that there are two ways to checkout a particular branch. | |
373 | As described elsewhere on this page, the "module" parameter | |
374 | of cvs checkout is interpreted as a branch name, and it becomes | |
375 | the main branch. It remains the main branch for a given sandbox | |
376 | even if you temporarily make another branch sticky with | |
377 | cvs update -r. Alternatively, the -r argument can indicate | |
378 | some other branch to actually checkout, even though the module | |
379 | is still the "main" branch. Tradeoffs (as currently | |
380 | implemented): Each new "module" creates a new database on disk with | |
381 | a history for the given module, and after the database is created, | |
382 | operations against that main branch are fast. Or alternatively, | |
383 | -r doesn't take any extra disk space, but may be significantly slower for | |
384 | many operations, like cvs update. | |
385 | ||
386 | If you want to refer to a git refspec that has characters that are | |
387 | not allowed by CVS, you have two options. First, it may just work | |
388 | to supply the git refspec directly to the appropriate CVS -r argument; | |
389 | some CVS clients don't seem to do much sanity checking of the argument. | |
390 | Second, if that fails, you can use a special character escape mechanism | |
391 | that only uses characters that are valid in CVS tags. A sequence | |
392 | of 4 or 5 characters of the form (underscore (`"_"`), dash (`"-"`), | |
393 | one or two characters, and dash (`"-"`)) can encode various characters based | |
394 | on the one or two letters: `"s"` for slash (`"/"`), `"p"` for | |
395 | period (`"."`), `"u"` for underscore (`"_"`), or two hexadecimal digits | |
396 | for any byte value at all (typically an ASCII number, or perhaps a part | |
397 | of a UTF-8 encoded character). | |
398 | ||
3fda8c4c ML |
399 | Legacy monitoring operations are not supported (edit, watch and related). |
400 | Exports and tagging (tags and branches) are not supported at this stage. | |
401 | ||
8a06a632 | 402 | CRLF Line Ending Conversions |
b592d88f | 403 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
8a06a632 | 404 | |
23f8239b | 405 | By default the server leaves the `-k` mode blank for all files, |
6b677a28 VS |
406 | which causes the CVS client to treat them as a text files, subject |
407 | to end-of-line conversion on some platforms. | |
8a06a632 | 408 | |
5ec3e670 | 409 | You can make the server use the end-of-line conversion attributes to |
23f8239b | 410 | set the `-k` modes for files by setting the `gitcvs.usecrlfattr` |
5ec3e670 EB |
411 | config variable. See linkgit:gitattributes[5] for more information |
412 | about end-of-line conversion. | |
8a06a632 MO |
413 | |
414 | Alternatively, if `gitcvs.usecrlfattr` config is not enabled | |
5ec3e670 | 415 | or the attributes do not allow automatic detection for a filename, then |
da0005b8 NTND |
416 | the server uses the `gitcvs.allBinary` config for the default setting. |
417 | If `gitcvs.allBinary` is set, then file not otherwise | |
23f8239b | 418 | specified will default to '-kb' mode. Otherwise the `-k` mode |
da0005b8 | 419 | is left blank. But if `gitcvs.allBinary` is set to "guess", then |
23f8239b | 420 | the correct `-k` mode will be guessed based on the contents of |
90948a42 MO |
421 | the file. |
422 | ||
2fd02c92 | 423 | For best consistency with 'cvs', it is probably best to override the |
90948a42 | 424 | defaults by setting `gitcvs.usecrlfattr` to true, |
da0005b8 | 425 | and `gitcvs.allBinary` to "guess". |
3fda8c4c | 426 | |
76a8788c | 427 | DEPENDENCIES |
3fda8c4c | 428 | ------------ |
ba020ef5 | 429 | 'git-cvsserver' depends on DBD::SQLite. |
3fda8c4c | 430 | |
3fda8c4c ML |
431 | GIT |
432 | --- | |
9e1f0a85 | 433 | Part of the linkgit:git[1] suite |