unannex: Now skips files whose content is not present, rather than it being an error. This allows gradual conversion from one backend to another by running unannex followed by add in each repository.

This commit is contained in:
Joey Hess 2011-01-08 15:14:41 -04:00
parent 82fe151f87
commit 32b0e10390
4 changed files with 33 additions and 6 deletions

View file

@ -29,8 +29,12 @@ seek = [withFilesInGit start]
{- The unannex subcommand undoes an add. -} {- The unannex subcommand undoes an add. -}
start :: CommandStartString start :: CommandStartString
start file = isAnnexed file $ \(key, backend) -> do start file = isAnnexed file $ \(key, backend) -> do
showStart "unannex" file ishere <- inAnnex key
return $ Just $ perform file key backend if ishere
then do
showStart "unannex" file
return $ Just $ perform file key backend
else return Nothing
perform :: FilePath -> Key -> Backend -> CommandPerform perform :: FilePath -> Key -> Backend -> CommandPerform
perform file key backend = do perform file key backend = do

8
debian/changelog vendored
View file

@ -1,3 +1,11 @@
git-annex (0.17) UNRELEASED; urgency=low
* unannex: Now skips files whose content is not present, rather than
it being an error. This allows gradual conversion from one backend
to another by running unannex followed by add in each repository.
-- Joey Hess <joeyh@debian.org> Sat, 08 Jan 2011 15:04:48 -0400
git-annex (0.16) unstable; urgency=low git-annex (0.16) unstable; urgency=low
* git-annex-shell: Avoid exposing any git repo config except for the * git-annex-shell: Avoid exposing any git repo config except for the

View file

@ -277,6 +277,19 @@ add something like this to `.gitattributes`:
* annex.backend=SHA1 * annex.backend=SHA1
## migrating between backends
Perhaps you had been using the WORM backend, but now have configured
git-annex to use SHA1 for new files. Your old files are still in WORM. How
to migrate that content? A quick and dirty way is to use the unannex
subcommand, which removes a file from git-annex's control, followed by
a re-add of the file, to put it in the new backend.
# git annex unannex my_cool_big_file
unannex my_cool_big_file ok
# git annex add my_cool_big_file
add my_cool_big_file (checksum ...) ok
## unused data ## unused data
It's possible for data to accumulate in the annex that no files point to It's possible for data to accumulate in the annex that no files point to

10
test.hs
View file

@ -16,6 +16,7 @@ import Data.List
import System.IO.Error import System.IO.Error
import System.Posix.Env import System.Posix.Env
import qualified Control.Exception.Extensible as E import qualified Control.Exception.Extensible as E
import Control.Exception (throw)
import qualified GitRepo as Git import qualified GitRepo as Git
import qualified Locations import qualified Locations
@ -87,10 +88,11 @@ test_unannex :: Test
test_unannex = "git-annex unannex" ~: TestList [nocopy, withcopy] test_unannex = "git-annex unannex" ~: TestList [nocopy, withcopy]
where where
nocopy = "no content" ~: intmpclonerepo $ do nocopy = "no content" ~: intmpclonerepo $ do
r <- git_annex "unannex" ["-q", annexedfile] annexed_notpresent annexedfile
not r @? "unannex incorrectly succeeded with no copy" git_annex "unannex" ["-q", annexedfile] @? "unannex failed with no copy"
unannexed annexedfile annexed_notpresent annexedfile
withcopy = "with content" ~: intmpcopyrepo $ do withcopy = "with content" ~: intmpcopyrepo $ do
annexed_present annexedfile
git_annex "unannex" ["-q", annexedfile] @? "unannex failed" git_annex "unannex" ["-q", annexedfile] @? "unannex failed"
unannexed annexedfile unannexed annexedfile
git_annex "unannex" ["-q", annexedfile] @? "unannex failed on non-annexed file" git_annex "unannex" ["-q", annexedfile] @? "unannex failed on non-annexed file"
@ -280,7 +282,7 @@ indir dir a = do
(E.try (a)::IO (Either E.SomeException ())) (E.try (a)::IO (Either E.SomeException ()))
case r of case r of
Right () -> return () Right () -> return ()
Left e -> error $ show e Left e -> throw e
setuprepo :: FilePath -> IO FilePath setuprepo :: FilePath -> IO FilePath
setuprepo dir = do setuprepo dir = do