Rsync, subversion and directories
Wayne Davison
wayned at samba.org
Sun Nov 13 16:25:06 GMT 2005
On Fri, Nov 11, 2005 at 04:20:09PM +1100, Andrew Crouch wrote:
> Reading the short description of "--force", it appears this flag
> should do the trick - further investigation reveals this is not quite
> so.
The --force option doesn't do anything extra if --delete was already
specified (--force would allow a file to replace a directory without
the --delete option). When you tell rsync to protect some files,
rsync will not remove the containing directory that holds the protected
files.
> Furthermore, the output of the "-v" flag doesn't imply that the
> directory can be deleted, except when doing a dry run:
Yes, because --dry-run is not smart enough to know that the directory's
deletion is being prevented by the preservation of some excluded
content.
> I was wondering, short of moving the subversion server to the source
> machine, or running rsync twice and doing some output matching, how
> this might be accomplished?
You could always run a simple perl script on the resulting dirs and let
it remove any directory that only contains a .svn dir (which would allow
you to run an svn delete command at that time). For instance, this
script finds these empty dirs and runs "rm -rf" on them:
#!/usr/bin/perl
use strict;
my %dirs;
open(IN, 'find /dest/path/foo |') or die $!;
while (<IN>) {
next if m#/.svn/#;
chomp;
my($path, $name) = m#^(.*)/([^/]+)$#;
if ($name eq '.svn') {
$dirs{$path} += 0;
} else {
$dirs{$path}++;
}
print "$path = $dirs{$path}\n";
}
foreach (reverse sort keys %dirs) {
if ($dirs{$_} == 0) {
system "rm -rf '$_'";
# Handle a nested sequence of dirs going empty.
my($path) = m#^(.*)/#;
$dirs{$path}--;
}
}
..wayne..
More information about the rsync
mailing list