diff --git a/Data/Git/Internal.hs b/Data/Git/Internal.hs
--- a/Data/Git/Internal.hs
+++ b/Data/Git/Internal.hs
@@ -119,9 +119,15 @@
   getObject (IdRef _)  = Nothing
   getObject (ObjRef x) = Just x
 
-data Repository = Repository { repoPath       :: FilePath
-                             , repoOnWriteRef :: [Reference -> IO ()]
-                             , repoObj        :: ForeignPtr C'git_repository }
+data Repository = Repository
+    { repoPath :: FilePath
+    -- jww (2013-01-21): These two callbacks are a temporary workaround until
+    -- libgit2 supports full virtualization of repositories.  See:
+    -- https://github.com/libgit2/libgit2/issues/1213
+    , repoBeforeReadRef :: [Repository -> Text -> IO ()]
+    , repoOnWriteRef    :: [Repository -> Reference -> IO ()]
+    , repoObj           :: ForeignPtr C'git_repository
+    }
 
 instance Eq Repository where
   x == y = repoPath x == repoPath y && repoObj x == repoObj y
@@ -184,10 +190,11 @@
         when (r < 0) $ doesNotExist p
         ptr' <- peek ptr
         fptr <- newForeignPtr p'git_repository_free ptr'
-        return Repository { repoPath       = path
-                          , repoOnWriteRef = []
-                          , repoObj        = fptr }
-
+        return Repository { repoPath          = path
+                          , repoBeforeReadRef = []
+                          , repoOnWriteRef    = []
+                          , repoObj           = fptr
+                          }
   where doesNotExist = throwIO . RepositoryNotExist . toString
 
 withObject :: (Updatable a, Updatable b) => ObjRef a -> b -> (a -> IO c) -> IO c
diff --git a/Data/Git/Reference.hs b/Data/Git/Reference.hs
--- a/Data/Git/Reference.hs
+++ b/Data/Git/Reference.hs
@@ -43,6 +43,7 @@
 
 lookupRef :: Repository -> Text -> IO (Maybe Reference)
 lookupRef repo name = alloca $ \ptr -> do
+  mapM_ (\f -> f repo name) (repoBeforeReadRef repo)
   r <- withForeignPtr (repositoryPtr repo) $ \repoPtr ->
         withCStringable name $ \namePtr ->
           c'git_reference_lookup ptr repoPtr namePtr
@@ -85,7 +86,7 @@
 
   fptr <- newForeignPtr_ =<< peek ptr
   let ref' = ref { refObj = Just fptr }
-  mapM_ ($ ref') (repoOnWriteRef (refRepo ref'))
+  mapM_ (\f -> f (refRepo ref') ref') (repoOnWriteRef (refRepo ref'))
   return ref'
 
 writeRef_ :: Reference -> IO ()
@@ -95,7 +96,8 @@
 --   const char *name)
 
 resolveRef :: Repository -> Text -> IO (Maybe Oid)
-resolveRef repos name = alloca $ \ptr ->
+resolveRef repos name = alloca $ \ptr -> do
+  mapM_ (\f -> f repos name) (repoBeforeReadRef repos)
   withCStringable name $ \namePtr ->
     withForeignPtr (repoObj repos) $ \repoPtr -> do
       r <- c'git_reference_name_to_oid ptr repoPtr namePtr
diff --git a/gitlib.cabal b/gitlib.cabal
--- a/gitlib.cabal
+++ b/gitlib.cabal
@@ -1,5 +1,5 @@
 Name:                gitlib
-Version:             0.6.5
+Version:             0.7.0
 Synopsis:            Higher-level types for working with hlibgit2
 License-file:        LICENSE
 License:             MIT
