SVN... for a whole filesystem.

I’m starting to rilly like version control and SVN, what with having a periodic history of the changes to a file, and the inability to truly delete anything. Ive bean thinking about the possibility of storing my entire filesystem in a SVN repo, I know that the elephants dream project did something like this.

One major issue with this is that the repository has the potential to become verry large, verry quickly…


SVN stores only changes. So it will not grow that extremly large (esp. branching and tagging are “cheap” operations). But SVN does not help much with binary files, it works best with text files. Sure, a dedicated “server” (different computer than the one you work with) with a big harddisk helps a lot, even if it is possible to work with SVN solely on local file basis without a server.

Filehamster is a nice alternative for keeping track of changes on personal files. You get a new version every time you save a file in a guarded folder. But it doesn’t deliver the collaboration possibilities of SVN.

Entire file system?! I think that would be a bit overdone. I recently started using bazaar (bzr) to version control certain projects where it makes sense. Otherwise, while working I’ll often “save as” and increment the filename while doing significant changes to a file. The other benefit of using version control is you can have a record of what you changed since, when you commit changes, you enter a comment.

I like the idea of having the version control storage on a separate drive/server. Also consider an automated backup solution. After learning about Apple’s TimeMachine I implemented something similar that I run on my linux system. It was also tested to work on Windows using Cygwin and can also work on Mac OS X. It uses rsync and hardlinking to preserve storage space and only transfers changed files. Cron executes it for me on a daily basis. When retrieving a file from this store I can browse dated directories that hold my mirrored file structure.

Forgot to mention, I’m on Linux, my whole data file system is in a tree which is stored on a separate EXT3 partition and mounted in /home/user/ALL. I have bean using Unison to synchronise this between my two computers. The problem with this is its relativity easy to lose something, as deleting a file on one computer deletes it on the other one the next time unison is ran.

The majority of the size of my file system is mainly rendered animations stored as PNG sequences, as these are binary files it is unlickly that SVN would be able to work out the difference between them, so is lickly to create a copy for every file version, which could easily take up a lot of room. This is unnesoserry as I generally only care about the newest version of a render, Its blends, textures, HTML, TeX documents etc which should be version controled. So what I actually need is something which gives you the option of selecting which files should be version controlled, but still stores everything in one central location for convince, like Unison.

I’m on linux also.

bazaar has an -ignore option and you can use wildcards. I’m sure SVN has the same. That way you could ignore *.png.

It’s just a matter of learning one of the vcs. I think git, svn and bzr are all pretty similar and seem to be the most popular. I think SVN has some integration with Nautilus if your using Gnome. Olive is a graphical tool for use with Bazaar. Find the one that fits you best and learn it – especially the commandline way.

That sounds like quite a tree for unison to scan through. I could see having mail and a documents folder synced between machines but not a large tree like that. You should probably rethink your project directory structure.

It has… but that means that the file isn’t checked in by the client. What would be needed is an option that allows to delete old revisions of certain files on the server - in the corner case all old revisions when a new one is checked in.
I don’t know if SVN has such built-in or how it could be configured. I know SVN has hooks for certain events like “before checkin” and “after checkin”. I will take a look into this.

That way you could ignore *.png.

Wouldn’t help much, textures and the like are also PNG images, but these should be version controlled.

What would be needed is an option that allows to delete old revisions of certain files on the server - in the corner case all old revisions when a new one is checked in.

Exactly, but I don’t believe SVN has such an option(it is very hard to delete files from an SVN repo). Are any of the existing VCS’s capable of doing this?

Reading a little in the SVN FAQ and the SVN book I came across this: this (and about removal. Seems binary files are treated as text file, only a delta is saved.
But I believe the delta is to big for images to be useful. So I guess SVN is not the right tool for this purpose. Excluding them from the versioning and syncing them with other tools (like rsync) may be a liable way. This should be possible with svn:ignore on png and syncing only on them.

But this doesn’t meet your requirement of one place to store and one tool to work with… except maybe if you build a script that does both at a time?

If your rendered frames are in a folder such as RENDER/*.png then you can create such an ignore pattern.

I think Inmare has the right idea. Perhaps the script takes a comment and initiates the commit, then rsyncs the rendered frames and whatnot.

Versioning binaries hasn’t bothered me yet but then I’m not version controlling much. One example is a project where my main blender scene pulls in links models from a LIBRARY/ directory. I’ve versioned these blend and png files since I want a record of changes but do not wish to change the file names. Backups are automatically handled with the Autoback script and If I need to continue work on another machine then I might use Unison on the project directory.