This section is from the "Version Control with Subversion" book, by Ben Collins-Sussman, Brian W. Fitzpatrick and C. Michael Pilato. Also available from Amazon: Version Control with Subversion.
The visual grouping that Harry sees in the output of
svn status as shown in our previous section
is nice, but not entirely useful. The
status command is but one of many
operations that he might wish to perform on his working copy.
Fortunately, many of Subversion's other operations understand
how to operate on changelists via the use of the
--changelist option.
When provided with a --changelist option,
Subversion commands will limit the scope of their operation to
only those files to which a particular changelist name is
assigned. If Harry now wants to see the actual changes he's
made to the files in his math-fixes
changelist, he could explicitly list only
the files that make up that changelist on the svn
diff command line.
$ svn diff integer.c mathops.c Index: integer.c =================================================================== --- integer.c (revision 1157) +++ integer.c (working copy) … Index: mathops.c =================================================================== --- mathops.c (revision 1157) +++ mathops.c (working copy) … $
That works okay for a few files, but what if Harry's change touched 20 or 30 files? That would be an annoyingly long list of explicitly named files. Now that he's using changelists, though, Harry can avoid explicitly listing the set of files in his changelist from now on, and instead provide just the changelist name:
$ svn diff --changelist math-fixes Index: integer.c =================================================================== --- integer.c (revision 1157) +++ integer.c (working copy) … Index: mathops.c =================================================================== --- mathops.c (revision 1157) +++ mathops.c (working copy) … $
And when it's time to commit, Harry can again use the
--changelist option to limit the scope of the
commit to files in a certain changelist. He might commit his
user interface fix by doing the following:
$ svn ci -m "Fix a UI bug found while working on math logic." \
--changelist ui-fix
Sending button.c
Transmitting file data .
Committed revision 1158.
$
In fact, the svn commit command
provides a second changelists-related option:
--keep-changelists. Normally, changelist
assignments are removed from files after they are committed.
But if --keep-changelists is provided,
Subversion will leave the changelist assignment on the
committed (and now unmodified) files. In any case, committing
files assigned to one changelist leaves other changelists
undisturbed.
$ svn status --- Changelist 'math-fixes': M integer.c M mathops.c $
The --changelist option acts only as a
filter for Subversion command targets, and will not add
targets to an operation. For example, on a commit operation
specified as svn commit /path/to/dir, the
target is the directory /path/to/dir
and its children (to infinite depth). If you then add a
changelist specifier to that command, only those files in
and under /path/to/dir that are
assigned that changelist name will be considered as targets
of the commit—the commit will not include files
located elsewhere (such is in
/path/to/another-dir), regardless of
their changelist assignment, even if they are part of the
same working copy as the operation's target(s).
Even the svn changelist command accepts
the --changelist option. This allows you to
quickly and easily rename or remove a changelist:
$ svn changelist math-bugs --changelist math-fixes --depth infinity svn: warning: Removing 'integer.c' from changelist 'math-fixes'. Path 'integer.c' is now a member of changelist 'math-bugs'. svn: warning: Removing 'mathops.c' from changelist 'math-fixes'. Path 'mathops.c' is now a member of changelist 'math-bugs'. $ svn changelist --remove --changelist math-bugs --depth infinity Path 'integer.c' is no longer a member of a changelist. Path 'mathops.c' is no longer a member of a changelist. $
Finally, you can specify multiple instances of the
--changelist option on a single command
line. Doing so limits the operation you are performing to
files found in any of the specified changesets.