![]() | svk |
svk is a decentralized version control system built with the robust Subversion filesystem. It supports repository mirroring, disconnected operation, history-sensitive merging, and integrates with other version control systems, as well as popular visual merge tools. source
It is possible for one person to use SVK as a branch and merge tool while others use subversion on the same project.
# create local repository
svk depotmap --init
# set up a mirror
svk mirror https://geektank.selfip.org/svn/myproject/trunk //myproject/trunk
# check mirrors
svk mirror --list
# sync
svk sync //myproject/trunk
# create a local branch
svk mkdir -m "local branches for work on myproject" //myproject/branches
svk mkdir -m "local branch for work on myproject" //myproject/branches/local
svk cp //myproject/trunk //myproject/branches/local
# check it out
svk co //myproject/branches/local/trunk myproject
This is currently incomplete...
From: http://svkbook.elixus.org/nightly/en/svk.tour.cycle.html
# Update your working copy
svk sync //myproject/trunk
# rebase
svk update
# both at once
svk update --sync
# Make changes
svk add
svk delete
svk copy
svk move
# Examine your changes
svk status
svk status -u
svk diff
svk revert
# Merge others' changes into your working copy
svk sync //myproject/trunk
svk update
# ... if conflicts, resolve and then ...
svk resolved .
# ... run tests ...
# Commit your changes
svk commit
# delivery back to trunk
# check
svk smerge -C //myproject/branches/local //myproject/trunk
# run
svk smerge -l //myproject/branches/local //myproject/trunk
It's safe to mirror an svn repository locally, create a local branch using svk, and then work on the local branch using plain old vanilla subversion. This should allow tools that talk subversion but not svk (e.g. eclipse) to work with files in a local mirror. Sweet!
There are some notes about the limitations (which are kinda obvious) at the bottom of this page.
# sync
svk sync //myproject/trunk
# create a local branch
svk mkdir //myproject/branches/mybranch
svk cp //myproject/trunk //myproject/branches/mybranch
# check out the local svk mirror using subversion
svn co file:///Users/wu/.svk/local/myproject/branches/mybranch myproject
# set into working copy
cd /path/to/working_copy
# tell svk to forget about this working copy
svk checkout --detach
# go up a directory and remove the working copy
cd ../
rm -rf working_copy
# update depotmap
svk depotmap --relocate ~/.svk/local /path/svn/mirror
# manually move the directory
mv ~/.svk/local/* /path/svn/mirror/
I use the vc-svk.el module and so far it is working great.
I also wanted to use emacs for my merge tool. I use emacs 22 from fink on OS X, and I run the carbon version in /sw/Applications.
I tried setting SVKMERGE to "Emacs" but it wasn't working. I saw some references about a script called svk-merge-emacs but it no longer existed in the SVK distribution.
It turns out that SVKMERGE looks for an SVK-Resolve class matching the specified value. I checked out the emacs perl lib and found out it was trying to use gnuclient-emacs instead of emacsclient which comes with emacs 22. I changed the command to "emacsclient" but was still having a problem. In the end I realized that when using --eval with emacsclient, each lisp statement must be a separate argument, where as gnuclient allows having them all quoted together as a single argument. So I created a module for emacsclient:
Just place the .pm it in the same directory as your
SVK/Resolve/Emacs.pm or in your private lib/SVK/Resolve/ and then:
export SVKMERGE="EmacsClient"