Reputation: 12932
I have a user that has, up until today, been called foo.bar. Now that user will be known as fb instead from here on. But I would like to update all the old commits to reflect this username instead of the old one for statistical reasons etc. How can this be done?
I know about the syntax
svn propset --revprop -r revision_number svn:author your_username
But that would require a lot of manual labor. Is there an existing function or script that just takes the name to replace and the name to replace it with?
Update:
Here is a small script I made to handle this since I will be doing this on a lot of repos for a lot of users :) Just run it in the checked out repository folder of your choice. Note that error handling is at a minimum in the script.
https://github.com/inquam/svn-rename-author
Upvotes: 28
Views: 16650
Reputation: 17356
You can build a command to get the revisions in the log which old_username
has committed with:
svn log | grep "^r[0-9]* | old_username |" | cut -c 2- | awk '{print $1}'
This command gets the logs, searches for lines that appear at the start of each revision, drops the first character (i.e. the r
) from those lines and then takes the first remaining part of the line, which is the revision.
You can use this information in a variety of ways. In bash
you could make it produce the sequence of svn propset
commands with:
for f in `svn log | grep "^r[0-9]* | old_username |" | cut -c 2- | awk '{print $1}'`
do
svn propset --revprop -r $f svn:author your_username
done
which iterates over the values created by the first expression (now in backquotes) and uses those values for your svn propset
command, replacing the $f
with the appropriate revision value.
Upvotes: 22
Reputation: 39
Insert the following into your pre-revprop-change.bat (by opening it in notepad) in a folder called something like this (depending on your configuration) C:\ASP.NET Projecten\ProjectX\hooks
set magProperyWijzigen = false;
:: Only allow the log message and author to be changed.
if("%propertyName%" == "svn:author") magProperyWijzigen = true;
if("%propertyName%" == "svn:log") magProperyWijzigen = true;
if "%magProperyWijzigen%" == "false" goto ERROR_PROPNAME
Upvotes: 3
Reputation: 107040
I've tested this until the last system
command. (I didn't want to change my repository), but this Perl program should work:
#! /usr/bin/env perl
#
use strict;
use warnings;
use feature qw(say);
use autodie; #Don't have to test if open fails
use constant {
SVN => "svn",
REPOS => "http://source/src/myrepo",
OLD_NAME => "dbrown",
NEW_NAME => "db",
};
open (my $log, "-|", LOG_CMD);
while (my $line = <$log>) {
chomp $line;
#
# Is this a revision line?
#
while (my $line = <$log>) {
chomp $line;
next unless $line =~ /^r #Line starts with an "r"
(\d+) #Followed by digits (Capture)
\s\|\s #And a "|" separator
([^\|]+) #This should be the name (Capture)
\s+\| #And another separator
/x;
my $revision = $1;
my $author = $2;
next unless $author eq OLD_NAME;
#
# Found the Author
#
my $command = qq(@{[SVN]} -r $revision pset --revprop svn:author @{[NEW_NAME]});
my $error = system $command;
say STDERR qq(Couldn't modify revision $revision) if $error;
}
Upvotes: 1
Reputation: 97282
svnadmin dump
svnadmin load
edited dataUpvotes: -6