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">
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 */
14 font-family: Georgia,serif;
18 h1, h2, h3, h4, h5, h6,
19 div.title, caption.title,
20 thead, p.table.header,
22 #author, #revnumber, #revdate, #revremark,
24 font-family: Arial,Helvetica,sans-serif;
28 margin:
1em
5%
1em
5%;
33 text-decoration: underline;
49 h1, h2, h3, h4, h5, h6 {
57 border-bottom:
2px solid silver;
77 border:
1px solid silver;
88 ul
> li { color: #aaa; }
89 ul
> li
> * { color: black; }
91 .monospaced, code, pre {
92 font-family:
"Courier New", Courier, monospace;
99 white-space: pre-wrap;
109 #revnumber, #revdate, #revremark {
114 border-top:
2px solid silver;
120 padding-bottom:
0.5em;
124 padding-bottom:
0.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 {
135 margin-bottom:
1.5em;
137 div.admonitionblock {
139 margin-bottom:
2.0em;
144 div.content { /* Block element content. */
148 /* Block element titles. */
149 div.title, caption.title {
154 margin-bottom:
0.5em;
160 td div.title:first-child {
163 div.content div.title:first-child {
166 div.content + div.title {
170 div.sidebarblock
> div.content {
172 border:
1px solid #dddddd;
173 border-left:
4px solid #f0f0f0;
177 div.listingblock
> div.content {
178 border:
1px solid #dddddd;
179 border-left:
5px solid #f0f0f0;
184 div.quoteblock, div.verseblock {
188 border-left:
5px solid #f0f0f0;
192 div.quoteblock
> div.attribution {
197 div.verseblock
> pre.content {
198 font-family: inherit;
201 div.verseblock
> div.attribution {
205 /* DEPRECATED: Pre version
8.2.7 verse style literal block. */
206 div.verseblock + div.attribution {
210 div.admonitionblock .icon {
214 text-decoration: underline;
216 padding-right:
0.5em;
218 div.admonitionblock td.content {
220 border-left:
3px solid #dddddd;
223 div.exampleblock
> div.content {
224 border-left:
3px solid #dddddd;
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; }
234 margin-bottom:
0.8em;
247 list-style-position: outside;
250 list-style-type: decimal;
253 list-style-type: lower-alpha;
256 list-style-type: upper-alpha;
259 list-style-type: lower-roman;
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 {
269 margin-bottom:
0.1em;
281 margin-bottom:
0.8em;
284 padding-bottom:
15px;
286 dt.hdlist1.strong, td.hdlist1.strong {
292 padding-right:
0.8em;
298 div.hdlist.compact tr {
307 .footnote, .footnoteref {
311 span.footnote, span.footnoteref {
312 vertical-align: super;
316 margin:
20px
0 20px
0;
320 #footnotes div.footnote {
326 border-top:
1px solid silver;
335 padding-right:
0.5em;
336 padding-bottom:
0.3em;
344 #footer-badges { display: none; }
348 margin-bottom:
2.5em;
356 margin-bottom:
0.1em;
359 div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
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; }
427 margin-bottom:
1.5em;
429 div.tableblock
> table {
430 border:
3px solid #
527bbd;
432 thead, p.table.header {
439 /* Because the table frame attribute is overridden by CSS in most browsers. */
440 div.tableblock
> table[
frame=
"void"] {
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;
460 margin-bottom:
1.5em;
462 thead, p.tableblock.header {
473 border-color: #
527bbd;
474 border-collapse: collapse;
476 th.tableblock, td.tableblock {
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 {
498 th.tableblock.halign-center, td.tableblock.halign-center {
501 th.tableblock.halign-right, td.tableblock.halign-right {
505 th.tableblock.valign-top, td.tableblock.valign-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;
523 padding-bottom:
0.5em;
524 border-top:
2px solid silver;
525 border-bottom:
2px solid silver;
530 body.manpage div.sectionbody {
535 body.manpage div#toc { display: none; }
540 <script type=
"text/javascript">
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
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 */
562 toc: function (toclevels) {
564 function getText(el) {
566 for (var i = el.firstChild; i != null; i = i.nextSibling) {
567 if (i.nodeType ==
3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
569 else if (i.firstChild != null)
575 function TocEntry(el, text, toclevel) {
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
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);
602 var toc = document.getElementById(
"toc");
607 // Delete existing TOC entries in case we're reloading the TOC.
608 var tocEntriesToRemove = [];
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");
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.
651 var noteholder = document.getElementById(
"footnotes");
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");
670 for (i=
0; i
<spans.length; i++) {
671 if (spans[i].className ==
"footnote") {
673 var note = spans[i].getAttribute(
"data-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];
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;
692 noteholder.parentNode.removeChild(noteholder);
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.
701 "[<a href='#_footnote_" + n +
702 "' title='View footnote' class='footnote'>" + n +
"</a>]";
708 install: function(toclevels) {
711 function reinstall() {
712 asciidoc.footnotes();
714 asciidoc.toc(toclevels);
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
723 timerId = setInterval(reinstall,
500);
724 if (document.addEventListener)
725 document.addEventListener(
"DOMContentLoaded", reinstallAndRemoveTimer, false);
727 window.onload = reinstallAndRemoveTimer;
735 <body class=
"manpage">
738 git-cvsserver(
1) Manual Page
741 <div class=
"sectionbody">
743 A CVS server emulator for Git
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
<HEAD_name
></pre>
755 <div class=
"attribution">
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">
762 <div class=
"paragraph"><p>Usage:
</p></div>
763 <div class=
"verseblock">
764 <pre class=
"content"><em>git-cvsserver
</em> [
<options
>] [pserver|server] [
<directory
> …]
</pre>
765 <div class=
"attribution">
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>
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>
788 --base-path
<path
>
792 Prepend
<em>path
</em> to requested CVSROOT
800 Don
’t allow recursing into subdirectories
808 Don
’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.
820 Print version information and exit
834 Print usage information and exit
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>
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>
861 <h2 id=
"_installation">INSTALLATION
</h2>
862 <div class=
"sectionbody">
863 <div class=
"olist arabic"><ol class=
"arabic">
866 If you are going to offer CVS access via pserver, add a line in
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>
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
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>
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">
890 authdb = /etc/cvsserver/passwd
</code></pre>
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>
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
<HEAD_name
></code></pre>
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 (
>=
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
<HEAD_name
></code></pre>
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
’t need to worry about always setting the correct environment
921 variable. SSH users restricted to
<em>git-shell
</em> don
’t need to override the default
922 with CVS_SERVER (and shouldn
’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>
928 For each repo that you want accessible from CVS you need to edit config in
929 the repo and add the following section.
931 <div class=
"openblock">
932 <div class=
"content">
933 <div class=
"listingblock">
934 <div class=
"content">
937 # optional for debugging
938 logFile=/path/to/logfile
</code></pre>
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">
956 enabled=
1</code></pre>
962 If you didn
’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>.
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>
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.
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
<dir-name
></code>. For example, this checks out
<em>master
</em> branch to the
992 <code>project-master
</code> directory:
994 <div class=
"listingblock">
995 <div class=
"content">
996 <pre><code> cvs co -d project-master master
</code></pre>
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.
<module-name
>.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>
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-
>connect()
</code>.
</p></div>
1041 <div class=
"dlist"><dl>
1042 <dt class=
"hdlist1">
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>
1054 <dt class=
"hdlist1">
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>
1068 <dt class=
"hdlist1">
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).
1078 <dt class=
"hdlist1">
1083 Database password. Only useful if setting
<code>dbDriver
</code>, since
1084 SQLite has no concept of database passwords.
1087 <dt class=
"hdlist1">
1088 gitcvs.dbTableNamePrefix
1092 Database table name prefix. Supports variable substitution
1093 (see below). Any non-alphabetic characters will be replaced
1098 <div class=
"paragraph"><p>All variables can also be set per access method, see
<a href=
"#configaccessmethod">above
</a>.
</p></div>
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">
1111 <dt class=
"hdlist1">
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)
1122 <dt class=
"hdlist1">
1127 CVS module/Git head name
1130 <dt class=
"hdlist1">
1135 access method (one of
"ext" or
"pserver")
1138 <dt class=
"hdlist1">
1143 Name of the user running
<em>git-cvsserver
</em>.
1144 If no name can be determined, the
1145 numeric uid is used.
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
1164 This variable replaces the argument to --base-path.
1167 <dt class=
"hdlist1">
1172 This variable specifies a single directory, replacing the
1173 <code><directory
>...
</code> argument list. The repository still requires the
1174 <code>gitcvs.enabled
</code> config option, unless
<code>--export-all
</code> is specified.
1178 <div class=
"paragraph"><p>When these environment variables are set, the corresponding
1179 command-line arguments may not be used.
</p></div>
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">
1189 Select
"Create a new project → From CVS checkout"
1194 Create a new location. See the notes below for details on how to choose the
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
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.
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
→Team
→CVS
→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>
1224 <h2 id=
"_clients_known_to_work">CLIENTS KNOWN TO WORK
</h2>
1225 <div class=
"sectionbody">
1226 <div class=
"ulist"><ul>
1229 CVS
1.12.9 on Debian
1234 CVS
1.11.17 on MacOSX (from Fink package)
1239 Eclipse
3.0,
3.1.2 on MacOSX (see Eclipse CVS Client Notes)
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
’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
’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>
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
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>
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>
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>
1326 <div id=
"footnotes"><hr /></div>
1328 <div id=
"footer-text">
1330 2024-
02-
08 15:
45:
59 PST