/usr/share/doc/cvs2svn/www/cvs2svn.html is in cvs2svn 2.4.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css"> /* <![CDATA[ */
@import "tigris-branding/css/tigris.css";
@import "tigris-branding/css/inst.css";
/* ]]> */</style>
<link rel="stylesheet" type="text/css" media="print"
href="tigris-branding/css/print.css"/>
<script type="text/javascript" src="tigris-branding/scripts/tigris.js"></script>
<title>cvs2svn Documentation</title>
</head>
<body id="bodycol">
<div class="app">
<h1>cvs2svn Documentation</h1>
<h2>Index</h2>
<ul>
<li><a href="#intro">Introduction</a></li>
<li><a href="#reqs">Requirements</a></li>
<li><a href="#install">Installation</a></li>
<li><a href="#convert">Deciding how much to convert</a></li>
<li><a href="#prep">Prepping your repository</a></li>
<li><a href="#cmd-vs-options">Command line vs. options file</a></li>
<li><a href="#symbols">Symbol handling</a></li>
<li><a href="#cmd-ref">Command line reference</a></li>
<li><a href="#examples">A few examples</a></li>
</ul>
<hr />
<h1><a name="intro">Introduction</a></h1>
<p>cvs2svn is a program that can be used to migrate a CVS repository
to <a href="http://subversion.tigris.org/">Subversion</a> (otherwise
known as "SVN") or <a href="http://git.or.cz/">git</a>.
Documentation:</p>
<ul>
<li>The <a href="features.html">list of cvs2svn features</a>
explains briefly why converting a repository from CVS is nontrivial
and gives a comprehensive list of cvs2svn's many features.</li>
<li>The document you are currently reading contains a lot of general
information about converting from CVS, and specifically how to use
cvs2svn to convert your repository to Subversion.</li>
<li><a href="cvs2git.html">cvs2git.html</a> describes how to use
cvs2svn to convert your CVS repository to git.</li>
<li>The <a href="faq.html">FAQ</a> provides frequently asked
questions and answers, including important topics such as how to <a
href="faq.html#onetoone">convert multiple project</a> within a
single repository, how to <a href="faq.html#eol-fixup">fix problems
with end-of-line translation</a>, how to <a
href="faq.html#gettinghelp">get more help</a> and how to <a
href="faq.html#reportingbugs">report bugs</a> including a <a
href="faq.html#testcase">useful test case</a>.</li>
</ul>
<hr />
<h1><a name="reqs">Requirements</a></h1>
<p>cvs2svn requires the following:</p>
<ul>
<li>Direct (filesystem) access to a copy of the CVS repository that
you want to convert. cvs2svn parses the files in the CVS
repository directly, so it is not enough to have remote CVS
access. See the <a href="faq.html#repoaccess">FAQ</a> for more
information and a possible workaround.
</li>
<li>Python 2, version 2.4 or later. See <a
href="http://www.python.org/">http://www.python.org/</a>.
(cvs2svn does <strong>not</strong> work with Python 3.x.)
</li>
<li>A compatible database library, usually gdbm, and the
corresponding Python bindings. Neither dumbdbm nor standard dbm
is sufficient.
</li>
<li>If you use the <tt>--use-rcs</tt> option, then RCS's `co'
program is required. The RCS home page is
<a href="http://www.cs.purdue.edu/homes/trinkle/RCS/"
>http://www.cs.purdue.edu/homes/trinkle/RCS/</a>.
See the <a href="#use-rcs"><tt>--use-rcs</tt> flag</a> for more
details.
</li>
<li>If you use the <tt>--use-cvs</tt> option, then the `cvs' command
is required. The CVS home page is
<a href="http://ccvs.cvshome.org/">http://ccvs.cvshome.org/</a>.
See the <a href="#use-cvs"><tt>--use-cvs</tt> flag</a> for more
details.
</li>
</ul>
<h2>CVSNT repositories</h2>
<p>cvs2svn does not support conversion of <a
href="http://www.cvsnt.org/">CVSNT</a> repositories. Some people have
indicated success with such conversions, while others have had
problems. In other words, <em>such conversions, even if apparently
successful, should be checked carefully before use.</em> See the <a
href="faq.html#cvsnt">FAQ</a> for more information.</p>
<hr />
<h1><a name="install">Installation</a></h1>
<ul>
<li>As root, run 'make install'.</li>
<li>Or, if you do not wish to install cvs2svn on your system, you
can simply run it out of this directory. As long as it can find
the 'cvs2svn_rcsparse' library, it should be happy.</li>
<li>If you want to create Unix-style manpages for the main programs,
run 'make man'.</li>
</ul>
<hr />
<h1><a name="convert">Deciding how much to convert</a></h1>
<p>If you're looking to switch an existing CVS repository to
Subversion, you have a number of choices for migrating your existing
CVS data to a Subversion repository, depending on your needs.</p>
<p>There are a few basic routes to choose when switching from CVS to
Subversion, and the one you choose will depend on how much historical
data you want in your Subversion repository. You may be content to
refer to your existing (soon-to-be-converted-to-read-only) CVS
repository for "pre-Subversion" data and start working with a new
Subversion repository. Maybe you prefer to squeeze every last drop of
data out of your CVS repository into your Subversion repository. Then
again, perhaps you want a conversion somewhere in between these two.
Based on these needs, we've come up with these different recommended
paths for converting your CVS repository to a Subversion
repository.</p>
<ul>
<li>Top-skim (Doesn't require cvs2svn!)</li>
<li>Trunk only</li>
<li>Pick and choose</li>
<li>Full conversion</li>
<li>Smorgasbord</li>
<li>One project at a time</li>
</ul>
<p>If you decide that top-skimming doesn't meet your needs and you're
going to use cvs2svn (yay!), then be sure to read the section below on
<a href="#prep">prepping your repository</a> before you start your
conversion.</p>
<h2>Top-skimming</h2>
<p>This is the quickest and easiest way to get started in your new
repository. You're basically going to export the latest revision of
your cvs repository, possibly do some rearranging, and then import the
resulting files into your Subversion repository. Typically, if you
top-skim, that means you'll be either be keeping your old CVS
repository around as a read-only reference for older data or just
tossing that historical data outright (Note to you data packrats who
have just stopped breathing, please take a deep breath and put down
the letter opener. You don't <i>have</i> to do this yourself--it's
just that some people don't feel the same way you do about historical
data. They're really not <i>bad</i> people. Really.).</p>
<blockquote>
<p><b>Pros:</b> Quick, easy, convenient, results in a very compact and
"neat" Subversion repository.</p>
<p><b>Cons:</b> You've got no historical data, no branches, and no tags
in your Subversion repository. If you want any of this data, you'll
have to go back into the CVS Repository and get it.</p>
</blockquote>
<h2>Trunk only</h2>
<p>If you decide that you'd like to have the main development line of
your historical data in your Subversion repository but don't need to
carry over the tags and branches, you may want to skip converting your
CVS tags and branches entirely and only convert the "trunk" of your
repository. To do this, you'll use the <tt>--trunk-only</tt> switch
to cvs2svn.</p>
<blockquote>
<p><b>Pros:</b>Saves disk space in your new Subversion repository.
Attractive to neatniks.</p>
<p><b>Cons:</b> You've got no branches and no tags in your
Subversion repository.</p>
</blockquote>
<h2>Pick and choose</h2>
<p>Let's say, for example, that you want to convert your CVS repository's
historical data but you have no use for the myriad daily build tags
that you've got in your CVS repository. In addition to that, you want
some branches but would prefer to ignore others. In this case, you'll
want to use the <tt>--exclude</tt> switch to instruct cvs2svn which
branches and tags it should ignore. </p>
<blockquote>
<p><b>Pros:</b>You only get what you want from your CVS repository.
Saves a some space.</p>
<p><b>Cons:</b>If you forgot something, you'll have to go to your
CVS repository.</p>
</blockquote>
<h2>Full conversion</h2>
<p>If you want to convert your entire CVS repository, including all
tags and branches, you want a full conversion. This is cvs2svn's
default behavior.</p>
<blockquote>
<p><b>Pros:</b> Converts every last byte of your CVS repository.</p>
<p><b>Cons:</b> Requires more disk space.</p>
</blockquote>
<h2>Smorgasbord</h2>
<p>You can convert your repository (or repositories) piece by piece
using a combination of the above .</p>
<blockquote>
<p><b>Pros:</b> You get exactly what you want.</p>
<p><b>Cons:</b> Importing converted repositories multiple times into
a single Subversion repository will likely break date-based range
commands (e.g. <tt>svn diff -r {2002-02-17:2002-03-18}</tt>) since
Subversion does a binary search through the repository for dates.
While this is not the end of the world, it can be a minor
inconvenience.</p>
</blockquote>
<h2>One project at a time</h2>
<p>If you have many diverse projects in your CVS repository and you
don't want to move them all to Subversion at once, you may want to
convert to Subversion one project at a time. This requires a few
extra steps, but it can make the conversion of a large CVS repository
much more manageable. See <a href="faq.html#oneatatime">How can I
convert my CVS repository one module at a time?</a> on the cvs2svn FAQ
for a detailed example on converting your CVS repository one project
at a time.</p>
<blockquote>
<p><b>Pros:</b>Allows multiple projects in a single repository to
convert to Subversion according to a schedule that works best for
them.</p>
<p><b>Cons:</b>Requires some extra steps to accomplish the
conversion. Importing converted repositories multiple times into a
single Subversion repository will likely break date-based range
commands (e.g. <tt>svn diff -r {2002-02-17:2002-03-18}</tt>) since
Subversion does a binary search through the repository for dates.
While this is not the end of the world, it can be a minor
inconvenience.</p>
</blockquote>
<hr />
<h1><a name="prep">Prepping your repository</a></h1>
<p>There are a number of reasons that you may need to prep your CVS
Repository. If you decide that you need to change part of your CVS
repository, we <b>strongly</b> recommend working on a <b>copy</b> of
it instead of working on the real thing. cvs2svn itself does not make
any changes to your CVS repository, but if you start moving things
around and deleting things in a CVS repository, it's all too easy to
shoot yourself in the foot.</p>
<h2>End-of-line translation</h2>
<p>One of the most important topics to consider when converting a
repository is the distinction between binary and text files. If you
accidentally treat a binary file as text <strong>your repository
contents will be corrupted</strong>.</p>
<p>Text files are handled differently than binary files by both CVS
and Subversion. When a text file is checked out, the character used
to denote the end of line ("EOL") is converted to the local computer's
format. This is usually the most convenient behavior for text files.
Moreover, both CVS and Subversion allow "keywords" in text files (such
as <tt>$Id$</tt>), which are expanded with version control information
when the file is checked out. However, if line-end translation or
keyword expansion is applied to a binary file, the file will usually
be corrupted.</p>
<p>CVS treats a file as text unless you specifically tell it that the
file is binary. You can tell CVS that a file is binary by using the
command <tt>cvs admin -kb <i>filename</i></tt>. But often CVS users
forget to specify which files are binary, and as long as the
repository is only used under Unix, they may never notice a problem,
because the internal format of CVS is the same as the Unix format.
But Subversion is not as forgiving as CVS if you tell it to treat a
binary file as text.</p>
<p>If you have been conscientious about marking files as binary in
CVS, then you should be able to use <tt>--default-eol=native</tt>. If
you have been sloppy, then you have a few choices:</p>
<ul>
<li>Convert your repository with cvs2svn's default options. Your
text files will be treated as binary, but that usually isn't very
harmful (at least no information will be lost).</li>
<li>Mend your slovenly ways by fixing your CVS repository
<em>before</em> conversion: run <tt>cvs admin -kb
<i>filename</i></tt> for each binary file in the repository. Then
you can use <tt>--default-eol=native</tt> along with the
anal-retentive folks.</li>
<li>Use cvs2svn options to help cvs2svn deduce which files are
binary <em>during</em> the conversion. The useful options are
<tt>--eol-from-mime-type</tt>, <tt>--keywords-off</tt>,
<tt>--auto-props</tt>, and <tt>--default-eol</tt>. See the <a
href="faq.html#eol-fixup">FAQ</a> for more information.</li>
</ul>
<h2>Converting part of repository</h2>
<p>If you want to convert a subdirectory in your repository, you can
just point cvs2svn at the subdirectory and go. There is no need to
delete the unwanted directories from the CVS repository.</p>
<p>If the subdirectory that you are converting contains any files that
you <i>don't</i> want converted into your new Subversion repository,
you should delete them or move them aside. Such files can be deleted
from HEAD after the conversion, but they will still be visible in the
repository history.</p>
<p>Lastly, even though you can move and copy files and directories
around in Subversion, you may want to do some rearranging of project
directories before running your conversion to get the desired
repository project organization.</p>
<hr />
<h1><a name="cmd-vs-options">Command line vs. options file</a></h1>
<p>There are two ways to specify the options that define a conversion:
via the cvs2svn command line, or via an options file. The command
line is useful for simple conversions, but the options file method is
recommended for nontrivial conversions as it gives the user more
flexibility.</p>
<h2><a name="cmd-line-method">Command line method</a></h2>
<p>A command-line conversion allows the use of all of the command line
options listed <a href="#cmd-ref">below</a> (except for
<tt>--options</tt>). This method allows almost all of the built-in
conversion options to be selected, with the primary limitation that it
does not support multiproject conversions. However, it may require a
<em>long</em> command line to specify all of the options for a
complicated conversion.</p>
<h2><a name="options-file-method">Options file method</a></h2>
<p>The options file method allows full control of the conversion
process, including multiproject conversions. It also allows expert
users to customize the conversion even more radically by writing
Python code. Finally, the options file used in the conversion can be
retained as permanent record of the options used in a conversion.</p>
<p>To use the options file method, you need to create a file defining
all of the options that are to be used for the conversion. A
heavily-commented sample options file,
<tt>cvs2svn-example.options</tt>, is included in the cvs2svn
distribution. The easiest way to create your own options file is to
make a copy of the sample file and modify it as directed by the
comments in that file.</p>
<p><strong>Note:</strong> The options file format changes frequently.
Please be sure to base your options file on the
<tt>cvs2svn-example.options</tt> file from the version of cvs2svn that
you plan to use.</p>
<p>To start a conversion using an options file, invoke cvs2svn like
this:</p>
<pre>
$ cvs2svn --options=OPTIONSFILE
</pre>
<p>Only the following options are allowed in combination with
<tt>--options</tt>: <tt>-h/--help</tt>, <tt>--help-passes</tt>,
<tt>--version</tt>, <tt>-v/--verbose</tt>, <tt>-q/--quiet</tt>,
<tt>-p/--pass/--passes</tt>, <tt>--dry-run</tt>, and
<tt>--profile</tt>.</p>
<hr />
<h1><a name="symbols">Symbol handling</a></h1>
<p>cvs2svn converts CVS tags and branches into Subversion tags and
branches. This section discusses issues related to symbol
handling.</p>
<p><strong>HINT:</strong> If there are problems with symbol usage in
your repository, they are usually reported during
<tt>CollateSymbolsPass</tt> of the conversion, causing the conversion
to be interrupted. However, it is not necessary to restart the whole
conversion to fix the problems. Usually it is adequate to adjust the
symbol-handling options then re-start cvs2svn starting at
<tt>CollateSymbolsPass</tt>, by adding the option "<tt>-p
CollateSymbolsPass:</tt>". This trick can save a lot of time if you
have a large repository, as it might take a few iterations before you
find the best set of options to convert your repository.</p>
<h2><a name="symbol-layout">Placement of trunk, branches, and tags
directories</a></h2>
<p>cvs2svn converts CVS branches and tags into Subversion branches and
tags following the <a
href="http://svnbook.red-bean.com/en/1.2/svn.branchmerge.maint.html#svn.branchmerge.maint.layout">standard
Subversion convention</a>. For single-project conversions, the
default is to put the trunk, branches, and tags directories at the top
level of the repository tree, though this behavior can be changed by
using the <tt>--trunk</tt>, <tt>--branches</tt>, and <tt>--tags</tt>
options. For multiproject conversions, you must specify the location
of each project's trunk, branches, and tags directory in the options
file; <a
href="http://svnbook.red-bean.com/en/1.4/svn.branchmerge.maint.html#svn.branchmerge.maint.layout">repository
layout strategies</a> are discussed in the <a
href="http://svnbook.red-bean.com/">Subversion book</a>. For even
finer control over the conversion, you can use a
<tt>--symbol-hints</tt> file to specify the SVN path to be used for
each CVS tag and branch.</p>
<h2><a name="symbol-exclusion">Excluding tags and branches</a></h2>
<p>Often a CVS repository contains tags and branches that will not be
needed after the conversion to Subversion. You can instruct cvs2svn
to exclude such symbols from the conversion, in which case they will
not be present in the resulting Subversion repository. Please be
careful when doing this; excluding symbols causes information that was
present in CVS to be omitted in Subversion, thereby discarding
potentially useful historical information. Also be aware that if you
exclude a branch, then all CVS revisions that were committed to that
branch will also be excluded.</p>
<p>To exclude a tag or branch, use the option
<tt>--exclude=SYMBOL</tt>. You can also exclude a whole group of
symbols matching a specified regular expression; for example,
<tt>--exclude='RELEASE_0_.*'</tt>. (The regular expression has to
match the <em>whole</em> symbol name for the rule to apply.)</p>
<p>However, please note the following restriction. If a branch has a
subbranch or a tag on it, then the branch cannot be excluded unless
the dependent symbol is also excluded. cvs2svn checks for this
situation; if it occurs then <tt>CollateSymbolsPass</tt> outputs an
error message like the following:</p>
<pre>
ERROR: The branch 'BRANCH' cannot be excluded because the following symbols depend on it:
'TAG'
'SUBBRANCH'
</pre>
<p>In such a case you can either exclude the dependent symbol(s) (in
this case by using <tt>--exclude=TAG --exclude=SUBBRANCH</tt>) or
<em>not</em> exclude 'BRANCH'.</p>
<h3>Excluding vendor branches</h3>
<p>There is one more special case related to branch handling. A <a
href="http://cvsbook.red-bean.com/cvsbook.html#Tracking%20Third-Party%20Sources%20(Vendor%20Branches)">vendor
branch</a> is a CVS branch that is used to track source code received
from an outside source. A vendor branch typically has CVS branch
number <tt>1.1.1</tt> and revision numbers <tt>1.1.1.1</tt>,
<tt>1.1.1.2</tt>, etc. Vendor branches are created automatically
whenever the <tt>cvs import</tt> command is used. Vendor branches
have the strange property that, under certain circumstances, a file
that appears on a vendor branch also implicitly exists on trunk.
cvs2svn knows all about vendor branches and does its best to ensure
that a file that appears on a vendor branch is also copied to trunk,
to give Subversion behavior that is as close as possible to the CVS
behavior.</p>
<p>However, often vendor branches exist for reasons unrelated to
tracking outside sources. Indeed, some CVS documentation recommends
using the <tt>cvs import</tt> command to import your own code into
your CVS repository (which is arguably a misuse of the <tt>cvs
import</tt> command). Vendor branches created by this practice are
useless and would only serve to clutter up your Subversion repository.
Therefore, cvs2svn allows vendor branches to be excluded, in which
case the vendor branch revisions are grafted onto the history of
trunk. This is allowed <em>even if</em> other branches or tags appear
to sprout from the vendor branch, in which case the dependent tags are
grafted to trunk as well. Such branches can be recognized in the
<tt>--write-symbol-info</tt> by looking for a symbol that is a "pure
import" in the same number of files that it appears as a branch. It
is typically advantageous to exclude such branches.</p>
<h2><a name="symbol-inconsistencies">Tag/branch inconsistencies</a></h2>
<p>In CVS, the same symbol can appear as a tag in some files (e.g.,
<tt>cvs tag SYMBOL file1.txt</tt>) and a branch in others (e.g.,
<tt>cvs tag -b SYMBOL file2.txt</tt>). Subversion takes a more global
view of your repository, and therefore works better when each symbol
is used in a self-consistent way--either always as a branch or always
as a tag. cvs2svn provides features to help you resolve these
ambiguities.</p>
<p>If your repository contains inconsistently-used symbols, then
<tt>CollateSymbolsPass</tt>, by default, uses heuristics to decide
which symbols to convert as branches and which as tags. Often this
behavior will be adequate, and you don't have to do anything special.
You can use the <tt>--write-symbol-info=<i>filename</i></tt> option to
cause cvs2svn to list all of the symbols in your repository and how it
chose to convert them to <tt><i>filename</i></tt>.</p>
<p>However, if you want to take finer control over how symbols are
converted, you can do so. The first step is probably to change the
default symbol handling style from <tt>heuristic</tt> (the default
value) to <tt>strict</tt> using the option
<tt>--symbol-default=strict</tt>. With the <tt>strict</tt> setting,
cvs2svn prints error messages and aborts the conversion if there are
any ambiguous symbols. The error messages look like this:</p>
<pre>
ERROR: It is not clear how the following symbols should be converted.
Use --symbol-hints, --force-tag, --force-branch, --exclude, and/or
--symbol-default to resolve the ambiguity.
'SYMBOL1' is a tag in 1 files, a branch in 2 files and has commits in 0 files
'SYMBOL2' is a tag in 2 files, a branch in 1 files and has commits in 0 files
'SYMBOL3' is a tag in 1 files, a branch in 2 files and has commits in 1 files
</pre>
<p>You have to tell cvs2svn how to fix the inconsistencies then
restart the conversion at <tt>CollateSymbolsPass</tt>.</p>
<p>There are three ways to deal with an inconsistent symbol: treat it
as a tag, treat it as a branch, or exclude it from the conversion
altogether.</p>
<p>In the example above, the symbol 'SYMBOL1' was used as a branch in
two files but used as a tag in only one file. Therefore, it might
make sense to convert it as a branch, by using the option
<tt>--force-branch=SYMBOL1</tt>. However, no revisions were committed
on this branch, so it would also be possible to convert it as a tag,
by using the option <tt>--force-tag=SYMBOL1</tt>. If the symbol is
not needed at all, it can be excluded by using
<tt>--exclude=SYMBOL1</tt>.</p>
<p>Similarly, 'SYMBOL2' was used more often as a tag, but can still be
converted as a branch or a tag, or excluded.</p>
<p><tt>SYMBOL3</tt>, on the other hand, was sometimes used as a
branch, and at least one revision was committed on the branch. It can
be converted as a branch, using <tt>--force-branch=SYMBOL3</tt>. But
it cannot be converted as a tag (because tags are not allowed to have
revisions on them). If it is excluded, using
<tt>--exclude=SYMBOL3</tt>, then both the branch and the revisions on
the branch will be left out of the Subversion repository.</p>
<p>If you are not so picky about which symbols are converted as tags
and which as branches, you can ask cvs2svn to decide by itself. To do
this, specify the <tt>--symbol-default=OPTION</tt>, where
<tt>OPTION</tt> can be either "<tt>heuristic</tt>" (the default;
decide how to treat each ambiguous symbol based on whether it was used
more often as a branch or as a tag in CVS), "<tt>branch</tt>" (treat
every ambiguous symbol as a branch), or "<tt>tag</tt>" (treat every
ambiguous symbol as a tag). You can use the <tt>--force-branch</tt>
and <tt>--force-tag</tt> options to specify the treatment of
particular symbols, in combination with <tt>--symbol-default</tt> to
specify the default to be used for other ambiguous symbols.</p>
<p>Finally, you can have cvs2svn write a text file showing how each
symbol was converted by using the <tt>--write-symbol-info</tt> option.
If you disagree with any of cvs2svn's choices, you can make a copy of
this file, edit it, then pass it to cvs2svn by using the
<tt>--symbol-hints</tt> option. In this manner you can influence how
each symbol is converted and also the parent line of development of
each symbol (the line of development from which the symbol
sprouts).</p>
<hr />
<h1><a name="cmd-ref">Command line reference</a></h1>
<table border="1" cellpadding="10" cellspacing="3" width="80%">
<tr>
<td colspan="2">
<strong>USAGE:</strong><br/>
<tt>cvs2svn [OPTIONS]... [-s SVN-REPOS-PATH|--dumpfile=PATH|--dry-run]
CVS-REPOS-PATH</tt><br/>
<tt>cvs2svn [OPTIONS]... --options=PATH</tt><br/>
</td>
</tr>
<tr>
<td align="right"><tt>CVS-REPOS-PATH</tt></td>
<td>The filesystem path of the part of the CVS repository that you
want to convert. It is not possible to convert a CVS repository
to which you only have remote access; see <a
href="faq.html#repoaccess">the FAQ</a> for details. This
doesn't have to be the top level directory of a CVS repository;
it can point at a project within a repository, in which case
only that project will be converted. This path or one of its
parent directories has to contain a subdirectory called CVSROOT
(though the CVSROOT directory can be empty).</td>
</tr>
<tr>
<th colspan="2">
Configuration via options file
</th>
</tr>
<tr>
<td align="right"><tt>--options=PATH</tt></td>
<td>Read the conversion options from the specified file. See
section <a href="#options-file-method">options file method</a>
for more information.</td>
</tr>
<tr>
<th colspan="2">
Output options
</th>
</tr>
<tr>
<td align="right"><tt>-s PATH</tt><br/><tt>--svnrepos PATH</tt></td>
<td>Write the output of the conversion into a Subversion
repository located at PATH. This option causes a new Subversion
repository to be created at PATH unless the
<tt>--existing-svnrepos</tt> option is also used.</td>
</tr>
<tr>
<td align="right"><tt>--existing-svnrepos</tt></td>
<td>Load the converted CVS repository into an existing Subversion
repository, instead of creating a new repository. (This option
should be used in combination with
<tt>-s</tt>/<tt>--svnrepos</tt>.) The repository must either be
empty or contain no paths that overlap with those that will
result from the conversion. Please note that you need write
permission for the repository files.</td>
</tr>
<tr>
<td align="right"><tt>--fs-type=TYPE</tt></td>
<td>Pass the <tt>--fs-type=TYPE</tt> option to "svnadmin
create" if creating a new Subversion repository.</td>
</tr>
<tr>
<td align="right"><tt>--bdb-txn-nosync</tt></td>
<td>Pass the <tt>--bdb-txn-nosync</tt> switch to "svnadmin
create" if creating a new Subversion repository.</td>
</tr>
<tr>
<td align="right"><tt>--create-option=OPT</tt></td>
<td>Pass OPT to "svnadmin create" if creating a new Subversion
repository (can be specified multiple times to pass multiple
options).</td>
</tr>
<tr>
<td align="right"><tt>--dumpfile=PATH</tt></td>
<td>Output the converted CVS repository into a Subversion dumpfile
instead of a Subversion repository (useful for importing a CVS
repository into an existing Subversion repository). PATH is the
filename in which to store the dumpfile.</td>
</tr>
<tr>
<td align="right"><tt>--dry-run</tt></td>
<td>Do not create a repository or a dumpfile; just print the details
of what cvs2svn would do if it were really converting your
repository.</td>
</tr>
<tr>
<th colspan="2">
Conversion options
</th>
</tr>
<tr>
<td align="right"><tt>--trunk-only</tt></td>
<td>Convert only the main line of development from the CVS
repository (commonly referred to in Subversion parlance as
"trunk"), ignoring all tags and branches.</td>
</tr>
<tr>
<td align="right"><tt>--trunk=PATH</tt></td>
<td>The top-level path to use for trunk in the Subversion
repository. The default value is "trunk".</td>
</tr>
<tr>
<td align="right"><tt>--branches=PATH</tt></td>
<td>The top-level path to use for branches in the Subversion
repository. The default value is "branches".</td>
</tr>
<tr>
<td align="right"><tt>--tags=PATH</tt></td>
<td>The top-level path to use for tags in the Subversion
repository. The default value is "tags".</td>
</tr>
<tr>
<td align="right"><tt>--include-empty-directories</tt></td>
<td>Treat empty subdirectories within the CVS repository as actual
directories, creating them when the parent directory is created
and removing them if and when the parent directory is pruned.</td>
</tr>
<tr>
<td align="right"><tt>--no-prune</tt></td>
<td>When all files are deleted from a directory in the Subversion
repository, don't delete the empty directory (the default is to
delete any empty directories.</td>
</tr>
<tr>
<td align="right"><tt>--encoding=ENC</tt></td>
<td>Use ENC as the encoding for filenames, log messages, and
author names in the CVS repos. (By using an <tt>--options</tt>
file, it is possible to specify one set of encodings to use for
filenames and a second set for log messages and author names.)
This option may be specified multiple times, in which case the
encodings are tried in order until one succeeds. Default:
ascii. Other possible values include the <a
href="http://docs.python.org/lib/standard-encodings.html">standard
Python encodings</a>.</td>
</tr>
<tr>
<td align="right"><tt>--fallback-encoding=ENC</tt></td>
<td>If none of the encodings specified with <tt>--encoding</tt>
succeed in decoding an author name or log message, then fall
back to using ENC in lossy 'replace' mode. Use of this option
may cause information to be lost, but at least it allows the
conversion to run to completion. This option only affects the
encoding of log messages and author names; there is no fallback
encoding for filenames. (By using an <tt>--options</tt> file,
it is possible to specify a fallback encoding for filenames.)
Default: disabled.</td>
</tr>
<tr>
<td align="right"><tt>--no-cross-branch-commits</tt></td>
<td>Prevent the creation of SVN commits that affect multiple
branches or trunk and a branch. Instead, break such changesets
into multiple commits, one per branch.</td>
</tr>
<tr>
<td align="right"><tt>--retain-conflicting-attic-files</tt></td>
<td>If a file appears both inside an outside of the CVS attic,
retain the attic version in an SVN subdirectory called `Attic'.
(Normally this situation is treated as a fatal error.)</td>
</tr>
<tr>
<th colspan="2">
Symbol handling
</th>
</tr>
<tr>
<td align="right"><tt>--symbol-transform=PAT:SUB</tt></td>
<td><p>Transform RCS/CVS symbol names before entering them into
Subversion. PAT is a Python regular expression pattern that is
matched against the entire symbol name. If it matches, the
symbol is replaced with SUB, which is a replacement pattern
using Python's reference syntax. You may specify any number of
these options; they will be applied in the order given on the
command line.</p>
<p>This option can be useful if you're converting a repository in
which the developer used directory-wide symbol names like 1_0, 1_1
and 2_1 as a kludgy form of release tagging (the C-x v s command
in Emacs VC mode encourages this practice). A command like</p>
<pre>
cvs2svn --symbol-transform='([0-9])-(.*):release-\1.\2' -s SVN RCS
</pre>
<p>will transform a local CVS repository into a local SVN repository,
performing the following sort of mappings of RCS symbolic names to
SVN tags:</p>
<pre>
1-0 → release-1.0
1-1 → release-1.1
2-0 → release-2.0
</pre>
</td>
</tr>
<tr>
<td align="right"><tt>--symbol-hints=PATH</tt></td>
<td><p>Read symbol conversion hints from PATH. The format of PATH is
the same as the format output by <tt>--write-symbol-info</tt>,
namely a text file with four whitespace-separated columns:</p>
<pre>
project-id symbol conversion svn-path parent-lod-name
</pre>
<p><i>project-id</i> is the numerical ID of the project to which
the symbol belongs, counting from 0. <i>project-id</i> can be
set to '.' if project-specificity is not needed.
<i>symbol-name</i> is the name of the symbol being specified.
<i>conversion</i> specifies how the symbol should be converted,
and can be one of the values 'branch', 'tag', or 'exclude'. If
<i>conversion</i> is '.', then this rule does not affect how the
symbol is converted. <i>svn-path</i> is the name of the SVN
path to which this line of development should be written. If
<i>svn-path</i> is omitted or '.', then this rule does not
affect the SVN path of this symbol. <i>parent-lod-name</i> is
the name of the symbol from which this symbol should sprout, or
'.trunk.' if the symbol should sprout from trunk. If
<i>parent-lod-name</i> is omitted or '.', then this rule does
not affect the preferred parent of this symbol. The file may
contain blank lines or comment lines (lines whose first
non-whitespace character is '#').</p>
<p>The simplest way to use this option is to run the conversion
through CollateSymbolsPass with <tt>--write-symbol-info</tt>
option, copy the symbol info and edit it to create a hints file,
then re-start the conversion at <tt>CollateSymbolsPass</tt> with
this option enabled.</p></td>
</tr>
<tr>
<td align="right"><tt>--symbol-default=OPT</tt></td>
<td>Specify how to convert ambiguous symbols (i.e., those that
appear in the CVS archive as both branches and tags).
<tt>OPT</tt> is one of the following:<ul>
<li>"<tt>heuristic</tt>": Decide how to treat each ambiguous
symbol based on whether it was used more often as a branch
or tag in CVS. (This is the default behavior.)</li>
<li>"<tt>strict</tt>": No default; every ambiguous symbol has
to be resolved manually using <tt>--symbol-hints</tt>,
<tt>--force-branch</tt>, <tt>--force-tag</tt>, or
<tt>--exclude</tt>.</li>
<li>"<tt>branch</tt>": Treat every ambiguous symbol as a
branch.</li>
<li>"<tt>tag</tt>": Treat every ambiguous symbols as a
tag.</li>
</ul>
</td>
</tr>
<tr>
<td align="right"><tt>--force-branch=REGEXP</tt></td>
<td>Force symbols whose names match REGEXP to be branches.</td>
</tr>
<tr>
<td align="right"><tt>--force-tag=REGEXP</tt></td>
<td>Force symbols whose names match REGEXP to be tags. This will
cause an error if such a symbol has commits on it.</td>
</tr>
<tr>
<td align="right"><tt>--exclude=REGEXP</tt></td>
<td>Exclude branches and tags whose names match REGEXP from
the conversion.</td>
</tr>
<tr>
<td align="right"><tt>--keep-trivial-imports</tt></td>
<td>Do not exclude branches that were only used for a single
import. (By default such branches are excluded because they
are usually created by the inappropriate use of <tt>cvs
import</tt>.)</td>
</tr>
<tr>
<th colspan="2">
Subversion properties
</th>
</tr>
<tr>
<td align="right"><tt>--username=NAME</tt></td>
<td>Use NAME as the author for cvs2svn-synthesized commits (the
default value is no author at all.</td>
</tr>
<tr>
<td align="right"><tt>--auto-props=FILE</tt></td>
<td>
<p>Specify a file in the format of Subversion's config file,
whose <tt>[auto-props]</tt> section can be used to set
arbitrary properties on files in the Subversion repository
based on their filenames. (The <tt>[auto-props]</tt> section
header must be present; other sections of the config file,
including the <tt>enable-auto-props</tt> setting, are
ignored.) Filenames are matched to the filename patterns
case-insensitively, consistent with Subversion's behavior.
The auto-props file might have content like this:</p>
<pre>
[auto-props]
*.txt = svn:mime-type=text/plain;svn:eol-style=native
*.doc = svn:mime-type=application/msword;!svn:eol-style
</pre>
<p>Please note that cvs2svn allows properties to be explicitly
<em>unset</em>: if cvs2svn sees a setting like
<tt>!svn:eol-style</tt> (with a leading exclamation point), it
forces the property to remain <em>unset</em>, even if later
rules would otherwise set the property.</p>
</td>
</tr>
<tr>
<td align="right"><tt>--mime-types=FILE</tt></td>
<td>Specify an apache-style mime.types file for setting
<tt>svn:mime-type</tt> properties on files in the Subversion
repository.</td>
</tr>
<tr>
<td align="right"><tt>--eol-from-mime-type</tt></td>
<td>For files that don't have the <tt>kb</tt> expansion mode but
have a known mime type, set the eol-style based on the mime
type. For such files, set the <tt>svn:eol-style</tt> property
to "native" if the mime type begins with "text/", and leave it
unset (i.e., no EOL translation) otherwise. Files with unknown
mime types are not affected by this option. This option has no
effect unless the <tt>--mime-types</tt> option is also
specified.</td>
</tr>
<tr>
<td align="right"><tt>--default-eol=STYLE</tt></td>
<td>Set <tt>svn:eol-style</tt> to STYLE for files that don't have
the <tt>kb</tt> expansion mode and whose end-of-line translation
mode hasn't been determined by one of the other options. STYLE
can be "<tt>binary</tt>" (default), "<tt>native</tt>",
"<tt>CRLF</tt>", "<tt>LF</tt>", or "<tt>CR</tt>".</td>
</tr>
<tr>
<td align="right"><tt>--keywords-off</tt></td>
<td>By default, cvs2svn sets <tt>svn:keywords</tt> on CVS files to
"Author Date Id Revision" if the file's svn:eol-style property
is set (see the <tt>--default-eol</tt> option). The
<tt>--keywords-off</tt> switch prevents cvs2svn from setting
<tt>svn:keywords</tt> for any file. (The result for files
that <em>do</em> contain keyword strings is somewhat
unexpected: the keywords will be left with the expansions that
they had when committed to CVS, which is usually the expansion
for the <em>previous</em> revision.)</td>
</tr>
<tr>
<td align="right"><tt>--keep-cvsignore</tt></td>
<td>Include <tt>.cvsignore</tt> files in the output. (Normally
they are unneeded because cvs2svn sets the corresponding
<tt>svn:ignore</tt> properties.)</td>
</tr>
<tr>
<td align="right"><tt>--cvs-revnums</tt></td>
<td>Record CVS revision numbers as file properties in the
Subversion repository. (Note that unless it is removed
explicitly, the last CVS revision number will remain associated
with the file even after the file is changed within
Subversion.)</td>
</tr>
<tr>
<th colspan="2">
Extraction options
</th>
</tr>
<tr>
<td align="right">
<a name="use-internal-co"><tt>--use-internal-co</tt></a>
</td>
<td>Use internal code to extract the contents of CVS revisions.
This is the default extraction option. This is up to 50% faster
than <tt>--use-rcs</tt>, but needs a lot of disk space: roughly
the size of your CVS repository plus the peak size of a complete
checkout of the repository with all branches that existed and
still had commits pending at a given time. If this option is
used, the <tt>$Log$</tt> keyword is not handled.
</td>
</tr>
<tr>
<td align="right"><a name="use-rcs"><tt>--use-rcs</tt></a></td>
<td>Use RCS's <b><tt>co</tt></b> command to extract the contents
of CVS revisions. RCS is much faster than CVS, but in certain
rare cases it has problems with data that CVS can handle.
Specifically:
<ul>
<li>RCS can't handle spaces in author names:<br/>
<a href="http://cvs2svn.tigris.org/issues/show_bug.cgi?id=4"
>http://cvs2svn.tigris.org/issues/show_bug.cgi?id=4</a>
</li>
<li>"Unterminated keyword" misread by RCS:<br/>
<a href="http://cvs2svn.tigris.org/issues/show_bug.cgi?id=11"
>http://cvs2svn.tigris.org/issues/show_bug.cgi?id=11</a>
</li>
<li>RCS handles the "$Log$" keyword differently from CVS:<br/>
<a href="http://cvs2svn.tigris.org/issues/show_bug.cgi?id=29"
>http://cvs2svn.tigris.org/issues/show_bug.cgi?id=29</a>
</li>
</ul>
If you are having trouble in <tt>OutputPass</tt> of a
conversion when using the <tt>--use-rcs</tt> option, the first
thing to try is using the <tt>--use-cvs</tt> option instead.
</td>
</tr>
<tr>
<td align="right"><a name="use-cvs"><tt>--use-cvs</tt></a></td>
<td>If RCS <b><tt>co</tt></b> is having trouble extracting CVS
revisions, you may need to pass this flag, which causes cvs2svn
to use CVS instead of RCS to read the repository. See <a
href="#use-rcs"><tt>--use-rcs</tt></a> for more information.
</td>
</tr>
<tr>
<th colspan="2">
Environment options
</th>
</tr>
<tr>
<td align="right"><tt>--tmpdir=PATH</tt></td>
<td>Use the directory PATH for all of cvs2svn's temporary data
(which can be a <i>lot</i> of data). The default value is
<tt>cvs2svn-tmp</tt> in the current working directory.</td>
</tr>
<tr>
<td align="right"><tt>--svnadmin=PATH</tt></td>
<td>If the <tt>svnadmin</tt> program is not in your $PATH you
should specify its absolute path with this switch.
<tt>svnadmin</tt> is needed when the <tt>-s/--svnrepos</tt>
output option is used</td>
</tr>
<tr>
<td align="right"><tt>--co=PATH</tt></td>
<td>If the <tt>co</tt> program (a part of RCS) is not in your
$PATH you should specify its absolute path with this switch.
(<tt>co</tt> is needed if the <tt>--use-rcs</tt> extraction
option is used.)</td>
</tr>
<tr>
<td align="right"><tt>--cvs=PATH</tt></td>
<td>If the cvs program is not in your $PATH you should
specify its absolute path with this switch. (<tt>cvs</tt> is
needed if the <tt>--use-cvs</tt> extraction option is
used.)</td>
</tr>
<tr>
<th colspan="2">
Partial conversions
</th>
</tr>
<tr>
<td align="right"><tt>-p PASS</tt><br/><tt>--pass PASS</tt></td>
<td>Execute only pass PASS of the conversion. PASS can be
specified by name or by number (see <tt>--help-passes</tt>)</td>
</tr>
<tr>
<td align="right"><tt>-p [START]:[END]</tt><br/><tt>--passes [START]:[END]</tt></td>
<td>Execute passes START through END of the conversion
(inclusive). START and END can be specified by name or by number
(see <tt>--help-passes</tt>). If START or END is missing, it
defaults to the first or last pass, respectively.</td>
</tr>
<tr>
<th colspan="2">
Information options
</th>
</tr>
<tr>
<td align="right"><tt>--version</tt></td>
<td>Print the version number.</td>
</tr>
<tr>
<td align="right"><tt>--help</tt>, <tt>-h</tt></td>
<td>Print the usage message and exit with success.</td>
</tr>
<tr>
<td align="right"><tt>--help-passes</tt></td>
<td>Print the numbers and names of the conversion passes and exit
with success.</td>
</tr>
<tr>
<td align="right"><tt>--man</tt></td>
<td>Write the manpage for this program to standard output.</td>
</tr>
<tr>
<td align="right"><tt>--verbose</tt>, <tt>-v</tt></td>
<td>Tell cvs2svn to print lots of information about what
it's doing to STDOUT. This option can be specified twice to get
debug-level output.</td>
</tr>
<tr>
<td align="right"><tt>--quiet</tt>, <tt>-q</tt></td>
<td>Tell cvs2svn to operate in quiet mode, printing little more
than pass starts and stops to STDOUT. This option may be
specified twice to suppress all non-error output.</td>
</tr>
<tr>
<td align="right"><tt>--write-symbol-info=PATH</tt></td>
<td>Write symbol statistics and information about how symbols were
converted to PATH during CollateSymbolsPass. See
<tt>--symbol-hints</tt> for a description of the output
format.</td>
</tr>
<tr>
<td align="right"><tt>--skip-cleanup</tt></td>
<td>Prevent the deletion of the temporary files that cvs2svn
creates in the process of conversion.</td>
</tr>
<tr>
<td align="right"><tt>--profile</tt></td>
<td>Dump Python <a href="http://docs.python.org/library/profile.html"
>cProfile</a> profiling data to the file <tt>cvs2svn.cProfile</tt>.
In Python 2.4 and earlier, if cProfile is not installed, it will
instead dump <a href="http://docs.python.org/library/hotshot.html"
>Hotshot</a> profiling data to the file <tt>cvs2svn.hotshot</tt>.</td>
</tr>
</table>
<hr />
<h1><a name="examples">A Few Examples</a></h1>
<p>To create a new Subversion repository by converting an existing CVS
repository, run the script like this:</p>
<pre>
$ cvs2svn --svnrepos NEW_SVNREPOS CVSREPOS
</pre>
<p>To create a new Subversion repository containing only trunk commits,
and omitting all branches and tags from the CVS repository, do</p>
<pre>
$ cvs2svn --trunk-only --svnrepos NEW_SVNREPOS CVSREPOS
</pre>
<p>To create a Subversion dumpfile (suitable for 'svnadmin load') from
a CVS repository, run it like this:</p>
<pre>
$ cvs2svn --dumpfile DUMPFILE CVSREPOS
</pre>
<p>To use an options file to define all of the conversion parameters,
specify <tt>--options</tt>:</p>
<pre>
$ cvs2svn --options OPTIONSFILE
</pre>
<p>As it works, cvs2svn will create many temporary files in a
temporary directory called "cvs2svn-tmp" (or the directory specified
with <tt>--tmpdir</tt>). This is normal. If the entire conversion is
successful, however, those tempfiles will be automatically removed.
If the conversion is not successful, or if you specify the
'--skip-cleanup' option, cvs2svn will leave the temporary files behind
for possible debugging.</p>
</div>
</body>
</html>
|