Or you create a novel filesystem that allows you to use an exotically large capacity, write-once volume as a less exotically large, write-many volume with built-in, block-level history.
Seems pretty easy. Just store your file system in some immutable tree structure (ala Haskell or Clojure, where "changes" don't actually change the tree but instead create a new tree referencing parts of the old tree).