As you know, I’m tortured by the pseudo requirement to layout your projects a certain way with svn. Some more thought (and chats with my svn friends) have led me to think that the tool doesn’t really force you to lay things out a certain way, since you could (and should I guess) checkout your projects at a lower level than the top.
in svn would be
So you make the project called ft.repo, and make the svn directories under that of trunk, tags and branches. Then ft is my top level directory, and so I check it out with
svn checkout svn://…/ft.repo/trunk/ft ft
and this way my directories are arranged the way I want in my workspace, and tagging will not clutter up my workspace.
But I’m still not overly happy with this, and couldn’t be bothered moving my stuff around, so I decided to write a small shell script that associates the current revision with a tag that is saved into the file .tags in current directory (and committed). It doesn’t let you tag files, but certainly sub-directories are fine. I also merged in the svnignore program from a previous post. Suggestions for improvement are welcome, as this is the first version
This works by writing version=tag to the file .tags in the current directory.
It is not a "real tag"
svn tag “version-1.0″
This will write a “tag” to the current directory as version-1.0
This will list the “tags” for the current directory.
Put this in your path ahead of the real svn (or rename this file)
# @author Cameron Gregory. http://www.bloke.com/
if [ "$1" == "ignore" ]; then
#Usage svn ingore [file|dir|pattern]+
echo "Intercept ignore"
if [ $# -eq 0 ]; then
svn propget svn:ignore .
$SVN propget svn:ignore . > $FILE
while [ $i -lt $# ]; do
echo "$1" >> $FILE
sort -u $FILE | grep -v "^$" > $FILE.2
$SVN propset svn:ignore -F $FILE.2 .
$SVN propget svn:ignore .
/bin/rm -f $FILE $FILE.2
if [ "$1" == "tag" ]; then
echo "Intercept tag"
$SVN update .
echo "$VER=$TAG" >> .tags
$SVN add .tags 2> /dev/null
$SVN commit .tags -m "saving tag: $TAG"
tail -5 .tags
if [ "$1" == "listtags" ]; then
echo "Intercept listtags"
if [ -f .tags ]; then
echo no tags
So if you want to checkout with a tag, then lookup the revision
and checkout using that. Hmm .. perhaps a little grep in the .tags file would be useful. Next time