mirror of
https://github.com/opnsense/src.git
synced 2026-04-26 00:27:08 -04:00
907 lines
27 KiB
HTML
907 lines
27 KiB
HTML
|
|
<!--
|
||
|
|
|
||
|
|
Licensed to the Apache Software Foundation (ASF) under one
|
||
|
|
or more contributor license agreements. See the NOTICE file
|
||
|
|
distributed with this work for additional information
|
||
|
|
regarding copyright ownership. The ASF licenses this file
|
||
|
|
to you under the Apache License, Version 2.0 (the
|
||
|
|
"License"); you may not use this file except in compliance
|
||
|
|
with the License. You may obtain a copy of the License at
|
||
|
|
|
||
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
|
||
|
|
Unless required by applicable law or agreed to in writing,
|
||
|
|
software distributed under the License is distributed on an
|
||
|
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
|
|
KIND, either express or implied. See the License for the
|
||
|
|
specific language governing permissions and limitations
|
||
|
|
under the License.
|
||
|
|
|
||
|
|
-->
|
||
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||
|
|
"http://www.w3.org/TR/html4/strict.dtd">
|
||
|
|
<html>
|
||
|
|
<head>
|
||
|
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
|
||
|
|
<title>CVS to SVN Crossover Guide</title>
|
||
|
|
<style type="text/css">
|
||
|
|
body {
|
||
|
|
font-family: sans-serif;
|
||
|
|
}
|
||
|
|
h1 {
|
||
|
|
text-align: center;
|
||
|
|
}
|
||
|
|
h2 {
|
||
|
|
background: #b0c0f0;
|
||
|
|
margin: 0;
|
||
|
|
}
|
||
|
|
.h2 {
|
||
|
|
border-left: 4px #b0c0f0 solid;
|
||
|
|
margin-bottom: 2em;
|
||
|
|
}
|
||
|
|
hr {
|
||
|
|
height: 1px;
|
||
|
|
width: 80%;
|
||
|
|
}
|
||
|
|
p, h3, dl {
|
||
|
|
padding-left: 1em;
|
||
|
|
}
|
||
|
|
dd {
|
||
|
|
margin-left: 2em;
|
||
|
|
}
|
||
|
|
.sidebyside {
|
||
|
|
padding: 0 2em;
|
||
|
|
width: 100%;
|
||
|
|
font-size: 80%;
|
||
|
|
}
|
||
|
|
.sidebyside th, .sidebyside td {
|
||
|
|
width: 50%;
|
||
|
|
border-width: 0 1px 2px 0;
|
||
|
|
border-style: solid;
|
||
|
|
border-color: black;
|
||
|
|
background: #b0c0f0;
|
||
|
|
vertical-align: top;
|
||
|
|
}
|
||
|
|
.sidebyside th {
|
||
|
|
text-align: center;
|
||
|
|
background: #90a0d0;
|
||
|
|
}
|
||
|
|
.bookref {
|
||
|
|
font-size: 80%;
|
||
|
|
}
|
||
|
|
</style>
|
||
|
|
</head>
|
||
|
|
|
||
|
|
<body>
|
||
|
|
|
||
|
|
<h1>CVS to SVN Crossover Guide</h1>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2>Purpose</h2>
|
||
|
|
|
||
|
|
<p>This document provides an alternate method of learning Subversion.
|
||
|
|
Many users dislike learning new technology via a theoretical "top
|
||
|
|
down" approach, as provided by the <a
|
||
|
|
href="http://svnbook.red-bean.com">Subversion Book</a>. Instead,
|
||
|
|
this document presents Subversion from the "bottom up": it shows a
|
||
|
|
CVS command or task, and then shows the equivalent task in
|
||
|
|
Subversion (along with relevant book links.) It's essentially a
|
||
|
|
re-indexing of topics covered by the book, keyed on CVS tasks.</p>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2>Table of Contents</h2>
|
||
|
|
|
||
|
|
<h3>Setup</h3>
|
||
|
|
<ul>
|
||
|
|
<li><a href="#repos_creation">Repository creation</a></li>
|
||
|
|
<li><a href="#import">Importing data</a></li>
|
||
|
|
<li><a href="#installing">Installing a server</a></li>
|
||
|
|
<li><a href="#authenticating">Authenticating to a server</a></li>
|
||
|
|
<li><a href="#browsing">Browsing a repository</a></li>
|
||
|
|
<li><a href="#checkingout">Checking out a working copy</a></li>
|
||
|
|
</ul>
|
||
|
|
|
||
|
|
<h3>Basic Work Cycle</h3>
|
||
|
|
<ul>
|
||
|
|
<li><a href="#changeditems">Seeing locally changed items</a></li>
|
||
|
|
<li><a href="#outofdate">Seeing out-of-date items</a></li>
|
||
|
|
<li><a href="#scheduling">Scheduling additions or deletions</a></li>
|
||
|
|
<li><a href="#copying">Copying and moving</a></li>
|
||
|
|
<li>Undoing local changes</li>
|
||
|
|
<li>Updating and committing</li>
|
||
|
|
<li>Resolving conflicts</li>
|
||
|
|
<li>Adding a binary file</li>
|
||
|
|
<li>Using native line-endings</li>
|
||
|
|
</ul>
|
||
|
|
|
||
|
|
<h3>Examining history</h3>
|
||
|
|
<ul>
|
||
|
|
<li>Seeing history of an item</li>
|
||
|
|
<li>Comparing two versions of an item</li>
|
||
|
|
</ul>
|
||
|
|
|
||
|
|
<h3>Branching/Tagging/Merging</h3>
|
||
|
|
<ul>
|
||
|
|
<li>Creating a branch</li>
|
||
|
|
<li>Moving a working copy to a branch</li>
|
||
|
|
<li>Finding the beginning of a branch</li>
|
||
|
|
<li>Porting a single change</li>
|
||
|
|
<li>Merging a whole branch</li>
|
||
|
|
<li>Reverting a committed change</li>
|
||
|
|
<li>Resurrecting deleted items</li>
|
||
|
|
<li>Creating a tag</li>
|
||
|
|
<li>Tweaking a tag</li>
|
||
|
|
<li>Seeing all tags</li>
|
||
|
|
<li>Comparing two tags</li>
|
||
|
|
<li>Seeing logs between two tags</li>
|
||
|
|
</ul>
|
||
|
|
|
||
|
|
<h3>Other tasks</h3>
|
||
|
|
<ul>
|
||
|
|
<li>Using modules</li>
|
||
|
|
<li>Line endings and keywords</li>
|
||
|
|
</ul>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="repos_creation">Repository creation</h2>
|
||
|
|
|
||
|
|
<p>Create a new repository for holding versioned data.</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ cvs -d /usr/local/repos init</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
<dd>Creates a new directory <tt>repos</tt> ready to hold RCS
|
||
|
|
files and config scripts.</dd>
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ svnadmin create /usr/local/repos</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
<dd>Creates a new directory <tt>repos</tt> containing BerkeleyDB
|
||
|
|
files and config scripts.</dd>
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch05s02.html">Repository Creation and Configuration</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="import">Importing data</h2>
|
||
|
|
|
||
|
|
<p>Populate a new repository with initial data. Assuming that you
|
||
|
|
have a tree of code in the local directory <tt>myproj/</tt>, and
|
||
|
|
you want to move this tree into the repository.</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ cd myproj</tt></dd>
|
||
|
|
<dd><tt>$ cvs -d /usr/local/repos import myproj/ none start</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>This copies the contents of the current working directory to
|
||
|
|
a new directory (<tt>myproj</tt>) in the CVS repository. The
|
||
|
|
CVS repository now contains a directory <tt>/myproj/</tt> at the
|
||
|
|
top level.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ svn mkdir file:///usr/local/repos/tags</tt></dd>
|
||
|
|
<dd><tt>$ svn mkdir file:///usr/local/repos/branches</tt></dd>
|
||
|
|
<dd><tt>$ svn import myproj/ file:///usr/local/repos/trunk</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Though not strictly required, we deliberately create
|
||
|
|
<tt>/tags</tt> and <tt>/branches</tt> top-level directories in
|
||
|
|
the repository, to hold tags and branches later on. Then we
|
||
|
|
import the contents of the local <tt>myproj/</tt> directory into
|
||
|
|
a newly created <tt>/trunk</tt> directory in the
|
||
|
|
repository.</dd>
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch05s04.html#svn-ch-5-sect-6.1">Choosing a repository layout</a></dd>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re12.html">svn import</a></dd>
|
||
|
|
</dl>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="installing">Installing a server</h2>
|
||
|
|
|
||
|
|
<p>Make the repository available to clients via a network.</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd>(too complex to demonstrate here)</dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
<dd>Export the repository via the cvs <em>pserver</em> program.
|
||
|
|
It can be launched by either <strong>inetd</strong> or a
|
||
|
|
client's <strong>ssh</strong> remote request.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd>(too complex to demonstrate here)</dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
<dd>Export the repository with the <em>Apache 2.0.x</em> server,
|
||
|
|
or via the <em>svnserve</em> program. The latter can run as a
|
||
|
|
standalone daemon, can be launched by <strong>inetd</strong>, or
|
||
|
|
invoked by a client's <strong>ssh</strong> remote request.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch06.html">Server configuration</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="authenticating">Authenticating to a server</h2>
|
||
|
|
|
||
|
|
<p>Have a network client prove its identity to a version
|
||
|
|
control server.</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ cvs -d :pserver:user@host:/repos <em>command</em>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>When contacting a repository, the client pre-emptively
|
||
|
|
"pushes" its authentication credentials at the server.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ svn <em>command</em> <em>URL</em>…</tt></dd>
|
||
|
|
<dd><tt>Password for 'user': XXXXXXX</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>The client's authentication credentials are "pulled" from
|
||
|
|
the user interactively, and only when the server deems that a
|
||
|
|
challenge needs to be made. (And contrary to popular belief,
|
||
|
|
the <tt>--username</tt> and <tt>--password</tt> options are
|
||
|
|
merely values to be used <em>if</em> the server issues a
|
||
|
|
challenge; they do not "push" the credentials at the
|
||
|
|
server.)</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch06s02.html">Network Model</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="browsing">Browsing a repository</h2>
|
||
|
|
|
||
|
|
<p>Browse the repository as a filesystem, perusing file
|
||
|
|
contents and history as well (older versions of files or
|
||
|
|
trees.)</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd>(not possible with commandline client)</dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Not possible with commandline client. A third-party web
|
||
|
|
server tool such as ViewCVS must be used.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ svn list <em>URL</em> [-r <em>rev</em>] [-v]</tt></dd>
|
||
|
|
<dd><tt>$ svn cat <em>URL</em> [-r <em>rev</em>]</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>The <tt>svn list</tt> and <tt>svn cat</tt> commands allow
|
||
|
|
interactive browsing of a repository (and all previous states of
|
||
|
|
a repository) from the commandline. (The <tt>--verbose [-v]</tt>
|
||
|
|
switch displays full listing information.) If Apache is being
|
||
|
|
used as a Subversion server process (i.e. clients access via
|
||
|
|
<strong>http://</strong>), then the latest version of the
|
||
|
|
repository can be directly browsed by entering <em>URL</em> into
|
||
|
|
any web browser. Additionally, a third-party web server tool
|
||
|
|
(such as ViewCVS) can be used with Subversion.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re14.html">svn list</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="checkingout">Checking out a working copy</h2>
|
||
|
|
|
||
|
|
<p>Create a workspace on local disk which mirrors a directory
|
||
|
|
in the repository.</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ cvs -d /usr/local/repos checkout myproj</tt></dd>
|
||
|
|
<dd><tt>U myproj/foo.c</tt></dd>
|
||
|
|
<dd><tt>U myproj/bar.c</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Creates a local directory <tt>myproj</tt> which is a mirror
|
||
|
|
of the repository directory <tt>/myproj</tt>.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ svn checkout file:///usr/local/repos/trunk myproj</tt></dd>
|
||
|
|
<dd><tt>A myproj/foo.c</tt></dd>
|
||
|
|
<dd><tt>A myproj/bar.c</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Assuming that the original project data was imported into
|
||
|
|
the repository <tt>/trunk</tt> directory, this creates a local
|
||
|
|
directory <tt>myproj</tt> which is a mirror of the repository
|
||
|
|
directory <tt>/trunk</tt>. Standard Subversion convention is to
|
||
|
|
do "mainline" development in <tt>/trunk</tt>. See branching and
|
||
|
|
tagging sections for more details.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch03s04.html">Initial Checkout</a></dd>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re04.html">svn checkout</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="changeditems">Seeing locally changed items</h2>
|
||
|
|
|
||
|
|
<p>Discover which items in the working copy have local
|
||
|
|
modifications or are scheduled for addition/deletion.</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ cvs status</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
<dd><tt>File: baz.c Status: Up-to-date</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
<dd><tt>$ cvs update</tt></dd>
|
||
|
|
<dd><tt>M foo.c</tt></dd>
|
||
|
|
<dd><tt>U bar.c</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>The <tt>cvs status</tt> command shows whether a file is
|
||
|
|
locally modified or out of date, including information about
|
||
|
|
working revision and branch info. Unfortunately, because the
|
||
|
|
output is so verbose and hard to read, many users run <tt>cvs
|
||
|
|
update</tt> instead, which shows a more compact listing of
|
||
|
|
modified files (and of course, it also causes the server to
|
||
|
|
merge changes into your working copy.)</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ svn status</tt></dd>
|
||
|
|
<dd><tt>M foo.c</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Shows modified files only. Very fast, as it does not use
|
||
|
|
the network. Does not update your working copy, yet still shows
|
||
|
|
a single-line display, much like <tt>svn update</tt>. To see
|
||
|
|
working revision and branch information, run <tt>svn info</tt>.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.3.1">Examine Your Changes</a></dd>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re26.html">svn status</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="outofdate">Seeing out-of-date items</h2>
|
||
|
|
|
||
|
|
<p>Discover which items in the working copy are out-of-date
|
||
|
|
(i.e. newer versions exist in the repository.)</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ cvs status</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
<dd><tt>File: baz.c Status: Needs Patch</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
<dd><tt>$ cvs -n update</tt></dd>
|
||
|
|
<dd><tt>M foo.c</tt></dd>
|
||
|
|
<dd><tt>U bar.c</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>The <tt>cvs status</tt> command shows whether a file is
|
||
|
|
locally modified or out of date, including information about
|
||
|
|
working revision and branch info. A less verbose option is to
|
||
|
|
run <tt>cvs -n update</tt> instead, which shows a compact
|
||
|
|
listing of both out-of-date and locally modified files, without
|
||
|
|
actually updating the working copy.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ svn status -u</tt></dd>
|
||
|
|
<dd><tt>M 46 foo.c</tt></dd>
|
||
|
|
<dd><tt>M * 46 bar.c</tt></dd>
|
||
|
|
<dd><tt> * 46 baz.c</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Shows modified files (<tt>M</tt>) as well as out-of-date
|
||
|
|
files (<tt>*</tt>). Contacts repository, but doesn't modify the
|
||
|
|
working copy. To see working revision and branch information,
|
||
|
|
run <tt>svn info</tt>.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.3.1">Examine Your Changes</a></dd>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re26.html">svn status</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="scheduling">Scheduling additions or deletions</h2>
|
||
|
|
|
||
|
|
<p>Schedule a working-copy file or directory to be added or
|
||
|
|
removed from the repository.</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ touch foo.c</tt></dd>
|
||
|
|
<dd><tt>$ cvs add foo.c</tt></dd>
|
||
|
|
<dd><tt>cvs server: scheduling file `blah' for addition</tt></dd>
|
||
|
|
<dd><tt>cvs server: use 'cvs commit' to add this file permanently</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ mkdir new-dir</tt></dd>
|
||
|
|
<dd><tt>$ cvs add new-dir</tt></dd>
|
||
|
|
<dd><tt>Directory new-dir added to the repository</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ rm bar.c</tt></dd>
|
||
|
|
<dd><tt>$ cvs rm bar.c</tt></dd>
|
||
|
|
<dd><tt>cvs remove: scheduling `bar.c' for removal</tt></dd>
|
||
|
|
<dd><tt>cvs remove: use 'cvs commit' to remove this file permanently</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ rm -rf old-dir/*</tt></dd>
|
||
|
|
<dd><tt>$ cvs rm old-dir</tt></dd>
|
||
|
|
<dd><tt>cvs remove: Removing 3bits</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Schedules a file or directory for addition or removal
|
||
|
|
to/from the repository. The repository will not be changed
|
||
|
|
until the user runs <tt>cvs commit</tt>, except for the case of
|
||
|
|
adding a directory, which immediately changes the repository.
|
||
|
|
Also, directories cannot be truly removed from the repository,
|
||
|
|
just emptied out. (<tt>cvs update -P</tt> will prune empty
|
||
|
|
directories from your working copy.)</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ touch foo.c</tt></dd>
|
||
|
|
<dd><tt>$ svn add foo.c</tt></dd>
|
||
|
|
<dd><tt>A foo.c</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ mkdir new-dir</tt></dd>
|
||
|
|
<dd><tt>$ svn add new-dir</tt></dd>
|
||
|
|
<dd><tt>A new-dir</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ svn rm bar.c</tt></dd>
|
||
|
|
<dd><tt>D bar.c</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ svn rm old-dir</tt></dd>
|
||
|
|
<dd><tt>D old-dir/file1</tt></dd>
|
||
|
|
<dd><tt>D old-dir/file2</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Schedules a file or directory for addition or removal
|
||
|
|
to/from the repository. The repository will not be changed
|
||
|
|
until the user runs <tt>svn commit</tt>. The scheduled
|
||
|
|
operations are shown as <tt>A</tt> or <tt>D</tt> by <tt>svn
|
||
|
|
status</tt>, and <tt>svn revert</tt> can un-do the scheduling.
|
||
|
|
Directories really can be deleted (though as with all deleted
|
||
|
|
items, continues to exist in history.)</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.2">Make Changes to Your Working Copy</a></dd>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re01.html">svn add</a></dd>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re08.html">svn delete</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2 id="copying">Copying and moving</h2>
|
||
|
|
|
||
|
|
<p>Copy or move/rename a file or directory.</p>
|
||
|
|
|
||
|
|
<table class="sidebyside">
|
||
|
|
<tr>
|
||
|
|
<th>CVS</th>
|
||
|
|
<th>Subversion</th>
|
||
|
|
</tr>
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd>(not possible.)</dd>
|
||
|
|
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>Not possible, unless an administrator directly mucks with
|
||
|
|
RCS files in the repository. (And in that case, no history
|
||
|
|
records the act of copying or renaming.)</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
<td>
|
||
|
|
<dl>
|
||
|
|
<dt>Commands:</dt>
|
||
|
|
<dd><tt>$ svn copy foo.c foo2.c</tt></dd>
|
||
|
|
<dd><tt>A foo2.c</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ svn copy dir dir2</tt></dd>
|
||
|
|
<dd><tt>A dir2</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ svn move bar.c baz.c</tt></dd>
|
||
|
|
<dd><tt>A baz.c</tt></dd>
|
||
|
|
<dd><tt>D bar.c</tt></dd>
|
||
|
|
<dd><tt> </tt></dd>
|
||
|
|
<dd><tt>$ svn move dirA dirB</tt></dd>
|
||
|
|
<dd><tt>A dirB</tt></dd>
|
||
|
|
<dd><tt>D dirA/file1</tt></dd>
|
||
|
|
<dd><tt>D dirA/file2</tt></dd>
|
||
|
|
<dd><tt>…</tt></dd>
|
||
|
|
|
||
|
|
<dt>Explanation:</dt>
|
||
|
|
|
||
|
|
<dd>The <tt>svn copy</tt> command schedules a file or directory
|
||
|
|
for addition to the repository, recording the "source" of the
|
||
|
|
copy. After committing, <tt>svn log</tt> on the copied item
|
||
|
|
will trace history back through the original copy-source. The
|
||
|
|
<tt>svn move</tt> command is exactly equivalent to running
|
||
|
|
<tt>svn copy</tt>, followed by an <tt>svn delete</tt> on the
|
||
|
|
copy-source: the result is a new item scheduled for addition
|
||
|
|
(with copy-history attached) and the original item scheduled for
|
||
|
|
deletion.</dd>
|
||
|
|
|
||
|
|
</dl>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
</table>
|
||
|
|
|
||
|
|
<dl class="bookref">
|
||
|
|
<dt>Book References:</dt>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.2">Make Changes to Your Working Copy</a></dd>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re07.html">svn copy</a></dd>
|
||
|
|
<dd><a href="http://svnbook.red-bean.com/svnbook/re18.html">svn move</a></dd>
|
||
|
|
</dl>
|
||
|
|
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2>Finding the beginning of a branch</h2>
|
||
|
|
|
||
|
|
<p>If you're attempting to merge an entire branch into another, you
|
||
|
|
need to compare the "root" and "tip" of the source branch, and then
|
||
|
|
merge those differences into a working copy of the target branch.
|
||
|
|
Obviously the "tip" of the branch can be represented by using the
|
||
|
|
<tt>HEAD</tt> keyword. But how do you find the "birth" revision of
|
||
|
|
the source branch?</p>
|
||
|
|
|
||
|
|
<p>The easiest solution is to run</p>
|
||
|
|
|
||
|
|
<pre>
|
||
|
|
$ svn log -v --stop-on-copy source-branch-URL
|
||
|
|
…
|
||
|
|
</pre>
|
||
|
|
|
||
|
|
<p>This command will display every change ever made to the branch, but
|
||
|
|
<tt>--stop-on-copy</tt> option will cause the output to stop as soon
|
||
|
|
as detects a copy operation in the branch's history. By definition,
|
||
|
|
then, the very last log entry printed will show the copy being made.
|
||
|
|
It will look something like:</p>
|
||
|
|
|
||
|
|
<pre>
|
||
|
|
r9189 | joe | 2004-03-22 10:10:47 -0600 (Mon, 22 Mar 2004) | 1 line
|
||
|
|
Changed paths:
|
||
|
|
A /branches/mybranch (from /trunk:9188)
|
||
|
|
</pre>
|
||
|
|
|
||
|
|
<p>In this case, you would then know to compare revisions 9189 and
|
||
|
|
HEAD of the branch in order to perform the merge:</p>
|
||
|
|
|
||
|
|
<pre>
|
||
|
|
$ svn merge -r9189:HEAD source-branch-URL target-branch-WC
|
||
|
|
…
|
||
|
|
</pre>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2>Seeing all of a project's tags</h2>
|
||
|
|
|
||
|
|
<p>Assuming you've been following a consistent policy for creating
|
||
|
|
tag-copies, then this is just a matter of running <tt>svn ls</tt> on a
|
||
|
|
directory containing your tags. Typically you would run it on the
|
||
|
|
<tt>/tags</tt> directory in your repository, although you're certainly
|
||
|
|
free to organize this directory in a more complex way, or invent a
|
||
|
|
different convention altogether.</p>
|
||
|
|
|
||
|
|
<p>As an example, you can see all of Subversion's tags by running:</p>
|
||
|
|
|
||
|
|
<pre>
|
||
|
|
$ svn ls --verbose http://svn.apache.org/repos/asf/subversion/tags
|
||
|
|
…
|
||
|
|
7739 kfogel Nov 13 22:05 0.33.0/
|
||
|
|
7796 josander Nov 18 12:15 0.33.1/
|
||
|
|
7932 josander Dec 03 17:54 0.34.0/
|
||
|
|
8045 josander Dec 19 15:13 0.35.0/
|
||
|
|
8063 josander Dec 20 11:20 0.35.1/
|
||
|
|
8282 josander Jan 13 14:15 0.36.0/
|
||
|
|
8512 josander Jan 24 17:31 0.37.0/
|
||
|
|
8810 kfogel Feb 23 03:44 1.0.0/
|
||
|
|
…
|
||
|
|
</pre>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2>Seeing the differences between two tags</h2>
|
||
|
|
|
||
|
|
<p>Just use <tt>svn diff</tt> in its fully expanded form, which
|
||
|
|
compares any two URLs:</p>
|
||
|
|
|
||
|
|
<pre>
|
||
|
|
$ svn diff tagURL1 tagURL2
|
||
|
|
…
|
||
|
|
</pre>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2>Seeing logs between two tags</h2>
|
||
|
|
|
||
|
|
<p>This is a somewhat common practice in CVS, and is doable in Subversion,
|
||
|
|
but requires a little bit more work. Assuming that you've made two
|
||
|
|
tags of <tt>/trunk</tt> at different points in time, the ultimate goal
|
||
|
|
here is to run </p>
|
||
|
|
|
||
|
|
<pre>
|
||
|
|
$ svn log -rX:Y trunkURL
|
||
|
|
</pre>
|
||
|
|
|
||
|
|
<p>…where X and Y are the revisions from which the two tags were
|
||
|
|
copied. To discover X and Y, you can use the same technique
|
||
|
|
described in the previous section ("finding the beginning of a
|
||
|
|
branch".) Just use the <tt>--stop-on-copy</tt> option when logging the
|
||
|
|
history of each tag. No commits happen on tag directories, so the
|
||
|
|
following commands should each produce exactly <em>one</em> log
|
||
|
|
entry:</p>
|
||
|
|
|
||
|
|
<pre>
|
||
|
|
$ svn log -v --stop-on-copy tag1-URL
|
||
|
|
|
||
|
|
r3520 | joe | 2004-03-12 15:28:43 -0600 (Fri, 12 Mar 2004) | 1 line
|
||
|
|
…
|
||
|
|
|
||
|
|
$ svn log -v --stop-on-copy tag2-URL
|
||
|
|
a
|
||
|
|
r4177 | joe | 2004-03-12 15:28:43 -0600 (Fri, 12 Mar 2004) | 1 line
|
||
|
|
…
|
||
|
|
</pre>
|
||
|
|
|
||
|
|
<p>So in this example, the values of X and Y are 3520 and 4177. Now
|
||
|
|
you can view all <tt>/trunk</tt> changes between those two points in time:</p>
|
||
|
|
|
||
|
|
<pre>
|
||
|
|
$ svn log -r3520:4177 trunkURL
|
||
|
|
…
|
||
|
|
</pre>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2>Fixing an incorrect tag</h2>
|
||
|
|
|
||
|
|
<p>If your tag is a bit off, you can "adjust" it just as people often
|
||
|
|
do in CVS. Simply check out a working copy of the tag directory, make
|
||
|
|
any changes you wish, and commit.</p>
|
||
|
|
|
||
|
|
<p>Remember, because branches and tags are directories, they can also
|
||
|
|
be deleted when they're no longer of any use to your project. They'll
|
||
|
|
continue to exist in the repository's history.</p>
|
||
|
|
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
<div class="h2">
|
||
|
|
<h2>Creating/using "modules"</h2>
|
||
|
|
|
||
|
|
<p>Compare CVS Modules vs. svn:externals.</p>
|
||
|
|
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<!-- ==================================================================== -->
|
||
|
|
</body>
|
||
|
|
</html>
|