Wally Lawless
Wally Lawless

Reputation: 7557

Is there a way to change a SVN users username through the entire repository history?

When my team first started out with SVN we all just used our first names when committing to the repository, however, now that our team has grown, we are running into issues because we just hired a second Mike.

What we would like to do is change everybody's usernames to be the same as the username on their computer (first name initial + last name). The issue that I'm seeing is that the SVN history will still show the old usernames on commits.

Is there a tool out there for changing usernames throughout the entire history of a repository?

For example, I would like every commit that is currently attributed to Mike to change to msmith, all the way back to revision 1.

My first thought is that I'll have to do some parsing and processing on a dump file, but a tool would be nice.

Upvotes: 18

Views: 10881

Answers (7)

Greg
Greg

Reputation: 12837

On the repository server, you can:

echo -n "msmith" > msmith.txt
svn log /svn -q | grep '^r[0-9]* | Mike |' | cut -f 1 -d' ' | xargs -n1 svnadmin setrevprop /svn svn:author msmith.txt -r

Here's what that's doing:

  1. Store the new username in a file with no newline at the end (echo -n)
  2. Get the full log for the repository in /svn, displaying only the summary info (not the log message) (svn log -q)
  3. Find lines with Mike (grep). Note: in most cases, something like grep Mike would do just fine, but if you had a user named Jul, you risk updating every commit made in July (more or less risk depending on your locale)
  4. Filter out everything except the first field (the revision #) (cut)
  5. Run a svnadmin command on every revision found in step 4 (xargs). Only pass one revision per execution of the command (-n1). That will replace the svn:author property with the contents of the msmith.txt file.

Upvotes: 7

Steffen Opel
Steffen Opel

Reputation: 64741

TortoiseSVN has excellent support for this functionality: within its Revision Log Dialog one can filter by author (even via regular expressions), select revisions from the filtered list as desired (usually all like in this question) and select 'Edit author' from the context menu.

The pre condition of having a pre-revprop-change hook in place as mentioned in jeroenhs answer does still apply, of course.

The processing is rather slow, but depending on ones needs this might still be much faster and/or more convenient then having to dump an entire repository and process these potentially huge dump file(s) with scripts.

Upvotes: 13

Jason McVetta
Jason McVetta

Reputation: 1419

You can use svndumptool:

svnadmin dump path/to/my/repo > repo.dump

svndumptool transform-revprop svn:author originalregexp newvalue repo.dump newrepo.dump

Upvotes: 21

Wally Lawless
Wally Lawless

Reputation: 7557

It took a lot of looking but I eventually found a perl script that works against an SVN dump file.

I tried it this morning on a dump of my repository and it worked flawlessly.

Here is the direct link

Upvotes: 2

jeroenh
jeroenh

Reputation: 26782

yes there is:

svn propset --revprop -r revision_number svn:author new_username

However, svn does not allow changing revision properties by default. You need to set up a pre-revprop-change hook script for that. On windows, it suffices to put a bat-file in the hooks folder of your repository that simply contains one line:

exit 0

If that is set up, you should be able to write a script for your needs.

EDIT: I didn't test this through, but I think this should do the trick in PowerShell:

([xml] ( svn log --xml )).log.logentry 
   | ? {$_.author -eq "Mike"} 
   | foreach {svn propset --revprop -r $_.revision svn:author msmith}

Upvotes: 12

HowdyHowdyHowdy
HowdyHowdyHowdy

Reputation: 1211

In Thunder Below, the story of the USS Barb in WWII, a new officer comes aboard. The Captain asks him his name. "Mike", he responds. "Nope, we already have a Mike", says the Captain. "We'll call you Robert. In combat, when I call out orders, there can be no confusion about who I'm talking to."

What I'm getting at is that there's precedent for making your new Mike choose another name.

Upvotes: 3

Morten Siebuhr
Morten Siebuhr

Reputation: 6108

From memory, the standard SVN answer to change anything in the history is to do a text dump of the database, search-replace through it and re-create the database from that.

But I haven't really looked at the internals of SVN since its 0.x-days, so I might be off...

Upvotes: -2

Related Questions