I am writing a shell script which can store the actual state of a SVN working copy and restore it later, exactly as it was. Currently I have a problem with specific, rare combination of revisions of files and directories which seems to be undetectable.
Let's say that there is a repository with two revisions. There are two cases:
Assume that foo
is a file (or a directory) that exists only in revision 2. At the beginning the whole working copy is at revision 2. Then foo
(and only foo
) is updated to revision 1.
Assume that bar
is a file (or a directory) that exists only in revision 1. At the beginning the whole working copy is at revision 1. Then bar
(and only bar
) is updated to revision 2.
The both cases are very similar but it seems that they have different solutions. In both cases the file (or directory) simply vanishes. However, output of command svn status
contains no information about that.
How to create by a shell script a list of such files and directories?
There is one simple but bad solution. It is possible to use command svn list
to get a list of files that should exist in current revision and compare it to the list of files that really exist.
This solution is unacceptable because it takes a lot of time and generates a big traffic to the server.
I posted the best answer that I can come up with. Still, it works only for the first case and has false-positives.
I once attempted to do the same thing that you're doing, and I hit so many corner cases that I eventually went a completely different direction. Instead of using a script, I used a local git repository.
Check out a working copy from the Subversion repository, then create a local git repository in that folder using git init
. Add the entire contents of your Subversion working copy to the git repository - including the .svn
metadata directories - using git add
followed by a git commit
. Git is now keeping track of your working copy plus all of the Subversion metadata associated with it. My current git repository has 5 different branches, each based off of a different Subversion revision and containing different sets of changes that haven't been committed to the Subversion repository yet. The git repository makes it easy to switch back and forth between them, and Subversion works as if they were all separate working copies. Even for large working copies, git does a good job at storing contents efficiently and switching between branches quickly.
Note that this is different than the git svn
command, which is git's method of directly interfacing with a Subversion repository. I found git svn
to be more complicated to use and easier to break things. Wrapping a normal Subversion working copy in a git repository allowed me to still do all of my repository operations using Subversion, and only required me to learn a few basic git commands (add
, commit
, branch
, checkout
, etc). It's a bit easier for someone who is experienced with Subversion and new to git; git svn
is more geared towards someone who is experienced with git and stuck with a Subversion repository.