Category Archives: SVN

Eclipse Subversive SVN+SSH and Putty Agent (pageant)

I’m using Subversive within Eclipse to provide SVN support. But since I’m now using SVN+SSH as connection mechanism to SVN, I wanted to use my SSH Key to do the authentication for me. It took me some time to find out (find with google ;) how I could get this to work. I ended up on another blog which contained a working explanation on how to get it to work.

You need to create an environment variable called “SVN_SSH” that points to an executable file that accepts the same command line arguments as ssh on unix. I did this by doing the following:-

  1. Set up ssh keys. Not going to cover that here as you can easily Google for that. You need to end up with your public key on the SVN server and your private key loaded into Paegent locally.
  2. Download and installed the excellent TortoiseSVN client for Windows.
  3. Set the following environment variable (by right-clicking on My Computer, Properties, Advanced, Environment Variables, New):-

    Variable name:
    SVN_SSH
    Variable value:
    C:\\Program Files\\TortoiseSVN\\bin\\TortoisePlink.exe

    (The “\\” is very important, otherwise it won’t work. Equally, you cannot use the plink.exe that comes with putty as that fires up a command shell window which is really annoying. The TortoisePlink.exe is a windows implementation of plink that doesn’t bring up any UI)
  4. Configure the Subclipse plugin to use JavaHL (JNI)
  5. Restart Eclipse
  6. Do a little victory jig (optional)

Yes the \\ is really needed, don’t (yet) understand why, but it works.

If you dislike Tortoise, then you can set the SVN_SSH variable to c:\\putty\\plink.exe -ssh -2 -A -l username

But as Martin said, plink has one disadvantage. It creates a msdos popup window each time it’s used…

JavaHL is also needed, SVNKit doesn’t use the SVN_SSH variable.

Talking about Tortoise… A while ago I encountered some annoying lock problems (maven clean install didn’t work because maven was not allowed to delete the target directory). This was caused by the Tortoise cache. Now I disabled it in total, which helped against my locking issue, and the performance of my explorer increased as well. So it’s a win/win situation. And since I like to develop using Ubuntu, I’m not used to see the svn status in my explorer window right away anyways (although I’ve to say, it can be useful, if it didn’t cause problems I would have kept it).

Perhaps this locking problem is related to having my workspace on an ext2 fs partition on my usb drive… Not sure who to blame, yet. On my new workstation I’ve not had such locking problems yet, with this tip the cache is performing good enough.

SVN merge changes from a deleted branch

Today I had a problem with a merge. I thought I had merged all changes from a branch into the trunk, so I deleted the branch. But somehow (probably forgetting to remove a --dry-run) not all got merged. So I had to merge the changes again. I thought I could do that with just a:

svn merge -r 3173:3246 $SVN/project/branches/MY_BRANCH .

Where 3173 is the revision in which the branch was created and 3246 is one revision before I deleted the branch.

But this gave me a svn error:

svn: '/svn/project/!svn/bc/3251/branches/MY_BRANCH' path not found

That 3251 is the HEAD revision number. So even though I’m specifying the revisions I want to merge, SVN first checks the given path using the HEAD revision. So in stead of the above command I had to specify the revision in the SVN URL as well:

svn merge -r 3173:3246 $SVN/project/branches/MY_BRANCH@3246 .

This worked perfectly. So if you know you have to specify the revision just before the deletion twice, it’s not that hard to merge changes from a deleted branch. I was already thinking about a checkout of the deleted branch and lots of copy’s. But fortunately for me that wasn’t necessary.

svn move multiple directories with confirm

I had to rearrange multiple directories, but not all, in a svn tree to make a project more compatible with Eclipse. For this I used the following one-liner so I could do this more easily.

for file in `find -maxdepth 1 -type d`; do \
echo -n $file "[y/n] "; \
read -n 1 shouldMove ; \
if [ "$shouldMove" == "y" ]; \
then \
svn mv `basename $file` WebContent/`basename $file`; \
fi; \
done

This way I was sure all directories I wanted to move were moved (since a svn mv does not remove the directory right away, it does that on commit).