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