Autogenerated HTML docs for v2.45.0-31-gd4cc1
[git-htmldocs.git] / git-cvsserver.html
blob3e253076d01c81b7dbc54bc3b4f733c1b379d51a
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!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>
6 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
7 <meta name="generator" content="AsciiDoc 10.2.0" />
8 <title>git-cvsserver(1)</title>
9 <style type="text/css">
10 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
12 /* Default font. */
13 body {
14 font-family: Georgia,serif;
17 /* Title font. */
18 h1, h2, h3, h4, h5, h6,
19 div.title, caption.title,
20 thead, p.table.header,
21 #toctitle,
22 #author, #revnumber, #revdate, #revremark,
23 #footer {
24 font-family: Arial,Helvetica,sans-serif;
27 body {
28 margin: 1em 5% 1em 5%;
31 a {
32 color: blue;
33 text-decoration: underline;
35 a:visited {
36 color: fuchsia;
39 em {
40 font-style: italic;
41 color: navy;
44 strong {
45 font-weight: bold;
46 color: #083194;
49 h1, h2, h3, h4, h5, h6 {
50 color: #527bbd;
51 margin-top: 1.2em;
52 margin-bottom: 0.5em;
53 line-height: 1.3;
56 h1, h2, h3 {
57 border-bottom: 2px solid silver;
59 h2 {
60 padding-top: 0.5em;
62 h3 {
63 float: left;
65 h3 + * {
66 clear: left;
68 h5 {
69 font-size: 1.0em;
72 div.sectionbody {
73 margin-left: 0;
76 hr {
77 border: 1px solid silver;
80 p {
81 margin-top: 0.5em;
82 margin-bottom: 0.5em;
85 ul, ol, li > p {
86 margin-top: 0;
88 ul > li { color: #aaa; }
89 ul > li > * { color: black; }
91 .monospaced, code, pre {
92 font-family: "Courier New", Courier, monospace;
93 font-size: inherit;
94 color: navy;
95 padding: 0;
96 margin: 0;
98 pre {
99 white-space: pre-wrap;
102 #author {
103 color: #527bbd;
104 font-weight: bold;
105 font-size: 1.1em;
107 #email {
109 #revnumber, #revdate, #revremark {
112 #footer {
113 font-size: small;
114 border-top: 2px solid silver;
115 padding-top: 0.5em;
116 margin-top: 4.0em;
118 #footer-text {
119 float: left;
120 padding-bottom: 0.5em;
122 #footer-badges {
123 float: right;
124 padding-bottom: 0.5em;
127 #preamble {
128 margin-top: 1.5em;
129 margin-bottom: 1.5em;
131 div.imageblock, div.exampleblock, div.verseblock,
132 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133 div.admonitionblock {
134 margin-top: 1.0em;
135 margin-bottom: 1.5em;
137 div.admonitionblock {
138 margin-top: 2.0em;
139 margin-bottom: 2.0em;
140 margin-right: 10%;
141 color: #606060;
144 div.content { /* Block element content. */
145 padding: 0;
148 /* Block element titles. */
149 div.title, caption.title {
150 color: #527bbd;
151 font-weight: bold;
152 text-align: left;
153 margin-top: 1.0em;
154 margin-bottom: 0.5em;
156 div.title + * {
157 margin-top: 0;
160 td div.title:first-child {
161 margin-top: 0.0em;
163 div.content div.title:first-child {
164 margin-top: 0.0em;
166 div.content + div.title {
167 margin-top: 0.0em;
170 div.sidebarblock > div.content {
171 background: #ffffee;
172 border: 1px solid #dddddd;
173 border-left: 4px solid #f0f0f0;
174 padding: 0.5em;
177 div.listingblock > div.content {
178 border: 1px solid #dddddd;
179 border-left: 5px solid #f0f0f0;
180 background: #f8f8f8;
181 padding: 0.5em;
184 div.quoteblock, div.verseblock {
185 padding-left: 1.0em;
186 margin-left: 1.0em;
187 margin-right: 10%;
188 border-left: 5px solid #f0f0f0;
189 color: #888;
192 div.quoteblock > div.attribution {
193 padding-top: 0.5em;
194 text-align: right;
197 div.verseblock > pre.content {
198 font-family: inherit;
199 font-size: inherit;
201 div.verseblock > div.attribution {
202 padding-top: 0.75em;
203 text-align: left;
205 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
206 div.verseblock + div.attribution {
207 text-align: left;
210 div.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;
218 div.admonitionblock td.content {
219 padding-left: 0.5em;
220 border-left: 3px solid #dddddd;
223 div.exampleblock > div.content {
224 border-left: 3px solid #dddddd;
225 padding-left: 0.5em;
228 div.imageblock div.content { padding-left: 0; }
229 span.image img { border-style: none; vertical-align: text-bottom; }
230 a.image:visited { color: white; }
232 dl {
233 margin-top: 0.8em;
234 margin-bottom: 0.8em;
236 dt {
237 margin-top: 0.5em;
238 margin-bottom: 0;
239 font-style: normal;
240 color: navy;
242 dd > *:first-child {
243 margin-top: 0.1em;
246 ul, ol {
247 list-style-position: outside;
249 ol.arabic {
250 list-style-type: decimal;
252 ol.loweralpha {
253 list-style-type: lower-alpha;
255 ol.upperalpha {
256 list-style-type: upper-alpha;
258 ol.lowerroman {
259 list-style-type: lower-roman;
261 ol.upperroman {
262 list-style-type: upper-roman;
265 div.compact ul, div.compact ol,
266 div.compact p, div.compact p,
267 div.compact div, div.compact div {
268 margin-top: 0.1em;
269 margin-bottom: 0.1em;
272 tfoot {
273 font-weight: bold;
275 td > div.verse {
276 white-space: pre;
279 div.hdlist {
280 margin-top: 0.8em;
281 margin-bottom: 0.8em;
283 div.hdlist tr {
284 padding-bottom: 15px;
286 dt.hdlist1.strong, td.hdlist1.strong {
287 font-weight: bold;
289 td.hdlist1 {
290 vertical-align: top;
291 font-style: normal;
292 padding-right: 0.8em;
293 color: navy;
295 td.hdlist2 {
296 vertical-align: top;
298 div.hdlist.compact tr {
299 margin: 0;
300 padding-bottom: 0;
303 .comment {
304 background: yellow;
307 .footnote, .footnoteref {
308 font-size: 0.8em;
311 span.footnote, span.footnoteref {
312 vertical-align: super;
315 #footnotes {
316 margin: 20px 0 20px 0;
317 padding: 7px 0 0 0;
320 #footnotes div.footnote {
321 margin: 0 0 5px 0;
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;
334 div.colist td {
335 padding-right: 0.5em;
336 padding-bottom: 0.3em;
337 vertical-align: top;
339 div.colist td img {
340 margin-top: 0.3em;
343 @media print {
344 #footer-badges { display: none; }
347 #toc {
348 margin-bottom: 2.5em;
351 #toctitle {
352 color: #527bbd;
353 font-size: 1.1em;
354 font-weight: bold;
355 margin-top: 1.0em;
356 margin-bottom: 0.1em;
359 div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
360 margin-top: 0;
361 margin-bottom: 0;
363 div.toclevel2 {
364 margin-left: 2em;
365 font-size: 0.9em;
367 div.toclevel3 {
368 margin-left: 4em;
369 font-size: 0.9em;
371 div.toclevel4 {
372 margin-left: 6em;
373 font-size: 0.9em;
376 span.aqua { color: aqua; }
377 span.black { color: black; }
378 span.blue { color: blue; }
379 span.fuchsia { color: fuchsia; }
380 span.gray { color: gray; }
381 span.green { color: green; }
382 span.lime { color: lime; }
383 span.maroon { color: maroon; }
384 span.navy { color: navy; }
385 span.olive { color: olive; }
386 span.purple { color: purple; }
387 span.red { color: red; }
388 span.silver { color: silver; }
389 span.teal { color: teal; }
390 span.white { color: white; }
391 span.yellow { color: yellow; }
393 span.aqua-background { background: aqua; }
394 span.black-background { background: black; }
395 span.blue-background { background: blue; }
396 span.fuchsia-background { background: fuchsia; }
397 span.gray-background { background: gray; }
398 span.green-background { background: green; }
399 span.lime-background { background: lime; }
400 span.maroon-background { background: maroon; }
401 span.navy-background { background: navy; }
402 span.olive-background { background: olive; }
403 span.purple-background { background: purple; }
404 span.red-background { background: red; }
405 span.silver-background { background: silver; }
406 span.teal-background { background: teal; }
407 span.white-background { background: white; }
408 span.yellow-background { background: yellow; }
410 span.big { font-size: 2em; }
411 span.small { font-size: 0.6em; }
413 span.underline { text-decoration: underline; }
414 span.overline { text-decoration: overline; }
415 span.line-through { text-decoration: line-through; }
417 div.unbreakable { page-break-inside: avoid; }
421 * xhtml11 specific
423 * */
425 div.tableblock {
426 margin-top: 1.0em;
427 margin-bottom: 1.5em;
429 div.tableblock > table {
430 border: 3px solid #527bbd;
432 thead, p.table.header {
433 font-weight: bold;
434 color: #527bbd;
436 p.table {
437 margin-top: 0;
439 /* Because the table frame attribute is overridden by CSS in most browsers. */
440 div.tableblock > table[frame="void"] {
441 border-style: none;
443 div.tableblock > table[frame="hsides"] {
444 border-left-style: none;
445 border-right-style: none;
447 div.tableblock > table[frame="vsides"] {
448 border-top-style: none;
449 border-bottom-style: none;
454 * html5 specific
456 * */
458 table.tableblock {
459 margin-top: 1.0em;
460 margin-bottom: 1.5em;
462 thead, p.tableblock.header {
463 font-weight: bold;
464 color: #527bbd;
466 p.tableblock {
467 margin-top: 0;
469 table.tableblock {
470 border-width: 3px;
471 border-spacing: 0px;
472 border-style: solid;
473 border-color: #527bbd;
474 border-collapse: collapse;
476 th.tableblock, td.tableblock {
477 border-width: 1px;
478 padding: 4px;
479 border-style: solid;
480 border-color: #527bbd;
483 table.tableblock.frame-topbot {
484 border-left-style: hidden;
485 border-right-style: hidden;
487 table.tableblock.frame-sides {
488 border-top-style: hidden;
489 border-bottom-style: hidden;
491 table.tableblock.frame-none {
492 border-style: hidden;
495 th.tableblock.halign-left, td.tableblock.halign-left {
496 text-align: left;
498 th.tableblock.halign-center, td.tableblock.halign-center {
499 text-align: center;
501 th.tableblock.halign-right, td.tableblock.halign-right {
502 text-align: right;
505 th.tableblock.valign-top, td.tableblock.valign-top {
506 vertical-align: top;
508 th.tableblock.valign-middle, td.tableblock.valign-middle {
509 vertical-align: middle;
511 th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512 vertical-align: bottom;
517 * manpage specific
519 * */
521 body.manpage h1 {
522 padding-top: 0.5em;
523 padding-bottom: 0.5em;
524 border-top: 2px solid silver;
525 border-bottom: 2px solid silver;
527 body.manpage h2 {
528 border-style: none;
530 body.manpage div.sectionbody {
531 margin-left: 3em;
534 @media print {
535 body.manpage div#toc { display: none; }
539 </style>
540 <script type="text/javascript">
541 /*<![CDATA[*/
542 var asciidoc = { // Namespace.
544 /////////////////////////////////////////////////////////////////////
545 // Table Of Contents generator
546 /////////////////////////////////////////////////////////////////////
548 /* Author: Mihai Bazon, September 2002
549 * http://students.infoiasi.ro/~mishoo
551 * Table Of Content generator
552 * Version: 0.4
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.
558 /* modified by Troy D. Hanson, September 2006. License: GPL */
559 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
561 // toclevels = 1..4.
562 toc: function (toclevels) {
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);
572 return text;
575 function TocEntry(el, text, toclevel) {
576 this.element = el;
577 this.text = text;
578 this.toclevel = toclevel;
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);
594 iterate(i);
598 iterate(el);
599 return result;
602 var toc = document.getElementById("toc");
603 if (!toc) {
604 return;
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);
617 for (i = 0; i < tocEntriesToRemove.length; i++) {
618 toc.removeChild(tocEntriesToRemove[i]);
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);
635 if (entries.length == 0)
636 toc.parentNode.removeChild(toc);
640 /////////////////////////////////////////////////////////////////////
641 // Footnotes generator
642 /////////////////////////////////////////////////////////////////////
644 /* Based on footnote generation code from:
645 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
648 footnotes: 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;
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);
661 for (i = 0; i < entriesToRemove.length; i++) {
662 noteholder.removeChild(entriesToRemove[i]);
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);
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;
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>]";
708 install: function(toclevels) {
709 var timerId;
711 function reinstall() {
712 asciidoc.footnotes();
713 if (toclevels) {
714 asciidoc.toc(toclevels);
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
720 reinstall();
723 timerId = setInterval(reinstall, 500);
724 if (document.addEventListener)
725 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
726 else
727 window.onload = reinstallAndRemoveTimer;
731 asciidoc.install();
732 /*]]>*/
733 </script>
734 </head>
735 <body class="manpage">
736 <div id="header">
737 <h1>
738 git-cvsserver(1) Manual Page
739 </h1>
740 <h2>NAME</h2>
741 <div class="sectionbody">
742 <p>git-cvsserver -
743 A CVS server emulator for Git
744 </p>
745 </div>
746 </div>
747 <div id="content">
748 <div class="sect1">
749 <h2 id="_synopsis">SYNOPSIS</h2>
750 <div class="sectionbody">
751 <div class="paragraph"><p>SSH:</p></div>
752 <div class="verseblock">
753 <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">
756 </div></div>
757 <div class="paragraph"><p>pserver (/etc/inetd.conf):</p></div>
758 <div class="verseblock">
759 <pre class="content">cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver</pre>
760 <div class="attribution">
761 </div></div>
762 <div class="paragraph"><p>Usage:</p></div>
763 <div class="verseblock">
764 <pre class="content"><em>git-cvsserver</em> [&lt;options&gt;] [pserver|server] [&lt;directory&gt; &#8230;]</pre>
765 <div class="attribution">
766 </div></div>
767 </div>
768 </div>
769 <div class="sect1">
770 <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,
774 and for those methods that are implemented,
775 not 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
777 plugin. Most functionality works fine with both of these clients.</p></div>
778 </div>
779 </div>
780 <div class="sect1">
781 <h2 id="_options">OPTIONS</h2>
782 <div class="sectionbody">
783 <div class="paragraph"><p>All these options obviously only make sense if enforced by the server side.
784 They have been implemented to resemble the <a href="git-daemon.html">git-daemon(1)</a> options as
785 closely as possible.</p></div>
786 <div class="dlist"><dl>
787 <dt class="hdlist1">
788 --base-path &lt;path&gt;
789 </dt>
790 <dd>
792 Prepend <em>path</em> to requested CVSROOT
793 </p>
794 </dd>
795 <dt class="hdlist1">
796 --strict-paths
797 </dt>
798 <dd>
800 Don&#8217;t allow recursing into subdirectories
801 </p>
802 </dd>
803 <dt class="hdlist1">
804 --export-all
805 </dt>
806 <dd>
808 Don&#8217;t check for <code>gitcvs.enabled</code> in config. You also have to specify a list
809 of allowed directories (see below) if you want to use this option.
810 </p>
811 </dd>
812 <dt class="hdlist1">
814 </dt>
815 <dt class="hdlist1">
816 --version
817 </dt>
818 <dd>
820 Print version information and exit
821 </p>
822 </dd>
823 <dt class="hdlist1">
825 </dt>
826 <dt class="hdlist1">
828 </dt>
829 <dt class="hdlist1">
830 --help
831 </dt>
832 <dd>
834 Print usage information and exit
835 </p>
836 </dd>
837 <dt class="hdlist1">
838 &lt;directory&gt;
839 </dt>
840 <dd>
842 The remaining arguments provide a list of directories. If no directories
843 are given, then all are allowed. Repositories within these directories
844 still require the <code>gitcvs.enabled</code> config option, unless <code>--export-all</code>
845 is specified.
846 </p>
847 </dd>
848 </dl></div>
849 </div>
850 </div>
851 <div class="sect1">
852 <h2 id="_limitations">LIMITATIONS</h2>
853 <div class="sectionbody">
854 <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
856 from what most CVS users would expect since in CVS modules usually represent
857 one or more directories.</p></div>
858 </div>
859 </div>
860 <div class="sect1">
861 <h2 id="_installation">INSTALLATION</h2>
862 <div class="sectionbody">
863 <div class="olist arabic"><ol class="arabic">
864 <li>
866 If you are going to offer CVS access via pserver, add a line in
867 /etc/inetd.conf like
868 </p>
869 <div class="openblock">
870 <div class="content">
871 <div class="listingblock">
872 <div class="content">
873 <pre><code> cvspserver stream tcp nowait nobody git-cvsserver pserver</code></pre>
874 </div></div>
875 <div class="paragraph"><p>Note: Some inetd servers let you specify the name of the executable
876 independently of the value of argv[0] (i.e. the name the program assumes
877 it was executed with). In this case the correct line in /etc/inetd.conf
878 looks like</p></div>
879 <div class="listingblock">
880 <div class="content">
881 <pre><code> cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver</code></pre>
882 </div></div>
883 <div class="paragraph"><p>Only anonymous access is provided by pserver by default. To commit you
884 will have to create pserver accounts, simply add a gitcvs.authdb
885 setting in the config file of the repositories you want the cvsserver
886 to allow writes to, for example:</p></div>
887 <div class="listingblock">
888 <div class="content">
889 <pre><code> [gitcvs]
890 authdb = /etc/cvsserver/passwd</code></pre>
891 </div></div>
892 <div class="paragraph"><p>The format of these files is username followed by the encrypted password,
893 for example:</p></div>
894 <div class="listingblock">
895 <div class="content">
896 <pre><code> myuser:sqkNi8zPf01HI
897 myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/
898 myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3</code></pre>
899 </div></div>
900 <div class="paragraph"><p>You can use the <em>htpasswd</em> facility that comes with Apache to make these
901 files, but only with the -d option (or -B if your system supports it).</p></div>
902 <div class="paragraph"><p>Preferably use the system specific utility that manages password hash
903 creation in your platform (e.g. mkpasswd in Linux, encrypt in OpenBSD or
904 pwhash in NetBSD) and paste it in the right location.</p></div>
905 <div class="paragraph"><p>Then provide your password via the pserver method, for example:</p></div>
906 <div class="listingblock">
907 <div class="content">
908 <pre><code> cvs -d:pserver:someuser:somepassword@server:/path/repo.git co &lt;HEAD_name&gt;</code></pre>
909 </div></div>
910 <div class="paragraph"><p>No special setup is needed for SSH access, other than having Git tools
911 in the PATH. If you have clients that do not accept the CVS_SERVER
912 environment variable, you can rename <em>git-cvsserver</em> to <code>cvs</code>.</p></div>
913 <div class="paragraph"><p>Note: Newer CVS versions (&gt;= 1.12.11) also support specifying
914 CVS_SERVER directly in CVSROOT like</p></div>
915 <div class="listingblock">
916 <div class="content">
917 <pre><code> cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co &lt;HEAD_name&gt;</code></pre>
918 </div></div>
919 <div class="paragraph"><p>This has the advantage that it will be saved in your <em>CVS/Root</em> files and
920 you don&#8217;t need to worry about always setting the correct environment
921 variable. SSH users restricted to <em>git-shell</em> don&#8217;t need to override the default
922 with CVS_SERVER (and shouldn&#8217;t) as <em>git-shell</em> understands <code>cvs</code> to mean
923 <em>git-cvsserver</em> and pretends that the other end runs the real <em>cvs</em> better.</p></div>
924 </div></div>
925 </li>
926 <li>
928 For each repo that you want accessible from CVS you need to edit config in
929 the repo and add the following section.
930 </p>
931 <div class="openblock">
932 <div class="content">
933 <div class="listingblock">
934 <div class="content">
935 <pre><code> [gitcvs]
936 enabled=1
937 # optional for debugging
938 logFile=/path/to/logfile</code></pre>
939 </div></div>
940 <div class="paragraph"><p>Note: you need to ensure each user that is going to invoke <em>git-cvsserver</em> has
941 write 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
943 SSH, 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
945 file) for <code>cvs commit</code> to work. See <a href="gitcvs-migration.html">gitcvs-migration(7)</a>.</p></div>
946 <div class="paragraph" id="configaccessmethod"><p>All configuration variables can also be overridden for a specific method of
947 access. Valid method names are "ext" (for SSH access) and "pserver". The
948 following example configuration would disable pserver access while still
949 allowing access over SSH.</p></div>
950 <div class="listingblock">
951 <div class="content">
952 <pre><code> [gitcvs]
953 enabled=0
955 [gitcvs "ext"]
956 enabled=1</code></pre>
957 </div></div>
958 </div></div>
959 </li>
960 <li>
962 If you didn&#8217;t specify the CVSROOT/CVS_SERVER directly in the checkout command,
963 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
965 directory should point at the appropriate Git repo. As above, for SSH clients
966 <em>not</em> restricted to <em>git-shell</em>, CVS_SERVER should be set to <em>git-cvsserver</em>.
967 </p>
968 <div class="openblock">
969 <div class="content">
970 <div class="listingblock">
971 <div class="content">
972 <pre><code> export CVSROOT=:ext:user@server:/var/git/project.git
973 export CVS_SERVER="git cvsserver"</code></pre>
974 </div></div>
975 </div></div>
976 </li>
977 <li>
979 For 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.
984 </p>
985 </li>
986 <li>
988 Clients should now be able to check out the project. Use the CVS <em>module</em>
989 name to indicate what Git <em>head</em> you want to check out. This also sets the
990 name of your newly checked-out directory, unless you tell it otherwise with
991 <code>-d &lt;dir-name&gt;</code>. For example, this checks out <em>master</em> branch to the
992 <code>project-master</code> directory:
993 </p>
994 <div class="listingblock">
995 <div class="content">
996 <pre><code> cvs co -d project-master master</code></pre>
997 </div></div>
998 </li>
999 </ol></div>
1000 </div>
1001 </div>
1002 <div class="sect1">
1003 <h2 id="dbbackend">DATABASE BACKEND</h2>
1004 <div class="sectionbody">
1005 <div class="paragraph"><p><em>git-cvsserver</em> uses one database per Git head (i.e. CVS module) to
1006 store information about the repository to maintain consistent
1007 CVS revision numbers. The database needs to be
1008 updated (i.e. written to) after every commit.</p></div>
1009 <div class="paragraph"><p>If the commit is done directly by using <code>git</code> (as opposed to
1010 using <em>git-cvsserver</em>) the update will need to happen on the
1011 next repository access by <em>git-cvsserver</em>, independent of
1012 access method and requested operation.</p></div>
1013 <div class="paragraph"><p>That means that even if you offer only read access (e.g. by using
1014 the pserver method), <em>git-cvsserver</em> should have write access to
1015 the database to work reliably (otherwise you need to make sure
1016 that the database is up to date any time <em>git-cvsserver</em> is executed).</p></div>
1017 <div class="paragraph"><p>By default it uses SQLite databases in the Git directory, named
1018 <code>gitcvs.&lt;module-name&gt;.sqlite</code>. Note that the SQLite backend creates
1019 temporary files in the same directory as the database file on
1020 write so it might not be enough to grant the users using
1021 <em>git-cvsserver</em> write access to the database file without granting
1022 them write access to the directory, too.</p></div>
1023 <div class="paragraph"><p>The database cannot be reliably regenerated in a
1024 consistent form after the branch it is tracking has changed.
1025 Example: For merged branches, <em>git-cvsserver</em> only tracks
1026 one branch of development, and after a <em>git merge</em> an
1027 incrementally updated database may track a different branch
1028 than a database regenerated from scratch, causing inconsistent
1029 CVS revision numbers. <code>git-cvsserver</code> has no way of knowing which
1030 branch it would have picked if it had been run incrementally
1031 pre-merge. So if you have to fully or partially (from old
1032 backup) regenerate the database, you should be suspicious
1033 of pre-existing CVS sandboxes.</p></div>
1034 <div class="paragraph"><p>You can configure the database backend with the following
1035 configuration variables:</p></div>
1036 <div class="sect2">
1037 <h3 id="_configuring_database_backend">Configuring database backend</h3>
1038 <div class="paragraph"><p><em>git-cvsserver</em> uses the Perl DBI module. Please also read
1039 its documentation if changing these variables, especially
1040 about <code>DBI-&gt;connect()</code>.</p></div>
1041 <div class="dlist"><dl>
1042 <dt class="hdlist1">
1043 gitcvs.dbName
1044 </dt>
1045 <dd>
1047 Database name. The exact meaning depends on the
1048 selected database driver, for SQLite this is a filename.
1049 Supports variable substitution (see below). May
1050 not contain semicolons (<code>;</code>).
1051 Default: <em>%Ggitcvs.%m.sqlite</em>
1052 </p>
1053 </dd>
1054 <dt class="hdlist1">
1055 gitcvs.dbDriver
1056 </dt>
1057 <dd>
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
1064 contain colons (<code>:</code>).
1065 Default: <em>SQLite</em>
1066 </p>
1067 </dd>
1068 <dt class="hdlist1">
1069 gitcvs.dbuser
1070 </dt>
1071 <dd>
1073 Database user. Only useful if setting <code>dbDriver</code>, since
1074 SQLite has no concept of database users. Supports variable
1075 substitution (see below).
1076 </p>
1077 </dd>
1078 <dt class="hdlist1">
1079 gitcvs.dbPass
1080 </dt>
1081 <dd>
1083 Database password. Only useful if setting <code>dbDriver</code>, since
1084 SQLite has no concept of database passwords.
1085 </p>
1086 </dd>
1087 <dt class="hdlist1">
1088 gitcvs.dbTableNamePrefix
1089 </dt>
1090 <dd>
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>
1097 </dl></div>
1098 <div class="paragraph"><p>All variables can also be set per access method, see <a href="#configaccessmethod">above</a>.</p></div>
1099 <div class="sect3">
1100 <h4 id="_variable_substitution">Variable substitution</h4>
1101 <div class="paragraph"><p>In <code>dbDriver</code> and <code>dbUser</code> you can use the following variables:</p></div>
1102 <div class="dlist"><dl>
1103 <dt class="hdlist1">
1105 </dt>
1106 <dd>
1108 Git directory name
1109 </p>
1110 </dd>
1111 <dt class="hdlist1">
1113 </dt>
1114 <dd>
1116 Git directory name, where all characters except for
1117 alphanumeric ones, <code>.</code>, and <code>-</code> are replaced with
1118 <code>_</code> (this should make it easier to use the directory
1119 name in a filename if wanted)
1120 </p>
1121 </dd>
1122 <dt class="hdlist1">
1124 </dt>
1125 <dd>
1127 CVS module/Git head name
1128 </p>
1129 </dd>
1130 <dt class="hdlist1">
1132 </dt>
1133 <dd>
1135 access method (one of "ext" or "pserver")
1136 </p>
1137 </dd>
1138 <dt class="hdlist1">
1140 </dt>
1141 <dd>
1143 Name of the user running <em>git-cvsserver</em>.
1144 If no name can be determined, the
1145 numeric uid is used.
1146 </p>
1147 </dd>
1148 </dl></div>
1149 </div>
1150 </div>
1151 </div>
1152 </div>
1153 <div class="sect1">
1154 <h2 id="_environment">ENVIRONMENT</h2>
1155 <div class="sectionbody">
1156 <div class="paragraph"><p>These variables obviate the need for command-line options in some
1157 circumstances, allowing easier restricted usage through git-shell.</p></div>
1158 <div class="dlist"><dl>
1159 <dt class="hdlist1">
1160 GIT_CVSSERVER_BASE_PATH
1161 </dt>
1162 <dd>
1164 This variable replaces the argument to --base-path.
1165 </p>
1166 </dd>
1167 <dt class="hdlist1">
1168 GIT_CVSSERVER_ROOT
1169 </dt>
1170 <dd>
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>
1178 <div class="paragraph"><p>When these environment variables are set, the corresponding
1179 command-line arguments may not be used.</p></div>
1180 </div>
1181 </div>
1182 <div class="sect1">
1183 <h2 id="_eclipse_cvs_client_notes">ECLIPSE CVS CLIENT NOTES</h2>
1184 <div class="sectionbody">
1185 <div class="paragraph"><p>To get a checkout with the Eclipse CVS client:</p></div>
1186 <div class="olist arabic"><ol class="arabic">
1187 <li>
1189 Select "Create a new project &#8594; From CVS checkout"
1190 </p>
1191 </li>
1192 <li>
1194 Create a new location. See the notes below for details on how to choose the
1195 right protocol.
1196 </p>
1197 </li>
1198 <li>
1200 Browse 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.
1203 </p>
1204 </li>
1205 <li>
1207 Pick <code>HEAD</code> when it asks what branch/tag to check out. Untick the
1208 "launch commit wizard" to avoid committing the .project file.
1209 </p>
1210 </li>
1211 </ol></div>
1212 <div class="paragraph"><p>Protocol notes: If you are using anonymous access via pserver, just select that.
1213 Those using SSH access should choose the <em>ext</em> protocol, and configure <em>ext</em>
1214 access on the Preferences&#8594;Team&#8594;CVS&#8594;ExtConnection pane. Set CVS_SERVER to
1215 "<code>git cvsserver</code>". Note that password support is not good when using <em>ext</em>,
1216 you will definitely want to have SSH keys setup.</p></div>
1217 <div class="paragraph"><p>Alternatively, you can just use the non-standard extssh protocol that Eclipse
1218 offer. In that case CVS_SERVER is ignored, and you will have to replace
1219 the cvs utility on the server with <em>git-cvsserver</em> or manipulate your <code>.bashrc</code>
1220 so that calling <em>cvs</em> effectively calls <em>git-cvsserver</em>.</p></div>
1221 </div>
1222 </div>
1223 <div class="sect1">
1224 <h2 id="_clients_known_to_work">CLIENTS KNOWN TO WORK</h2>
1225 <div class="sectionbody">
1226 <div class="ulist"><ul>
1227 <li>
1229 CVS 1.12.9 on Debian
1230 </p>
1231 </li>
1232 <li>
1234 CVS 1.11.17 on MacOSX (from Fink package)
1235 </p>
1236 </li>
1237 <li>
1239 Eclipse 3.0, 3.1.2 on MacOSX (see Eclipse CVS Client Notes)
1240 </p>
1241 </li>
1242 <li>
1244 TortoiseCVS
1245 </p>
1246 </li>
1247 </ul></div>
1248 </div>
1249 </div>
1250 <div class="sect1">
1251 <h2 id="_operations_supported">OPERATIONS SUPPORTED</h2>
1252 <div class="sectionbody">
1253 <div class="paragraph"><p>All the operations required for normal use are supported, including
1254 checkout, 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).
1258 However, CVS revision numbers for non-default branches are not well
1259 emulated, and cvs log does not show tags or branches at
1260 all. (Non-main-branch CVS revision numbers superficially resemble CVS
1261 revision numbers, but they actually encode a git commit ID directly,
1262 rather 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.
1264 As described elsewhere on this page, the "module" parameter
1265 of cvs checkout is interpreted as a branch name, and it becomes
1266 the main branch. It remains the main branch for a given sandbox
1267 even if you temporarily make another branch sticky with
1268 cvs update -r. Alternatively, the -r argument can indicate
1269 some other branch to actually checkout, even though the module
1270 is still the "main" branch. Tradeoffs (as currently
1271 implemented): Each new "module" creates a new database on disk with
1272 a history for the given module, and after the database is created,
1273 operations against that main branch are fast. Or alternatively,
1274 -r doesn&#8217;t take any extra disk space, but may be significantly slower for
1275 many 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
1277 not allowed by CVS, you have two options. First, it may just work
1278 to supply the git refspec directly to the appropriate CVS -r argument;
1279 some CVS clients don&#8217;t seem to do much sanity checking of the argument.
1280 Second, if that fails, you can use a special character escape mechanism
1281 that only uses characters that are valid in CVS tags. A sequence
1282 of 4 or 5 characters of the form (underscore (<code>"_"</code>), dash (<code>"-"</code>),
1283 one or two characters, and dash (<code>"-"</code>)) can encode various characters based
1284 on the one or two letters: <code>"s"</code> for slash (<code>"/"</code>), <code>"p"</code> for
1285 period (<code>"."</code>), <code>"u"</code> for underscore (<code>"_"</code>), or two hexadecimal digits
1286 for any byte value at all (typically an ASCII number, or perhaps a part
1287 of a UTF-8 encoded character).</p></div>
1288 <div class="paragraph"><p>Legacy monitoring operations are not supported (edit, watch and related).
1289 Exports and tagging (tags and branches) are not supported at this stage.</p></div>
1290 <div class="sect2">
1291 <h3 id="_crlf_line_ending_conversions">CRLF Line Ending Conversions</h3>
1292 <div class="paragraph"><p>By default the server leaves the <code>-k</code> mode blank for all files,
1293 which causes the CVS client to treat them as a text files, subject
1294 to end-of-line conversion on some platforms.</p></div>
1295 <div class="paragraph"><p>You can make the server use the end-of-line conversion attributes to
1296 set the <code>-k</code> modes for files by setting the <code>gitcvs.usecrlfattr</code>
1297 config variable. See <a href="gitattributes.html">gitattributes(5)</a> for more information
1298 about end-of-line conversion.</p></div>
1299 <div class="paragraph"><p>Alternatively, if <code>gitcvs.usecrlfattr</code> config is not enabled
1300 or the attributes do not allow automatic detection for a filename, then
1301 the server uses the <code>gitcvs.allBinary</code> config for the default setting.
1302 If <code>gitcvs.allBinary</code> is set, then file not otherwise
1303 specified will default to <em>-kb</em> mode. Otherwise the <code>-k</code> mode
1304 is left blank. But if <code>gitcvs.allBinary</code> is set to "guess", then
1305 the correct <code>-k</code> mode will be guessed based on the contents of
1306 the file.</p></div>
1307 <div class="paragraph"><p>For best consistency with <em>cvs</em>, it is probably best to override the
1308 defaults by setting <code>gitcvs.usecrlfattr</code> to true,
1309 and <code>gitcvs.allBinary</code> to "guess".</p></div>
1310 </div>
1311 </div>
1312 </div>
1313 <div class="sect1">
1314 <h2 id="_dependencies">DEPENDENCIES</h2>
1315 <div class="sectionbody">
1316 <div class="paragraph"><p><em>git-cvsserver</em> depends on DBD::SQLite.</p></div>
1317 </div>
1318 </div>
1319 <div class="sect1">
1320 <h2 id="_git">GIT</h2>
1321 <div class="sectionbody">
1322 <div class="paragraph"><p>Part of the <a href="git.html">git(1)</a> suite</p></div>
1323 </div>
1324 </div>
1325 </div>
1326 <div id="footnotes"><hr /></div>
1327 <div id="footer">
1328 <div id="footer-text">
1329 Last updated
1330 2024-02-08 15:45:59 PST
1331 </div>
1332 </div>
1333 </body>
1334 </html>