Piston is a utility that eases vendor branch management. This is similar to svn:externals, except you have a local copy of the files, which you can modify at will. As long as the changes are mergeable, you should have no problems.

Piston has a similar purpose than svnmerge.py which you can find in the contrib/client-side folder of the main Subversion. The main difference is that Piston is designed to work with remote repositories. You should also investigate if SVK would be a better fit for you.

From Wikipedia's Piston:

In general, a piston is a sliding plug that fits closely inside the bore of a cylinder.

Its purpose is either to change the volume enclosed by the cylinder, or to exert a force on a fluid inside the cylinder.

For Piston, we retain the second meaning, to exert a force on a fluid inside the cylinder. In our case, the fluid is the code copied from the remote repository.

Installation

Nothing could be simpler:

$ gem install --include-dependencies piston
Successfully installed piston, version 1.0.0

Usage

First, you need to import the remote repository location:

$ piston import http://dev.rubyonrails.org/svn/rails/trunk vendor/rails
Exported r4720 from 'http://dev.rubyonrails.org/svn/rails/trunk' to 'vendor/rails'

$ svn commit -m "Importing local copy of Rails"

When you want to get the latest changes from the remote repository location:

$ piston update vendor/rails
Updated 'vendor/rails' to r4720.

$ svn commit -m "Updates vendor/rails to the latest revision"

You can prevent a local Piston-managed folder from updating by using the lock subcommand:

$ piston lock vendor/rails
'vendor/rails' locked at r4720.

When you want to update again, you unlock:

$ piston unlock vendor/rails
'vendor/rails' unlocked.