blob: a675dc4cac61d7c385a38d5e449f41b66d922599 [file] [log] [blame]
Junio C Hamanob9d9d902018-05-23 07:07:421<?xml version="1.0" encoding="UTF-8"?>
Junio C Hamano34b18112006-02-23 11:21:402<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
5<head>
Junio C Hamano9d971152012-12-19 00:43:116<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
Junio C Hamanoa85030a2022-07-27 16:48:217<meta name="generator" content="AsciiDoc 10.2.0" />
Junio C Hamano68cf15a2010-11-06 01:01:598<title>git-cvsserver(1)</title>
Junio C Hamano34b18112006-02-23 11:21:409<style type="text/css">
Junio C Hamano9d971152012-12-19 00:43:1110/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
11
12/* Default font. */
13body {
14 font-family: Georgia,serif;
15}
16
17/* Title font. */
18h1, h2, h3, h4, h5, h6,
19div.title, caption.title,
20thead, p.table.header,
21#toctitle,
22#author, #revnumber, #revdate, #revremark,
23#footer {
24 font-family: Arial,Helvetica,sans-serif;
Junio C Hamano34b18112006-02-23 11:21:4025}
26
27body {
28 margin: 1em 5% 1em 5%;
29}
30
Junio C Hamanoba4b9282008-07-06 05:20:3131a {
32 color: blue;
33 text-decoration: underline;
34}
35a:visited {
36 color: fuchsia;
37}
Junio C Hamano34b18112006-02-23 11:21:4038
39em {
40 font-style: italic;
Junio C Hamano68cf15a2010-11-06 01:01:5941 color: navy;
Junio C Hamano34b18112006-02-23 11:21:4042}
43
44strong {
45 font-weight: bold;
Junio C Hamano68cf15a2010-11-06 01:01:5946 color: #083194;
Junio C Hamano34b18112006-02-23 11:21:4047}
48
Junio C Hamano34b18112006-02-23 11:21:4049h1, h2, h3, h4, h5, h6 {
50 color: #527bbd;
Junio C Hamano34b18112006-02-23 11:21:4051 margin-top: 1.2em;
52 margin-bottom: 0.5em;
53 line-height: 1.3;
54}
55
Junio C Hamanoba4b9282008-07-06 05:20:3156h1, h2, h3 {
Junio C Hamano34b18112006-02-23 11:21:4057 border-bottom: 2px solid silver;
58}
59h2 {
Junio C Hamano34b18112006-02-23 11:21:4060 padding-top: 0.5em;
61}
Junio C Hamanoba4b9282008-07-06 05:20:3162h3 {
63 float: left;
64}
65h3 + * {
66 clear: left;
67}
Junio C Hamano9d971152012-12-19 00:43:1168h5 {
69 font-size: 1.0em;
70}
Junio C Hamano34b18112006-02-23 11:21:4071
72div.sectionbody {
Junio C Hamano34b18112006-02-23 11:21:4073 margin-left: 0;
74}
75
76hr {
77 border: 1px solid silver;
78}
79
80p {
81 margin-top: 0.5em;
82 margin-bottom: 0.5em;
83}
84
Junio C Hamano68cf15a2010-11-06 01:01:5985ul, ol, li > p {
86 margin-top: 0;
87}
Junio C Hamano9d971152012-12-19 00:43:1188ul > li { color: #aaa; }
89ul > li > * { color: black; }
Junio C Hamano68cf15a2010-11-06 01:01:5990
Junio C Hamanoc14e6ad2014-10-31 20:25:5391.monospaced, code, pre {
92 font-family: "Courier New", Courier, monospace;
93 font-size: inherit;
94 color: navy;
Junio C Hamano34b18112006-02-23 11:21:4095 padding: 0;
96 margin: 0;
97}
Junio C Hamanoc14e6ad2014-10-31 20:25:5398pre {
99 white-space: pre-wrap;
100}
Junio C Hamano34b18112006-02-23 11:21:40101
Junio C Hamano9d971152012-12-19 00:43:11102#author {
Junio C Hamano34b18112006-02-23 11:21:40103 color: #527bbd;
Junio C Hamano34b18112006-02-23 11:21:40104 font-weight: bold;
Junio C Hamanoba4b9282008-07-06 05:20:31105 font-size: 1.1em;
Junio C Hamano34b18112006-02-23 11:21:40106}
Junio C Hamano9d971152012-12-19 00:43:11107#email {
Junio C Hamano34b18112006-02-23 11:21:40108}
Junio C Hamano9d971152012-12-19 00:43:11109#revnumber, #revdate, #revremark {
Junio C Hamano34b18112006-02-23 11:21:40110}
111
Junio C Hamano9d971152012-12-19 00:43:11112#footer {
Junio C Hamano34b18112006-02-23 11:21:40113 font-size: small;
114 border-top: 2px solid silver;
115 padding-top: 0.5em;
116 margin-top: 4.0em;
117}
Junio C Hamano9d971152012-12-19 00:43:11118#footer-text {
Junio C Hamano34b18112006-02-23 11:21:40119 float: left;
120 padding-bottom: 0.5em;
121}
Junio C Hamano9d971152012-12-19 00:43:11122#footer-badges {
Junio C Hamano34b18112006-02-23 11:21:40123 float: right;
124 padding-bottom: 0.5em;
125}
126
Junio C Hamano9d971152012-12-19 00:43:11127#preamble {
Junio C Hamano68cf15a2010-11-06 01:01:59128 margin-top: 1.5em;
129 margin-bottom: 1.5em;
130}
Junio C Hamano9d971152012-12-19 00:43:11131div.imageblock, div.exampleblock, div.verseblock,
Junio C Hamano34b18112006-02-23 11:21:40132div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133div.admonitionblock {
Junio C Hamano7bd050f2011-09-22 06:32:22134 margin-top: 1.0em;
Junio C Hamano34b18112006-02-23 11:21:40135 margin-bottom: 1.5em;
136}
137div.admonitionblock {
Junio C Hamano7bd050f2011-09-22 06:32:22138 margin-top: 2.0em;
139 margin-bottom: 2.0em;
140 margin-right: 10%;
141 color: #606060;
Junio C Hamano34b18112006-02-23 11:21:40142}
143
144div.content { /* Block element content. */
145 padding: 0;
146}
147
148/* Block element titles. */
149div.title, caption.title {
Junio C Hamano68cf15a2010-11-06 01:01:59150 color: #527bbd;
Junio C Hamano34b18112006-02-23 11:21:40151 font-weight: bold;
152 text-align: left;
153 margin-top: 1.0em;
154 margin-bottom: 0.5em;
155}
156div.title + * {
157 margin-top: 0;
158}
159
160td div.title:first-child {
161 margin-top: 0.0em;
162}
163div.content div.title:first-child {
164 margin-top: 0.0em;
165}
166div.content + div.title {
167 margin-top: 0.0em;
168}
169
170div.sidebarblock > div.content {
171 background: #ffffee;
Junio C Hamano9d971152012-12-19 00:43:11172 border: 1px solid #dddddd;
173 border-left: 4px solid #f0f0f0;
Junio C Hamano34b18112006-02-23 11:21:40174 padding: 0.5em;
175}
176
177div.listingblock > div.content {
Junio C Hamano9d971152012-12-19 00:43:11178 border: 1px solid #dddddd;
179 border-left: 5px solid #f0f0f0;
180 background: #f8f8f8;
Junio C Hamano34b18112006-02-23 11:21:40181 padding: 0.5em;
182}
183
Junio C Hamano7bd050f2011-09-22 06:32:22184div.quoteblock, div.verseblock {
185 padding-left: 1.0em;
186 margin-left: 1.0em;
Junio C Hamano68cf15a2010-11-06 01:01:59187 margin-right: 10%;
Junio C Hamano9d971152012-12-19 00:43:11188 border-left: 5px solid #f0f0f0;
189 color: #888;
Junio C Hamano34b18112006-02-23 11:21:40190}
Junio C Hamano7bd050f2011-09-22 06:32:22191
Junio C Hamano68cf15a2010-11-06 01:01:59192div.quoteblock > div.attribution {
193 padding-top: 0.5em;
Junio C Hamano34b18112006-02-23 11:21:40194 text-align: right;
195}
Junio C Hamano68cf15a2010-11-06 01:01:59196
Junio C Hamano9d971152012-12-19 00:43:11197div.verseblock > pre.content {
198 font-family: inherit;
199 font-size: inherit;
Junio C Hamano68cf15a2010-11-06 01:01:59200}
201div.verseblock > div.attribution {
202 padding-top: 0.75em;
203 text-align: left;
204}
205/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
Junio C Hamanoba4b9282008-07-06 05:20:31206div.verseblock + div.attribution {
207 text-align: left;
208}
Junio C Hamano34b18112006-02-23 11:21:40209
210div.admonitionblock .icon {
211 vertical-align: top;
212 font-size: 1.1em;
213 font-weight: bold;
214 text-decoration: underline;
215 color: #527bbd;
216 padding-right: 0.5em;
217}
218div.admonitionblock td.content {
219 padding-left: 0.5em;
Junio C Hamano7bd050f2011-09-22 06:32:22220 border-left: 3px solid #dddddd;
Junio C Hamano34b18112006-02-23 11:21:40221}
222
223div.exampleblock > div.content {
Junio C Hamano7bd050f2011-09-22 06:32:22224 border-left: 3px solid #dddddd;
225 padding-left: 0.5em;
Junio C Hamano34b18112006-02-23 11:21:40226}
227
Junio C Hamano34b18112006-02-23 11:21:40228div.imageblock div.content { padding-left: 0; }
Junio C Hamanoc14e6ad2014-10-31 20:25:53229span.image img { border-style: none; vertical-align: text-bottom; }
Junio C Hamano68cf15a2010-11-06 01:01:59230a.image:visited { color: white; }
Junio C Hamano34b18112006-02-23 11:21:40231
232dl {
233 margin-top: 0.8em;
234 margin-bottom: 0.8em;
235}
236dt {
237 margin-top: 0.5em;
238 margin-bottom: 0;
Junio C Hamano68cf15a2010-11-06 01:01:59239 font-style: normal;
240 color: navy;
Junio C Hamano34b18112006-02-23 11:21:40241}
242dd > *:first-child {
Junio C Hamano68cf15a2010-11-06 01:01:59243 margin-top: 0.1em;
Junio C Hamano34b18112006-02-23 11:21:40244}
245
246ul, ol {
247 list-style-position: outside;
248}
Junio C Hamano68cf15a2010-11-06 01:01:59249ol.arabic {
250 list-style-type: decimal;
251}
252ol.loweralpha {
Junio C Hamano34b18112006-02-23 11:21:40253 list-style-type: lower-alpha;
254}
Junio C Hamano68cf15a2010-11-06 01:01:59255ol.upperalpha {
256 list-style-type: upper-alpha;
257}
258ol.lowerroman {
259 list-style-type: lower-roman;
260}
261ol.upperroman {
262 list-style-type: upper-roman;
263}
264
265div.compact ul, div.compact ol,
266div.compact p, div.compact p,
267div.compact div, div.compact div {
268 margin-top: 0.1em;
269 margin-bottom: 0.1em;
270}
Junio C Hamano34b18112006-02-23 11:21:40271
Junio C Hamano34b18112006-02-23 11:21:40272tfoot {
273 font-weight: bold;
274}
Junio C Hamano68cf15a2010-11-06 01:01:59275td > div.verse {
276 white-space: pre;
277}
Junio C Hamano68cf15a2010-11-06 01:01:59278
279div.hdlist {
Junio C Hamano34b18112006-02-23 11:21:40280 margin-top: 0.8em;
281 margin-bottom: 0.8em;
282}
Junio C Hamano68cf15a2010-11-06 01:01:59283div.hdlist tr {
284 padding-bottom: 15px;
Junio C Hamanoba4b9282008-07-06 05:20:31285}
Junio C Hamano68cf15a2010-11-06 01:01:59286dt.hdlist1.strong, td.hdlist1.strong {
287 font-weight: bold;
288}
289td.hdlist1 {
Junio C Hamano34b18112006-02-23 11:21:40290 vertical-align: top;
Junio C Hamano68cf15a2010-11-06 01:01:59291 font-style: normal;
Junio C Hamano34b18112006-02-23 11:21:40292 padding-right: 0.8em;
Junio C Hamano68cf15a2010-11-06 01:01:59293 color: navy;
Junio C Hamano34b18112006-02-23 11:21:40294}
Junio C Hamano68cf15a2010-11-06 01:01:59295td.hdlist2 {
Junio C Hamano34b18112006-02-23 11:21:40296 vertical-align: top;
297}
Junio C Hamano68cf15a2010-11-06 01:01:59298div.hdlist.compact tr {
299 margin: 0;
300 padding-bottom: 0;
301}
302
303.comment {
304 background: yellow;
305}
Junio C Hamano34b18112006-02-23 11:21:40306
Junio C Hamano7bd050f2011-09-22 06:32:22307.footnote, .footnoteref {
308 font-size: 0.8em;
309}
310
311span.footnote, span.footnoteref {
312 vertical-align: super;
313}
314
315#footnotes {
316 margin: 20px 0 20px 0;
317 padding: 7px 0 0 0;
318}
319
320#footnotes div.footnote {
321 margin: 0 0 5px 0;
322}
323
324#footnotes hr {
325 border: none;
326 border-top: 1px solid silver;
327 height: 1px;
328 text-align: left;
329 margin-left: 0;
330 width: 20%;
331 min-width: 100px;
332}
333
Junio C Hamano9d971152012-12-19 00:43:11334div.colist td {
335 padding-right: 0.5em;
336 padding-bottom: 0.3em;
337 vertical-align: top;
338}
339div.colist td img {
340 margin-top: 0.3em;
Junio C Hamano34b18112006-02-23 11:21:40341}
Junio C Hamanoba4b9282008-07-06 05:20:31342
Junio C Hamano9d971152012-12-19 00:43:11343@media print {
344 #footer-badges { display: none; }
345}
346
347#toc {
Junio C Hamano7bd050f2011-09-22 06:32:22348 margin-bottom: 2.5em;
349}
350
Junio C Hamano9d971152012-12-19 00:43:11351#toctitle {
Junio C Hamanoba4b9282008-07-06 05:20:31352 color: #527bbd;
Junio C Hamanoba4b9282008-07-06 05:20:31353 font-size: 1.1em;
354 font-weight: bold;
355 margin-top: 1.0em;
356 margin-bottom: 0.1em;
357}
358
Junio C Hamanoc14e6ad2014-10-31 20:25:53359div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
Junio C Hamanoba4b9282008-07-06 05:20:31360 margin-top: 0;
361 margin-bottom: 0;
362}
363div.toclevel2 {
364 margin-left: 2em;
365 font-size: 0.9em;
366}
367div.toclevel3 {
368 margin-left: 4em;
369 font-size: 0.9em;
370}
371div.toclevel4 {
372 margin-left: 6em;
373 font-size: 0.9em;
374}
Junio C Hamano9d971152012-12-19 00:43:11375
376span.aqua { color: aqua; }
377span.black { color: black; }
378span.blue { color: blue; }
379span.fuchsia { color: fuchsia; }
380span.gray { color: gray; }
381span.green { color: green; }
382span.lime { color: lime; }
383span.maroon { color: maroon; }
384span.navy { color: navy; }
385span.olive { color: olive; }
386span.purple { color: purple; }
387span.red { color: red; }
388span.silver { color: silver; }
389span.teal { color: teal; }
390span.white { color: white; }
391span.yellow { color: yellow; }
392
393span.aqua-background { background: aqua; }
394span.black-background { background: black; }
395span.blue-background { background: blue; }
396span.fuchsia-background { background: fuchsia; }
397span.gray-background { background: gray; }
398span.green-background { background: green; }
399span.lime-background { background: lime; }
400span.maroon-background { background: maroon; }
401span.navy-background { background: navy; }
402span.olive-background { background: olive; }
403span.purple-background { background: purple; }
404span.red-background { background: red; }
405span.silver-background { background: silver; }
406span.teal-background { background: teal; }
407span.white-background { background: white; }
408span.yellow-background { background: yellow; }
409
410span.big { font-size: 2em; }
411span.small { font-size: 0.6em; }
412
413span.underline { text-decoration: underline; }
414span.overline { text-decoration: overline; }
415span.line-through { text-decoration: line-through; }
416
Junio C Hamanoc14e6ad2014-10-31 20:25:53417div.unbreakable { page-break-inside: avoid; }
418
Junio C Hamano9d971152012-12-19 00:43:11419
420/*
421 * xhtml11 specific
422 *
423 * */
424
425div.tableblock {
426 margin-top: 1.0em;
427 margin-bottom: 1.5em;
428}
429div.tableblock > table {
430 border: 3px solid #527bbd;
431}
432thead, p.table.header {
433 font-weight: bold;
434 color: #527bbd;
435}
436p.table {
437 margin-top: 0;
438}
Junio C Hamano725b0da2020-01-22 22:02:40439/* Because the table frame attribute is overridden by CSS in most browsers. */
Junio C Hamano9d971152012-12-19 00:43:11440div.tableblock > table[frame="void"] {
441 border-style: none;
442}
443div.tableblock > table[frame="hsides"] {
444 border-left-style: none;
445 border-right-style: none;
446}
447div.tableblock > table[frame="vsides"] {
448 border-top-style: none;
449 border-bottom-style: none;
450}
451
452
453/*
454 * html5 specific
455 *
456 * */
457
458table.tableblock {
459 margin-top: 1.0em;
460 margin-bottom: 1.5em;
461}
462thead, p.tableblock.header {
463 font-weight: bold;
464 color: #527bbd;
465}
466p.tableblock {
467 margin-top: 0;
468}
469table.tableblock {
470 border-width: 3px;
471 border-spacing: 0px;
472 border-style: solid;
473 border-color: #527bbd;
474 border-collapse: collapse;
475}
476th.tableblock, td.tableblock {
477 border-width: 1px;
478 padding: 4px;
479 border-style: solid;
480 border-color: #527bbd;
481}
482
483table.tableblock.frame-topbot {
484 border-left-style: hidden;
485 border-right-style: hidden;
486}
487table.tableblock.frame-sides {
488 border-top-style: hidden;
489 border-bottom-style: hidden;
490}
491table.tableblock.frame-none {
492 border-style: hidden;
493}
494
495th.tableblock.halign-left, td.tableblock.halign-left {
496 text-align: left;
497}
498th.tableblock.halign-center, td.tableblock.halign-center {
499 text-align: center;
500}
501th.tableblock.halign-right, td.tableblock.halign-right {
502 text-align: right;
503}
504
505th.tableblock.valign-top, td.tableblock.valign-top {
506 vertical-align: top;
507}
508th.tableblock.valign-middle, td.tableblock.valign-middle {
509 vertical-align: middle;
510}
511th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512 vertical-align: bottom;
513}
514
515
516/*
517 * manpage specific
518 *
519 * */
520
521body.manpage h1 {
Junio C Hamano68cf15a2010-11-06 01:01:59522 padding-top: 0.5em;
523 padding-bottom: 0.5em;
524 border-top: 2px solid silver;
525 border-bottom: 2px solid silver;
526}
Junio C Hamano9d971152012-12-19 00:43:11527body.manpage h2 {
Junio C Hamano68cf15a2010-11-06 01:01:59528 border-style: none;
529}
Junio C Hamano9d971152012-12-19 00:43:11530body.manpage div.sectionbody {
531 margin-left: 3em;
Junio C Hamano68cf15a2010-11-06 01:01:59532}
533
534@media print {
Junio C Hamano9d971152012-12-19 00:43:11535 body.manpage div#toc { display: none; }
Junio C Hamano68cf15a2010-11-06 01:01:59536}
Junio C Hamanoc14e6ad2014-10-31 20:25:53537
538
Junio C Hamano34b18112006-02-23 11:21:40539</style>
Junio C Hamano7bd050f2011-09-22 06:32:22540<script type="text/javascript">
541/*<![CDATA[*/
Junio C Hamano2b153182021-12-15 21:00:31542var asciidoc = { // Namespace.
543
544/////////////////////////////////////////////////////////////////////
545// Table Of Contents generator
546/////////////////////////////////////////////////////////////////////
547
548/* Author: Mihai Bazon, September 2002
549 * http://students.infoiasi.ro/~mishoo
550 *
551 * Table Of Content generator
552 * Version: 0.4
553 *
554 * Feel free to use this script under the terms of the GNU General Public
555 * License, as long as you do not remove or alter this notice.
556 */
557
558 /* modified by Troy D. Hanson, September 2006. License: GPL */
559 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
560
561// toclevels = 1..4.
562toc: function (toclevels) {
563
564 function getText(el) {
565 var text = "";
566 for (var i = el.firstChild; i != null; i = i.nextSibling) {
567 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
568 text += i.data;
569 else if (i.firstChild != null)
570 text += getText(i);
571 }
572 return text;
573 }
574
575 function TocEntry(el, text, toclevel) {
576 this.element = el;
577 this.text = text;
578 this.toclevel = toclevel;
579 }
580
581 function tocEntries(el, toclevels) {
582 var result = new Array;
583 var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
584 // Function that scans the DOM tree for header elements (the DOM2
585 // nodeIterator API would be a better technique but not supported by all
586 // browsers).
587 var iterate = function (el) {
588 for (var i = el.firstChild; i != null; i = i.nextSibling) {
589 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
590 var mo = re.exec(i.tagName);
591 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
592 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
593 }
594 iterate(i);
595 }
596 }
597 }
598 iterate(el);
599 return result;
600 }
601
602 var toc = document.getElementById("toc");
603 if (!toc) {
604 return;
605 }
606
607 // Delete existing TOC entries in case we're reloading the TOC.
608 var tocEntriesToRemove = [];
609 var i;
610 for (i = 0; i < toc.childNodes.length; i++) {
611 var entry = toc.childNodes[i];
612 if (entry.nodeName.toLowerCase() == 'div'
613 && entry.getAttribute("class")
614 && entry.getAttribute("class").match(/^toclevel/))
615 tocEntriesToRemove.push(entry);
616 }
617 for (i = 0; i < tocEntriesToRemove.length; i++) {
618 toc.removeChild(tocEntriesToRemove[i]);
619 }
620
621 // Rebuild TOC entries.
622 var entries = tocEntries(document.getElementById("content"), toclevels);
623 for (var i = 0; i < entries.length; ++i) {
624 var entry = entries[i];
625 if (entry.element.id == "")
626 entry.element.id = "_toc_" + i;
627 var a = document.createElement("a");
628 a.href = "#" + entry.element.id;
629 a.appendChild(document.createTextNode(entry.text));
630 var div = document.createElement("div");
631 div.appendChild(a);
632 div.className = "toclevel" + entry.toclevel;
633 toc.appendChild(div);
634 }
635 if (entries.length == 0)
636 toc.parentNode.removeChild(toc);
637},
638
639
640/////////////////////////////////////////////////////////////////////
641// Footnotes generator
642/////////////////////////////////////////////////////////////////////
643
644/* Based on footnote generation code from:
645 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
646 */
647
648footnotes: function () {
649 // Delete existing footnote entries in case we're reloading the footnodes.
650 var i;
651 var noteholder = document.getElementById("footnotes");
652 if (!noteholder) {
653 return;
654 }
655 var entriesToRemove = [];
656 for (i = 0; i < noteholder.childNodes.length; i++) {
657 var entry = noteholder.childNodes[i];
658 if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
659 entriesToRemove.push(entry);
660 }
661 for (i = 0; i < entriesToRemove.length; i++) {
662 noteholder.removeChild(entriesToRemove[i]);
663 }
664
665 // Rebuild footnote entries.
666 var cont = document.getElementById("content");
667 var spans = cont.getElementsByTagName("span");
668 var refs = {};
669 var n = 0;
670 for (i=0; i<spans.length; i++) {
671 if (spans[i].className == "footnote") {
672 n++;
673 var note = spans[i].getAttribute("data-note");
674 if (!note) {
675 // Use [\s\S] in place of . so multi-line matches work.
676 // Because JavaScript has no s (dotall) regex flag.
677 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
678 spans[i].innerHTML =
679 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
680 "' title='View footnote' class='footnote'>" + n + "</a>]";
681 spans[i].setAttribute("data-note", note);
682 }
683 noteholder.innerHTML +=
684 "<div class='footnote' id='_footnote_" + n + "'>" +
685 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
686 n + "</a>. " + note + "</div>";
687 var id =spans[i].getAttribute("id");
688 if (id != null) refs["#"+id] = n;
689 }
690 }
691 if (n == 0)
692 noteholder.parentNode.removeChild(noteholder);
693 else {
694 // Process footnoterefs.
695 for (i=0; i<spans.length; i++) {
696 if (spans[i].className == "footnoteref") {
697 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
698 href = href.match(/#.*/)[0]; // Because IE return full URL.
699 n = refs[href];
700 spans[i].innerHTML =
701 "[<a href='#_footnote_" + n +
702 "' title='View footnote' class='footnote'>" + n + "</a>]";
703 }
704 }
705 }
706},
707
708install: function(toclevels) {
709 var timerId;
710
711 function reinstall() {
712 asciidoc.footnotes();
713 if (toclevels) {
714 asciidoc.toc(toclevels);
715 }
716 }
717
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
720 reinstall();
721 }
722
723 timerId = setInterval(reinstall, 500);
724 if (document.addEventListener)
725 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
726 else
727 window.onload = reinstallAndRemoveTimer;
728}
729
730}
Junio C Hamano9d971152012-12-19 00:43:11731asciidoc.install();
Junio C Hamano7bd050f2011-09-22 06:32:22732/*]]>*/
733</script>
Junio C Hamano34b18112006-02-23 11:21:40734</head>
Junio C Hamano9d971152012-12-19 00:43:11735<body class="manpage">
Junio C Hamano34b18112006-02-23 11:21:40736<div id="header">
737<h1>
738git-cvsserver(1) Manual Page
739</h1>
740<h2>NAME</h2>
741<div class="sectionbody">
742<p>git-cvsserver -
Junio C Hamano076ffcc2013-02-06 05:13:21743 A CVS server emulator for Git
Junio C Hamano34b18112006-02-23 11:21:40744</p>
745</div>
746</div>
Junio C Hamano7bd050f2011-09-22 06:32:22747<div id="content">
Junio C Hamano9d971152012-12-19 00:43:11748<div class="sect1">
Junio C Hamano68cf15a2010-11-06 01:01:59749<h2 id="_synopsis">SYNOPSIS</h2>
Junio C Hamano34b18112006-02-23 11:21:40750<div class="sectionbody">
Junio C Hamano68cf15a2010-11-06 01:01:59751<div class="paragraph"><p>SSH:</p></div>
Junio C Hamano34b18112006-02-23 11:21:40752<div class="verseblock">
Junio C Hamano9d971152012-12-19 00:43:11753<pre class="content">export CVS_SERVER="git cvsserver"
754<em>cvs</em> -d :ext:user@server/path/repo.git co &lt;HEAD_name&gt;</pre>
755<div class="attribution">
Junio C Hamano68cf15a2010-11-06 01:01:59756</div></div>
757<div class="paragraph"><p>pserver (/etc/inetd.conf):</p></div>
Junio C Hamano6926bef2007-06-16 09:54:05758<div class="verseblock">
Junio C Hamano9d971152012-12-19 00:43:11759<pre class="content">cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver</pre>
760<div class="attribution">
Junio C Hamano68cf15a2010-11-06 01:01:59761</div></div>
762<div class="paragraph"><p>Usage:</p></div>
Junio C Hamano6926bef2007-06-16 09:54:05763<div class="verseblock">
Junio C Hamanoc9cb5172018-06-01 07:13:44764<pre class="content"><em>git-cvsserver</em> [&lt;options&gt;] [pserver|server] [&lt;directory&gt; &#8230;]</pre>
Junio C Hamano9d971152012-12-19 00:43:11765<div class="attribution">
Junio C Hamano68cf15a2010-11-06 01:01:59766</div></div>
Junio C Hamano6926bef2007-06-16 09:54:05767</div>
Junio C Hamano9d971152012-12-19 00:43:11768</div>
769<div class="sect1">
Junio C Hamanobe601db2021-05-07 04:20:28770<h2 id="_description">DESCRIPTION</h2>
771<div class="sectionbody">
772<div class="paragraph"><p>This application is a CVS emulation layer for Git.</p></div>
773<div class="paragraph"><p>It is highly functional. However, not all methods are implemented,
774and for those methods that are implemented,
775not all switches are implemented.</p></div>
776<div class="paragraph"><p>Testing has been done using both the CLI CVS client, and the Eclipse CVS
777plugin. Most functionality works fine with both of these clients.</p></div>
778</div>
779</div>
780<div class="sect1">
Junio C Hamanoba4b9282008-07-06 05:20:31781<h2 id="_options">OPTIONS</h2>
Junio C Hamano6926bef2007-06-16 09:54:05782<div class="sectionbody">
Junio C Hamano68cf15a2010-11-06 01:01:59783<div class="paragraph"><p>All these options obviously only make sense if enforced by the server side.
Junio C Hamanoa28a9202012-06-21 07:08:23784They have been implemented to resemble the <a href="git-daemon.html">git-daemon(1)</a> options as
Junio C Hamanoba4b9282008-07-06 05:20:31785closely as possible.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:59786<div class="dlist"><dl>
787<dt class="hdlist1">
Junio C Hamano6926bef2007-06-16 09:54:05788--base-path &lt;path&gt;
789</dt>
790<dd>
791<p>
792Prepend <em>path</em> to requested CVSROOT
793</p>
794</dd>
Junio C Hamano68cf15a2010-11-06 01:01:59795<dt class="hdlist1">
Junio C Hamano6926bef2007-06-16 09:54:05796--strict-paths
797</dt>
798<dd>
799<p>
Junio C Hamano68cf15a2010-11-06 01:01:59800Don&#8217;t allow recursing into subdirectories
Junio C Hamano6926bef2007-06-16 09:54:05801</p>
802</dd>
Junio C Hamano68cf15a2010-11-06 01:01:59803<dt class="hdlist1">
Junio C Hamano6926bef2007-06-16 09:54:05804--export-all
805</dt>
806<dd>
807<p>
Junio C Hamanoc14e6ad2014-10-31 20:25:53808Don&#8217;t check for <code>gitcvs.enabled</code> in config. You also have to specify a list
Junio C Hamano6926bef2007-06-16 09:54:05809of allowed directories (see below) if you want to use this option.
810</p>
811</dd>
Junio C Hamano68cf15a2010-11-06 01:01:59812<dt class="hdlist1">
Junio C Hamanoeb415992008-06-08 22:49:47813-V
814</dt>
Junio C Hamano68cf15a2010-11-06 01:01:59815<dt class="hdlist1">
Junio C Hamanoeb415992008-06-08 22:49:47816--version
Junio C Hamano6926bef2007-06-16 09:54:05817</dt>
818<dd>
819<p>
820Print version information and exit
821</p>
822</dd>
Junio C Hamano68cf15a2010-11-06 01:01:59823<dt class="hdlist1">
Junio C Hamanoeb415992008-06-08 22:49:47824-h
825</dt>
Junio C Hamano68cf15a2010-11-06 01:01:59826<dt class="hdlist1">
Junio C Hamanoeb415992008-06-08 22:49:47827-H
828</dt>
Junio C Hamano68cf15a2010-11-06 01:01:59829<dt class="hdlist1">
Junio C Hamanoeb415992008-06-08 22:49:47830--help
Junio C Hamano6926bef2007-06-16 09:54:05831</dt>
832<dd>
833<p>
834Print usage information and exit
835</p>
836</dd>
Junio C Hamano68cf15a2010-11-06 01:01:59837<dt class="hdlist1">
Junio C Hamano6926bef2007-06-16 09:54:05838&lt;directory&gt;
839</dt>
840<dd>
841<p>
Junio C Hamanoa85030a2022-07-27 16:48:21842The remaining arguments provide a list of directories. If no directories
843are given, then all are allowed. Repositories within these directories
844still require the <code>gitcvs.enabled</code> config option, unless <code>--export-all</code>
845is specified.
Junio C Hamano6926bef2007-06-16 09:54:05846</p>
847</dd>
Junio C Hamanoba4b9282008-07-06 05:20:31848</dl></div>
Junio C Hamano34b18112006-02-23 11:21:40849</div>
Junio C Hamano9d971152012-12-19 00:43:11850</div>
851<div class="sect1">
Junio C Hamanoba4b9282008-07-06 05:20:31852<h2 id="_limitations">LIMITATIONS</h2>
Junio C Hamano34b18112006-02-23 11:21:40853<div class="sectionbody">
Junio C Hamano076ffcc2013-02-06 05:13:21854<div class="paragraph"><p>CVS clients cannot tag, branch or perform Git merges.</p></div>
855<div class="paragraph"><p><em>git-cvsserver</em> maps Git branches to CVS modules. This is very different
Junio C Hamanoa2ad99e2007-04-18 09:57:04856from what most CVS users would expect since in CVS modules usually represent
Junio C Hamanoba4b9282008-07-06 05:20:31857one or more directories.</p></div>
Junio C Hamano34b18112006-02-23 11:21:40858</div>
Junio C Hamano9d971152012-12-19 00:43:11859</div>
860<div class="sect1">
Junio C Hamanoba4b9282008-07-06 05:20:31861<h2 id="_installation">INSTALLATION</h2>
Junio C Hamano34b18112006-02-23 11:21:40862<div class="sectionbody">
Junio C Hamano68cf15a2010-11-06 01:01:59863<div class="olist arabic"><ol class="arabic">
Junio C Hamano34b18112006-02-23 11:21:40864<li>
865<p>
Junio C Hamanoa574a092010-06-13 19:57:10866If you are going to offer CVS access via pserver, add a line in
Junio C Hamanodecf50e2006-03-05 10:51:14867 /etc/inetd.conf like
Junio C Hamano34b18112006-02-23 11:21:40868</p>
Junio C Hamano9d971152012-12-19 00:43:11869<div class="openblock">
870<div class="content">
Junio C Hamanof1d14802006-06-08 00:48:17871<div class="listingblock">
Junio C Hamanodecf50e2006-03-05 10:51:14872<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53873<pre><code> cvspserver stream tcp nowait nobody git-cvsserver pserver</code></pre>
Junio C Hamanodecf50e2006-03-05 10:51:14874</div></div>
Junio C Hamano68cf15a2010-11-06 01:01:59875<div class="paragraph"><p>Note: Some inetd servers let you specify the name of the executable
Junio C Hamano591dc6a2007-05-29 09:18:19876independently of the value of argv[0] (i.e. the name the program assumes
877it was executed with). In this case the correct line in /etc/inetd.conf
Junio C Hamanoba4b9282008-07-06 05:20:31878looks like</p></div>
Junio C Hamanof1d14802006-06-08 00:48:17879<div class="listingblock">
Junio C Hamanodecf50e2006-03-05 10:51:14880<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53881<pre><code> cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver</code></pre>
Junio C Hamanodecf50e2006-03-05 10:51:14882</div></div>
Junio C Hamano6a7e2632021-10-04 19:53:05883<div class="paragraph"><p>Only anonymous access is provided by pserver by default. To commit you
Junio C Hamanoa574a092010-06-13 19:57:10884will have to create pserver accounts, simply add a gitcvs.authdb
885setting in the config file of the repositories you want the cvsserver
886to allow writes to, for example:</p></div>
887<div class="listingblock">
888<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53889<pre><code> [gitcvs]
890 authdb = /etc/cvsserver/passwd</code></pre>
Junio C Hamanoa574a092010-06-13 19:57:10891</div></div>
Junio C Hamanofb5ffde2014-11-04 22:38:56892<div class="paragraph"><p>The format of these files is username followed by the encrypted password,
Junio C Hamanoa574a092010-06-13 19:57:10893for example:</p></div>
894<div class="listingblock">
895<div class="content">
Junio C Hamano6a7e2632021-10-04 19:53:05896<pre><code> myuser:sqkNi8zPf01HI
897 myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/
898 myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3</code></pre>
Junio C Hamanoa574a092010-06-13 19:57:10899</div></div>
Junio C Hamano68cf15a2010-11-06 01:01:59900<div class="paragraph"><p>You can use the <em>htpasswd</em> facility that comes with Apache to make these
Junio C Hamano9469c132023-06-23 20:26:29901files, but only with the -d option (or -B if your system supports it).</p></div>
Junio C Hamano6a7e2632021-10-04 19:53:05902<div class="paragraph"><p>Preferably use the system specific utility that manages password hash
903creation in your platform (e.g. mkpasswd in Linux, encrypt in OpenBSD or
904pwhash in NetBSD) and paste it in the right location.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:59905<div class="paragraph"><p>Then provide your password via the pserver method, for example:</p></div>
Junio C Hamanoa574a092010-06-13 19:57:10906<div class="listingblock">
907<div class="content">
Junio C Hamano6a7e2632021-10-04 19:53:05908<pre><code> cvs -d:pserver:someuser:somepassword@server:/path/repo.git co &lt;HEAD_name&gt;</code></pre>
Junio C Hamanoa574a092010-06-13 19:57:10909</div></div>
Junio C Hamano076ffcc2013-02-06 05:13:21910<div class="paragraph"><p>No special setup is needed for SSH access, other than having Git tools
Junio C Hamanodecf50e2006-03-05 10:51:14911in the PATH. If you have clients that do not accept the CVS_SERVER
Junio C Hamanoc14e6ad2014-10-31 20:25:53912environment variable, you can rename <em>git-cvsserver</em> to <code>cvs</code>.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:59913<div class="paragraph"><p>Note: Newer CVS versions (&gt;= 1.12.11) also support specifying
Junio C Hamanoba4b9282008-07-06 05:20:31914CVS_SERVER directly in CVSROOT like</p></div>
Junio C Hamano591dc6a2007-05-29 09:18:19915<div class="listingblock">
916<div class="content">
Junio C Hamano6a7e2632021-10-04 19:53:05917<pre><code> cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co &lt;HEAD_name&gt;</code></pre>
Junio C Hamano591dc6a2007-05-29 09:18:19918</div></div>
Junio C Hamano68cf15a2010-11-06 01:01:59919<div class="paragraph"><p>This has the advantage that it will be saved in your <em>CVS/Root</em> files and
920you don&#8217;t need to worry about always setting the correct environment
921variable. SSH users restricted to <em>git-shell</em> don&#8217;t need to override the default
Junio C Hamanoc14e6ad2014-10-31 20:25:53922with CVS_SERVER (and shouldn&#8217;t) as <em>git-shell</em> understands <code>cvs</code> to mean
Junio C Hamanoba4b9282008-07-06 05:20:31923<em>git-cvsserver</em> and pretends that the other end runs the real <em>cvs</em> better.</p></div>
Junio C Hamano9d971152012-12-19 00:43:11924</div></div>
Junio C Hamano34b18112006-02-23 11:21:40925</li>
926<li>
927<p>
928For each repo that you want accessible from CVS you need to edit config in
929 the repo and add the following section.
930</p>
Junio C Hamano9d971152012-12-19 00:43:11931<div class="openblock">
932<div class="content">
Junio C Hamanof1d14802006-06-08 00:48:17933<div class="listingblock">
Junio C Hamano34b18112006-02-23 11:21:40934<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53935<pre><code> [gitcvs]
Junio C Hamanof1d14802006-06-08 00:48:17936 enabled=1
937 # optional for debugging
Junio C Hamano322c6242015-03-23 21:32:46938 logFile=/path/to/logfile</code></pre>
Junio C Hamano34b18112006-02-23 11:21:40939</div></div>
Junio C Hamano68cf15a2010-11-06 01:01:59940<div class="paragraph"><p>Note: you need to ensure each user that is going to invoke <em>git-cvsserver</em> has
Junio C Hamanoa2ad99e2007-04-18 09:57:04941write access to the log file and to the database (see
942<a href="#dbbackend">Database Backend</a>. If you want to offer write access over
Junio C Hamano076ffcc2013-02-06 05:13:21943SSH, the users of course also need write access to the Git repository itself.</p></div>
944<div class="paragraph"><p>You also need to ensure that each repository is "bare" (without a Git index
Junio C Hamanoc14e6ad2014-10-31 20:25:53945file) for <code>cvs commit</code> to work. See <a href="gitcvs-migration.html">gitcvs-migration(7)</a>.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:59946<div class="paragraph" id="configaccessmethod"><p>All configuration variables can also be overridden for a specific method of
Junio C Hamanoa2ad99e2007-04-18 09:57:04947access. Valid method names are "ext" (for SSH access) and "pserver". The
948following example configuration would disable pserver access while still
Junio C Hamanoba4b9282008-07-06 05:20:31949allowing access over SSH.</p></div>
Junio C Hamanoa2ad99e2007-04-18 09:57:04950<div class="listingblock">
951<div class="content">
Junio C Hamanoc14e6ad2014-10-31 20:25:53952<pre><code> [gitcvs]
Junio C Hamanoa2ad99e2007-04-18 09:57:04953 enabled=0
954
955 [gitcvs "ext"]
Junio C Hamanoc14e6ad2014-10-31 20:25:53956 enabled=1</code></pre>
Junio C Hamano9d971152012-12-19 00:43:11957</div></div>
Junio C Hamanoa2ad99e2007-04-18 09:57:04958</div></div>
Junio C Hamano34b18112006-02-23 11:21:40959</li>
960<li>
961<p>
Junio C Hamano68cf15a2010-11-06 01:01:59962If you didn&#8217;t specify the CVSROOT/CVS_SERVER directly in the checkout command,
Junio C Hamano33f98432008-04-16 09:10:05963 automatically saving it in your <em>CVS/Root</em> files, then you need to set them
964 explicitly in your environment. CVSROOT should be set as per normal, but the
Junio C Hamano076ffcc2013-02-06 05:13:21965 directory should point at the appropriate Git repo. As above, for SSH clients
Junio C Hamano68cf15a2010-11-06 01:01:59966 <em>not</em> restricted to <em>git-shell</em>, CVS_SERVER should be set to <em>git-cvsserver</em>.
Junio C Hamanodecf50e2006-03-05 10:51:14967</p>
Junio C Hamano9d971152012-12-19 00:43:11968<div class="openblock">
969<div class="content">
Junio C Hamanof1d14802006-06-08 00:48:17970<div class="listingblock">
Junio C Hamanodecf50e2006-03-05 10:51:14971<div class="content">
Junio C Hamano6a7e2632021-10-04 19:53:05972<pre><code> export CVSROOT=:ext:user@server:/var/git/project.git
973 export CVS_SERVER="git cvsserver"</code></pre>
Junio C Hamano9d971152012-12-19 00:43:11974</div></div>
Junio C Hamanodecf50e2006-03-05 10:51:14975</div></div>
976</li>
977<li>
978<p>
Junio C Hamano33f98432008-04-16 09:10:05979For SSH clients that will make commits, make sure their server-side
980 .ssh/environment files (or .bashrc, etc., according to their specific shell)
981 export appropriate values for GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL,
982 GIT_COMMITTER_NAME, and GIT_COMMITTER_EMAIL. For SSH clients whose login
983 shell is bash, .bashrc may be a reasonable alternative.
Junio C Hamano34b18112006-02-23 11:21:40984</p>
985</li>
986<li>
987<p>
Junio C Hamanodecf50e2006-03-05 10:51:14988Clients should now be able to check out the project. Use the CVS <em>module</em>
Junio C Hamano076ffcc2013-02-06 05:13:21989 name to indicate what Git <em>head</em> you want to check out. This also sets the
Junio C Hamano33f98432008-04-16 09:10:05990 name of your newly checked-out directory, unless you tell it otherwise with
Junio C Hamanoc14e6ad2014-10-31 20:25:53991 <code>-d &lt;dir_name&gt;</code>. For example, this checks out <em>master</em> branch to the
992 <code>project-master</code> directory:
Junio C Hamano34b18112006-02-23 11:21:40993</p>
Junio C Hamanof1d14802006-06-08 00:48:17994<div class="listingblock">
Junio C Hamanodecf50e2006-03-05 10:51:14995<div class="content">
Junio C Hamano6a7e2632021-10-04 19:53:05996<pre><code> cvs co -d project-master master</code></pre>
Junio C Hamanodecf50e2006-03-05 10:51:14997</div></div>
Junio C Hamano34b18112006-02-23 11:21:40998</li>
Junio C Hamanoba4b9282008-07-06 05:20:31999</ol></div>
Junio C Hamano34b18112006-02-23 11:21:401000</div>
Junio C Hamano9d971152012-12-19 00:43:111001</div>
1002<div class="sect1">
Junio C Hamanob9d9d902018-05-23 07:07:421003<h2 id="dbbackend">DATABASE BACKEND</h2>
Junio C Hamanoa2ad99e2007-04-18 09:57:041004<div class="sectionbody">
Junio C Hamano076ffcc2013-02-06 05:13:211005<div class="paragraph"><p><em>git-cvsserver</em> uses one database per Git head (i.e. CVS module) to
Junio C Hamano9df0c662009-11-23 11:09:271006store information about the repository to maintain consistent
1007CVS revision numbers. The database needs to be
1008updated (i.e. written to) after every commit.</p></div>
Junio C Hamanoc14e6ad2014-10-31 20:25:531009<div class="paragraph"><p>If the commit is done directly by using <code>git</code> (as opposed to
Junio C Hamanoba4b9282008-07-06 05:20:311010using <em>git-cvsserver</em>) the update will need to happen on the
1011next repository access by <em>git-cvsserver</em>, independent of
1012access method and requested operation.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:591013<div class="paragraph"><p>That means that even if you offer only read access (e.g. by using
Junio C Hamanoba4b9282008-07-06 05:20:311014the pserver method), <em>git-cvsserver</em> should have write access to
Junio C Hamanoa2ad99e2007-04-18 09:57:041015the database to work reliably (otherwise you need to make sure
Junio C Hamano88bf5712017-09-10 08:39:231016that the database is up to date any time <em>git-cvsserver</em> is executed).</p></div>
Junio C Hamano076ffcc2013-02-06 05:13:211017<div class="paragraph"><p>By default it uses SQLite databases in the Git directory, named
Junio C Hamanoc14e6ad2014-10-31 20:25:531018<code>gitcvs.&lt;module_name&gt;.sqlite</code>. Note that the SQLite backend creates
Junio C Hamanoa2ad99e2007-04-18 09:57:041019temporary files in the same directory as the database file on
1020write so it might not be enough to grant the users using
Junio C Hamanoba4b9282008-07-06 05:20:311021<em>git-cvsserver</em> write access to the database file without granting
1022them write access to the directory, too.</p></div>
Junio C Hamano2aba1012019-08-08 21:46:111023<div class="paragraph"><p>The database cannot be reliably regenerated in a
Junio C Hamano9df0c662009-11-23 11:09:271024consistent form after the branch it is tracking has changed.
1025Example: For merged branches, <em>git-cvsserver</em> only tracks
Junio C Hamano1aa40d22010-01-21 17:46:431026one branch of development, and after a <em>git merge</em> an
Junio C Hamano9df0c662009-11-23 11:09:271027incrementally updated database may track a different branch
1028than a database regenerated from scratch, causing inconsistent
Junio C Hamanoc14e6ad2014-10-31 20:25:531029CVS revision numbers. <code>git-cvsserver</code> has no way of knowing which
Junio C Hamano9df0c662009-11-23 11:09:271030branch it would have picked if it had been run incrementally
1031pre-merge. So if you have to fully or partially (from old
1032backup) regenerate the database, you should be suspicious
1033of pre-existing CVS sandboxes.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:591034<div class="paragraph"><p>You can configure the database backend with the following
Junio C Hamanoba4b9282008-07-06 05:20:311035configuration variables:</p></div>
Junio C Hamano9d971152012-12-19 00:43:111036<div class="sect2">
1037<h3 id="_configuring_database_backend">Configuring database backend</h3>
Junio C Hamano68cf15a2010-11-06 01:01:591038<div class="paragraph"><p><em>git-cvsserver</em> uses the Perl DBI module. Please also read
Junio C Hamanoa2ad99e2007-04-18 09:57:041039its documentation if changing these variables, especially
Junio C Hamanoc14e6ad2014-10-31 20:25:531040about <code>DBI-&gt;connect()</code>.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:591041<div class="dlist"><dl>
1042<dt class="hdlist1">
Junio C Hamano322c6242015-03-23 21:32:461043gitcvs.dbName
Junio C Hamanoa2ad99e2007-04-18 09:57:041044</dt>
1045<dd>
1046<p>
1047 Database name. The exact meaning depends on the
Junio C Hamano1f511962008-01-30 08:28:521048 selected database driver, for SQLite this is a filename.
Junio C Hamanoa2ad99e2007-04-18 09:57:041049 Supports variable substitution (see below). May
Junio C Hamanoc14e6ad2014-10-31 20:25:531050 not contain semicolons (<code>;</code>).
Junio C Hamanoa2ad99e2007-04-18 09:57:041051 Default: <em>%Ggitcvs.%m.sqlite</em>
1052</p>
1053</dd>
Junio C Hamano68cf15a2010-11-06 01:01:591054<dt class="hdlist1">
Junio C Hamano322c6242015-03-23 21:32:461055gitcvs.dbDriver
Junio C Hamanoa2ad99e2007-04-18 09:57:041056</dt>
1057<dd>
1058<p>
1059 Used DBI driver. You can specify any available driver
1060 for this here, but it might not work. cvsserver is tested
1061 with <em>DBD::SQLite</em>, reported to work with
1062 <em>DBD::Pg</em>, and reported <strong>not</strong> to work with <em>DBD::mysql</em>.
1063 Please regard this as an experimental feature. May not
Junio C Hamanoc14e6ad2014-10-31 20:25:531064 contain colons (<code>:</code>).
Junio C Hamanoa2ad99e2007-04-18 09:57:041065 Default: <em>SQLite</em>
1066</p>
1067</dd>
Junio C Hamano68cf15a2010-11-06 01:01:591068<dt class="hdlist1">
Junio C Hamanoa2ad99e2007-04-18 09:57:041069gitcvs.dbuser
1070</dt>
1071<dd>
1072<p>
Junio C Hamano322c6242015-03-23 21:32:461073 Database user. Only useful if setting <code>dbDriver</code>, since
Junio C Hamanoa2ad99e2007-04-18 09:57:041074 SQLite has no concept of database users. Supports variable
1075 substitution (see below).
1076</p>
1077</dd>
Junio C Hamano68cf15a2010-11-06 01:01:591078<dt class="hdlist1">
Junio C Hamano322c6242015-03-23 21:32:461079gitcvs.dbPass
Junio C Hamanoa2ad99e2007-04-18 09:57:041080</dt>
1081<dd>
1082<p>
Junio C Hamano322c6242015-03-23 21:32:461083 Database password. Only useful if setting <code>dbDriver</code>, since
Junio C Hamanoa2ad99e2007-04-18 09:57:041084 SQLite has no concept of database passwords.
1085</p>
1086</dd>
Junio C Hamano68cf15a2010-11-06 01:01:591087<dt class="hdlist1">
Junio C Hamanoa74efce2008-04-02 08:39:081088gitcvs.dbTableNamePrefix
1089</dt>
1090<dd>
1091<p>
1092 Database table name prefix. Supports variable substitution
1093 (see below). Any non-alphabetic characters will be replaced
1094 with underscores.
1095</p>
1096</dd>
Junio C Hamanoba4b9282008-07-06 05:20:311097</dl></div>
Junio C Hamano68cf15a2010-11-06 01:01:591098<div class="paragraph"><p>All variables can also be set per access method, see <a href="#configaccessmethod">above</a>.</p></div>
Junio C Hamano9d971152012-12-19 00:43:111099<div class="sect3">
Junio C Hamanoba4b9282008-07-06 05:20:311100<h4 id="_variable_substitution">Variable substitution</h4>
Junio C Hamano322c6242015-03-23 21:32:461101<div class="paragraph"><p>In <code>dbDriver</code> and <code>dbUser</code> you can use the following variables:</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:591102<div class="dlist"><dl>
1103<dt class="hdlist1">
Junio C Hamanoa2ad99e2007-04-18 09:57:041104%G
1105</dt>
1106<dd>
1107<p>
Junio C Hamano076ffcc2013-02-06 05:13:211108 Git directory name
Junio C Hamanoa2ad99e2007-04-18 09:57:041109</p>
1110</dd>
Junio C Hamano68cf15a2010-11-06 01:01:591111<dt class="hdlist1">
Junio C Hamanoa2ad99e2007-04-18 09:57:041112%g
1113</dt>
1114<dd>
1115<p>
Junio C Hamano076ffcc2013-02-06 05:13:211116 Git directory name, where all characters except for
Junio C Hamano8ef91f32019-12-01 22:58:271117 alphanumeric ones, <code>.</code>, and <code>-</code> are replaced with
Junio C Hamanoc14e6ad2014-10-31 20:25:531118 <code>_</code> (this should make it easier to use the directory
Junio C Hamanoa2ad99e2007-04-18 09:57:041119 name in a filename if wanted)
1120</p>
1121</dd>
Junio C Hamano68cf15a2010-11-06 01:01:591122<dt class="hdlist1">
Junio C Hamanoa2ad99e2007-04-18 09:57:041123%m
1124</dt>
1125<dd>
1126<p>
Junio C Hamano076ffcc2013-02-06 05:13:211127 CVS module/Git head name
Junio C Hamanoa2ad99e2007-04-18 09:57:041128</p>
1129</dd>
Junio C Hamano68cf15a2010-11-06 01:01:591130<dt class="hdlist1">
Junio C Hamanoa2ad99e2007-04-18 09:57:041131%a
1132</dt>
1133<dd>
1134<p>
1135 access method (one of "ext" or "pserver")
1136</p>
1137</dd>
Junio C Hamano68cf15a2010-11-06 01:01:591138<dt class="hdlist1">
Junio C Hamanoa2ad99e2007-04-18 09:57:041139%u
1140</dt>
1141<dd>
1142<p>
Junio C Hamanoba4b9282008-07-06 05:20:311143 Name of the user running <em>git-cvsserver</em>.
Junio C Hamanoa2ad99e2007-04-18 09:57:041144 If no name can be determined, the
1145 numeric uid is used.
1146</p>
1147</dd>
Junio C Hamanoba4b9282008-07-06 05:20:311148</dl></div>
Junio C Hamanoa2ad99e2007-04-18 09:57:041149</div>
Junio C Hamano9d971152012-12-19 00:43:111150</div>
1151</div>
1152</div>
1153<div class="sect1">
Junio C Hamanob141a922010-01-10 19:55:141154<h2 id="_environment">ENVIRONMENT</h2>
1155<div class="sectionbody">
Junio C Hamano68cf15a2010-11-06 01:01:591156<div class="paragraph"><p>These variables obviate the need for command-line options in some
Junio C Hamanob141a922010-01-10 19:55:141157circumstances, allowing easier restricted usage through git-shell.</p></div>
Junio C Hamanoa85030a2022-07-27 16:48:211158<div class="dlist"><dl>
1159<dt class="hdlist1">
1160GIT_CVSSERVER_BASE_PATH
1161</dt>
1162<dd>
1163<p>
1164 This variable replaces the argument to --base-path.
1165</p>
1166</dd>
1167<dt class="hdlist1">
1168GIT_CVSSERVER_ROOT
1169</dt>
1170<dd>
1171<p>
1172 This variable specifies a single directory, replacing the
1173 <code>&lt;directory&gt;...</code> argument list. The repository still requires the
1174 <code>gitcvs.enabled</code> config option, unless <code>--export-all</code> is specified.
1175</p>
1176</dd>
1177</dl></div>
Junio C Hamano68cf15a2010-11-06 01:01:591178<div class="paragraph"><p>When these environment variables are set, the corresponding
Junio C Hamanob141a922010-01-10 19:55:141179command-line arguments may not be used.</p></div>
1180</div>
Junio C Hamano9d971152012-12-19 00:43:111181</div>
1182<div class="sect1">
Junio C Hamanob9d9d902018-05-23 07:07:421183<h2 id="_eclipse_cvs_client_notes">ECLIPSE CVS CLIENT NOTES</h2>
Junio C Hamano9512fcf2006-03-01 12:05:141184<div class="sectionbody">
Junio C Hamano68cf15a2010-11-06 01:01:591185<div class="paragraph"><p>To get a checkout with the Eclipse CVS client:</p></div>
1186<div class="olist arabic"><ol class="arabic">
Junio C Hamano9512fcf2006-03-01 12:05:141187<li>
1188<p>
Junio C Hamano68cf15a2010-11-06 01:01:591189Select "Create a new project &#8594; From CVS checkout"
Junio C Hamano9512fcf2006-03-01 12:05:141190</p>
1191</li>
1192<li>
1193<p>
Junio C Hamanodecf50e2006-03-05 10:51:141194Create a new location. See the notes below for details on how to choose the
1195 right protocol.
Junio C Hamano9512fcf2006-03-01 12:05:141196</p>
1197</li>
1198<li>
1199<p>
Junio C Hamanodecf50e2006-03-05 10:51:141200Browse the <em>modules</em> available. It will give you a list of the heads in
1201 the repository. You will not be able to browse the tree from there. Only
1202 the heads.
Junio C Hamano9512fcf2006-03-01 12:05:141203</p>
1204</li>
1205<li>
1206<p>
Junio C Hamano92d80372016-07-13 22:00:051207Pick <code>HEAD</code> when it asks what branch/tag to check out. Untick the
Junio C Hamanodecf50e2006-03-05 10:51:141208 "launch commit wizard" to avoid committing the .project file.
Junio C Hamano9512fcf2006-03-01 12:05:141209</p>
1210</li>
Junio C Hamanoba4b9282008-07-06 05:20:311211</ol></div>
Junio C Hamano68cf15a2010-11-06 01:01:591212<div class="paragraph"><p>Protocol notes: If you are using anonymous access via pserver, just select that.
Junio C Hamanodecf50e2006-03-05 10:51:141213Those using SSH access should choose the <em>ext</em> protocol, and configure <em>ext</em>
Junio C Hamano68cf15a2010-11-06 01:01:591214access on the Preferences&#8594;Team&#8594;CVS&#8594;ExtConnection pane. Set CVS_SERVER to
Junio C Hamanoc14e6ad2014-10-31 20:25:531215"<code>git cvsserver</code>". Note that password support is not good when using <em>ext</em>,
Junio C Hamanoba4b9282008-07-06 05:20:311216you will definitely want to have SSH keys setup.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:591217<div class="paragraph"><p>Alternatively, you can just use the non-standard extssh protocol that Eclipse
Junio C Hamanodecf50e2006-03-05 10:51:141218offer. In that case CVS_SERVER is ignored, and you will have to replace
Junio C Hamanoc14e6ad2014-10-31 20:25:531219the cvs utility on the server with <em>git-cvsserver</em> or manipulate your <code>.bashrc</code>
Junio C Hamanoba4b9282008-07-06 05:20:311220so that calling <em>cvs</em> effectively calls <em>git-cvsserver</em>.</p></div>
Junio C Hamano9512fcf2006-03-01 12:05:141221</div>
Junio C Hamano9d971152012-12-19 00:43:111222</div>
1223<div class="sect1">
Junio C Hamanob9d9d902018-05-23 07:07:421224<h2 id="_clients_known_to_work">CLIENTS KNOWN TO WORK</h2>
Junio C Hamano9512fcf2006-03-01 12:05:141225<div class="sectionbody">
Junio C Hamano68cf15a2010-11-06 01:01:591226<div class="ulist"><ul>
Junio C Hamano103ad7f2007-03-14 11:19:261227<li>
1228<p>
1229CVS 1.12.9 on Debian
1230</p>
1231</li>
1232<li>
1233<p>
Junio C Hamano9512fcf2006-03-01 12:05:141234CVS 1.11.17 on MacOSX (from Fink package)
Junio C Hamano103ad7f2007-03-14 11:19:261235</p>
1236</li>
1237<li>
1238<p>
Junio C Hamano9512fcf2006-03-01 12:05:141239Eclipse 3.0, 3.1.2 on MacOSX (see Eclipse CVS Client Notes)
Junio C Hamano103ad7f2007-03-14 11:19:261240</p>
1241</li>
1242<li>
1243<p>
1244TortoiseCVS
1245</p>
1246</li>
Junio C Hamanoba4b9282008-07-06 05:20:311247</ul></div>
Junio C Hamano9512fcf2006-03-01 12:05:141248</div>
Junio C Hamano9d971152012-12-19 00:43:111249</div>
1250<div class="sect1">
Junio C Hamanob9d9d902018-05-23 07:07:421251<h2 id="_operations_supported">OPERATIONS SUPPORTED</h2>
Junio C Hamano34b18112006-02-23 11:21:401252<div class="sectionbody">
Junio C Hamano68cf15a2010-11-06 01:01:591253<div class="paragraph"><p>All the operations required for normal use are supported, including
Junio C Hamano36d52292013-01-25 21:32:361254checkout, diff, status, update, log, add, remove, commit.</p></div>
1255<div class="paragraph"><p>Most CVS command arguments that read CVS tags or revision numbers
1256(typically -r) work, and also support any git refspec
1257(tag, branch, commit ID, etc).
1258However, CVS revision numbers for non-default branches are not well
1259emulated, and cvs log does not show tags or branches at
1260all. (Non-main-branch CVS revision numbers superficially resemble CVS
1261revision numbers, but they actually encode a git commit ID directly,
1262rather than represent the number of revisions since the branch point.)</p></div>
1263<div class="paragraph"><p>Note that there are two ways to checkout a particular branch.
1264As described elsewhere on this page, the "module" parameter
1265of cvs checkout is interpreted as a branch name, and it becomes
1266the main branch. It remains the main branch for a given sandbox
1267even if you temporarily make another branch sticky with
1268cvs update -r. Alternatively, the -r argument can indicate
1269some other branch to actually checkout, even though the module
1270is still the "main" branch. Tradeoffs (as currently
1271implemented): Each new "module" creates a new database on disk with
1272a history for the given module, and after the database is created,
1273operations against that main branch are fast. Or alternatively,
1274-r doesn&#8217;t take any extra disk space, but may be significantly slower for
1275many operations, like cvs update.</p></div>
1276<div class="paragraph"><p>If you want to refer to a git refspec that has characters that are
1277not allowed by CVS, you have two options. First, it may just work
1278to supply the git refspec directly to the appropriate CVS -r argument;
1279some CVS clients don&#8217;t seem to do much sanity checking of the argument.
1280Second, if that fails, you can use a special character escape mechanism
1281that only uses characters that are valid in CVS tags. A sequence
Junio C Hamanoc14e6ad2014-10-31 20:25:531282of 4 or 5 characters of the form (underscore (<code>"_"</code>), dash (<code>"-"</code>),
1283one or two characters, and dash (<code>"-"</code>)) can encode various characters based
1284on the one or two letters: <code>"s"</code> for slash (<code>"/"</code>), <code>"p"</code> for
1285period (<code>"."</code>), <code>"u"</code> for underscore (<code>"_"</code>), or two hexadecimal digits
Junio C Hamano36d52292013-01-25 21:32:361286for any byte value at all (typically an ASCII number, or perhaps a part
1287of a UTF-8 encoded character).</p></div>
1288<div class="paragraph"><p>Legacy monitoring operations are not supported (edit, watch and related).
Junio C Hamanoba4b9282008-07-06 05:20:311289Exports and tagging (tags and branches) are not supported at this stage.</p></div>
Junio C Hamano9d971152012-12-19 00:43:111290<div class="sect2">
1291<h3 id="_crlf_line_ending_conversions">CRLF Line Ending Conversions</h3>
Junio C Hamano92d80372016-07-13 22:00:051292<div class="paragraph"><p>By default the server leaves the <code>-k</code> mode blank for all files,
Junio C Hamano619596a2010-08-18 22:15:351293which causes the CVS client to treat them as a text files, subject
1294to end-of-line conversion on some platforms.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:591295<div class="paragraph"><p>You can make the server use the end-of-line conversion attributes to
Junio C Hamano92d80372016-07-13 22:00:051296set the <code>-k</code> modes for files by setting the <code>gitcvs.usecrlfattr</code>
Junio C Hamanoa28a9202012-06-21 07:08:231297config variable. See <a href="gitattributes.html">gitattributes(5)</a> for more information
Junio C Hamanobb88cf42010-06-21 15:23:551298about end-of-line conversion.</p></div>
Junio C Hamanoc14e6ad2014-10-31 20:25:531299<div class="paragraph"><p>Alternatively, if <code>gitcvs.usecrlfattr</code> config is not enabled
Junio C Hamanobb88cf42010-06-21 15:23:551300or the attributes do not allow automatic detection for a filename, then
Junio C Hamano322c6242015-03-23 21:32:461301the server uses the <code>gitcvs.allBinary</code> config for the default setting.
1302If <code>gitcvs.allBinary</code> is set, then file not otherwise
Junio C Hamano92d80372016-07-13 22:00:051303specified will default to <em>-kb</em> mode. Otherwise the <code>-k</code> mode
Junio C Hamano322c6242015-03-23 21:32:461304is left blank. But if <code>gitcvs.allBinary</code> is set to "guess", then
Junio C Hamano92d80372016-07-13 22:00:051305the correct <code>-k</code> mode will be guessed based on the contents of
Junio C Hamanoba4b9282008-07-06 05:20:311306the file.</p></div>
Junio C Hamano68cf15a2010-11-06 01:01:591307<div class="paragraph"><p>For best consistency with <em>cvs</em>, it is probably best to override the
Junio C Hamanoc14e6ad2014-10-31 20:25:531308defaults by setting <code>gitcvs.usecrlfattr</code> to true,
Junio C Hamano322c6242015-03-23 21:32:461309and <code>gitcvs.allBinary</code> to "guess".</p></div>
Junio C Hamano34b18112006-02-23 11:21:401310</div>
Junio C Hamano9d971152012-12-19 00:43:111311</div>
1312</div>
1313<div class="sect1">
Junio C Hamanob9d9d902018-05-23 07:07:421314<h2 id="_dependencies">DEPENDENCIES</h2>
Junio C Hamano34b18112006-02-23 11:21:401315<div class="sectionbody">
Junio C Hamano68cf15a2010-11-06 01:01:591316<div class="paragraph"><p><em>git-cvsserver</em> depends on DBD::SQLite.</p></div>
Junio C Hamano34b18112006-02-23 11:21:401317</div>
Junio C Hamano9d971152012-12-19 00:43:111318</div>
1319<div class="sect1">
Junio C Hamanoba4b9282008-07-06 05:20:311320<h2 id="_git">GIT</h2>
Junio C Hamano34b18112006-02-23 11:21:401321<div class="sectionbody">
Junio C Hamanoa28a9202012-06-21 07:08:231322<div class="paragraph"><p>Part of the <a href="git.html">git(1)</a> suite</p></div>
Junio C Hamano34b18112006-02-23 11:21:401323</div>
Junio C Hamano7bd050f2011-09-22 06:32:221324</div>
Junio C Hamano9d971152012-12-19 00:43:111325</div>
Junio C Hamano7bd050f2011-09-22 06:32:221326<div id="footnotes"><hr /></div>
Junio C Hamano34b18112006-02-23 11:21:401327<div id="footer">
1328<div id="footer-text">
Junio C Hamano2ef0ba32018-01-26 23:13:531329Last updated
Junio C Hamano918a6972023-10-29 23:44:111330 2023-06-24 05:24:09 JST
Junio C Hamano34b18112006-02-23 11:21:401331</div>
1332</div>
1333</body>
1334</html>