I've often wondered if version control systems could be abstracted into a filesystem where each write is a commit, handling merges by choosing the local copy.
My primary dissatisfaction with git is that it lacks layers of abstraction. For example it should have had at least the first two distinct components listed below, something like:
1) git-fs (versioned filesystem, only supporting commit, clone and permissions)
2) git-merge (diff utility to handle merge conflicts)
3) git-local (two repositories wrapped in an abstraction to provide local and remote - the special sauce of git)
4) git-util (everything else like repair, reports, statistics, etc)
5) git (umbrella executable above previous layers)
I’m not super familiar with git console use so if it already is organized this way, great. But since it is not presented this way in its documentation, I feel that a great opportunity has been missed. We could have used git-fs the same way that people use Dropbox. Instead we have something with a lot of warts (things like .gitignore files interspersed with other files that continue the same mistakes that cvs and svn made, and the inability to save empty directories). I think git’s pattern of pull/commit/push is fantastic, but its shortcomings are so numerous that I’m going to stop knocking it right here before I get myself in trouble.
If gitfs ran on the Mac, I’d probably be using it right now to avoid frequent headaches where git interferes with the simplest pattern of pulling, merging by hand and pushing all files back if nobody else has committed in the meantime. I think that’s the motivation behind a library like this, because so many version control systems get the filesystem metaphor wrong and create two much friction by touting their various levers.