[As of August 2013 (and earlier): The Savane/Savannah differences have long since stopped being tracked. GNU Arch is not actively used for Savannah, and Subversion only started being used in the "administration" project a couple weeks ago, for the new ikiwiki-based SavannahWiki. Never heard of svk. --karl]
[SVK is a distributed vcs "wrapper" around Subversion. It will work with any Subversion backend. I imagine the previous Savannah Hacker used SVK in the same way that I am using git-svn to interact with subversion backends now. I have used svk in the past but git-svn is better IMNHO. Since the time in the past discussed on this page Savannah has been migrated to git and so no distributed wrapper is needed since git is natively distributed. --rwp]
We needed to track a couple Savane changes specific to Savannah, such as the local configure.cache configuration, favicon.ico, keeping the FAQ around, plus the magic number anti-spam trick.
We did so by creating a local SVK branch and keep sync-ing with it.
Hopefully, any change tested at Savannah could be cherry-picked (in the GNU Arch sense of cherry-picking) directly back to the Gna! repository, easying later upgrade (read: avoid conflicts).
Here's how we did it in 2006. At the time I was globally dissatisfied because SVK is slow, I had troubles getting my branching done (but maybe my branching scheme wasn't clean), the lack of answer when submitting detailed bug reports to the mailing list, and the fact I irremediably messed my local SVK repository a couple times. This may have changed since then with SVK2. It's still nice to be able to remotely clone and use a SVN repository.
Help
The appropriate documentation to read first is integrated in SVK. Don't look anywhere else until you read it - it'll save you time:
svk help intro | less
If you know GNU Arch, you should then have a look at this Arch/SVK comparison. Beware that annotations are a bit biaised toward SVK and only covers the basic, centralized commands:
svn co svn://svn.clkao.org/member/clkao/arch-tutorial/annotated/ svk-tut
Then you can have a look at http://svk.elixus.org/ and http://svkbook.elixus.org/, which are pretty sparse as of 2006-04-08.
Initialization
Init commands:
# Define the local copy and its origin:
svk mirror http://svn.gna.org/svn/savane //mirror/savane
# Grab all the 5K revisions (long):
svk sync //mirror/savane
# Define the local branch
svk cp -p //mirror/savane //local/savane
# Check the result
svk ls //
Alternative (with a wizard, select the default choice):
svk cp -p http://svn.gna.org/svn/savane //local/savane
The wizard offers to grab only the latest revision but warns that this
may lead to issues. When I tried it started creating a > 100M .svk
while saying it grabbed only the latest revision log, so I killed it.
Hmmm, clkao says: "it's better to branch the project level, rather than toplevel for local uses". It's probably better to cp //mirror/savane/trunk //local/savane-trunk or something similar.
To save time and bandwith and load etc., you can download a SVN dump (\~180MB gzip'd), sync from it, and then relocate your mirror to the canonical URL:
wget http://svn.gna.org/daily/savane.dump.gz
svnadmin create savane
zcat savane.dump.gz | svnadmin load savane > out.txt # real 9m13.210s
svk mirror //mirror/savane file://`pwd`/savane/
svk sync //mirror/savane > out2.txt # real 17m2.292s
svk mirror --relocate //mirror/savane http://svn.gna.org/svn/savane
svk sync //mirror/savane
See also http://svk.bestpractical.com/view/SVKBootStrap
Working copy
Initial checkout:
cd /usr/src
svk co //local/savane/trunk savane
Update
To merge:
cd /usr/src/savane
svk pull
This should be the same than:
# Refresh our local copy
svk sync //mirror/savane
# Merge with the local branch
svk smerge //mirror/savane //local/savane
# Update the working copy
cd /usr/src/savane
svk update
smerge
can probably be used in a more flexible way, for example
merging with a third repository (I mean: not the mirror mirror nor the
local copy, another branch).
Displaying the local changes
This one is the most accurate, it takes uncommited changes into account:
svk diff //mirror/savane/trunk .
This other one compares the two repositories, this is faster:
svk diff //mirror/savane/trunk //local/savane/trunk
Save a patch:
svk smerge -P patch_name ...
Publishing changes to Savane
I need to make the Savannah changes available to me (Beuc), so I can grab them at my personal machine and put them back at Gna!. I don't really know how to do so atm. In the worst case I'll make a diff.
I'd also like to perform some cherry-picking (e.g. only apply a
selection of revisions, not a complete merge - that way I can avoid
merging Savannah-specific changes yet still commit generic changes). But
generally speaking, cherry-picking is not very easy to manage (commit by
commit) - better create two distinct branches - experimental
and
Savannah-specific
.
One solution is to publish the depot at Savannah (svn+ssh://root@sv?) so I can grab it at home.
Another one would be to setup a SVN server at home and have Savannah
commit there (svk push
).
Yet another insecure one would be to --relocate //mirror/savane
to
Beuc@svn.gna.org and commit from Savannah.
SVK probably needs to be used from end to end. I don't really know if
SVK will then understand that the Savannah changes I'll have committed
from home should not conflict with themselves at the next svk pull
.
Maybe it adds some revprops for this? If not, I think we're KO.
Setup a public branch
Overview: we create a separate branch that gets updates from 1) Savane@Gna and 2) changes from various SVN (direct) and SVK (offline) repositories.
To import updates from Savane@Gna:
svk mirror //mirror/administration svn://Beuc@svn.sv.gnu.org/administration
svk sync //mirror/administration
# let's try commiting only the trunk - no need to get a super-huge repository
# with disconnected branches
svk mkdir //mirror/administration/trunk
svk smerge -B //mirror/savane/trunk //mirror/administration/trunk # initial connection
svk push --from //mirror/savane/trunk //mirror/administration/trunk
# or:
svk smerge //mirror/savane/trunk //mirror/administration/trunk
On the developper machine:
svk mirror //mirror/administration svn+ssh://Beuc@svn.sv.gnu.org/administration
svk cp -p //mirror/administration/... //local/administration/...
svk co //local/administration/...
# edit...
svk push