Don't try to import .git directories from special remotes

Because git does not support storing git repositories inside a git
repository.
This commit is contained in:
Joey Hess 2019-06-04 15:14:20 -04:00
parent 500f72ec3d
commit 082e1f1738
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 32 additions and 1 deletions

View file

@ -16,6 +16,7 @@ module Annex.Import (
downloadImport,
filterImportableContents,
makeImportMatcher,
listImportableContents,
) where
import Annex.Common
@ -54,6 +55,7 @@ import qualified Logs.ContentIdentifier as CIDLog
import Control.Concurrent.STM
import qualified Data.Map.Strict as M
import qualified Data.Set as S
import qualified System.FilePath.Posix as Posix
{- Configures how to build an import tree. -}
data ImportTreeConfig
@ -480,3 +482,22 @@ filterImportableContents r matcher importable
<*> mapM (go dbhandle) (importableHistory ic)
match dbhandle (loc, (_cid, sz)) = shouldImport dbhandle matcher loc sz
{- Gets the ImportableContents from the remote.
-
- Filters out any paths that include a ".git" component, because git does
- not allow storing ".git" in a git repository. While it is possible to
- write a git tree that contains that, git will complain and refuse to
- check it out.
-}
listImportableContents :: Remote -> Annex (Maybe (ImportableContents (ContentIdentifier, ByteSize)))
listImportableContents r = fmap removegitspecial
<$> Remote.listImportableContents (Remote.importActions r)
where
removegitspecial ic = ImportableContents
{ importableContents =
filter (not . gitspecial . fst) (importableContents ic)
, importableHistory =
map removegitspecial (importableHistory ic)
}
gitspecial l = ".git" `elem` Posix.splitDirectories (fromImportLocation l)

View file

@ -11,6 +11,8 @@ git-annex (7.20190508) UNRELEASED; urgency=medium
unwanted files are not imported. But, some preferred content
expressions can't be checked before files are imported, and trying to
import with such an expression will fail.
* Don't try to import .git directories from special remotes, because
git does not support storing git repositories inside a git repository.
* Improve shape of commit tree when importing from unversioned special
remotes.
* init: When the repository already has a description, don't change it.

View file

@ -291,7 +291,7 @@ seekRemote remote branch msubdir = do
listContents :: Remote -> TVar (Maybe (ImportableContents (ContentIdentifier, Remote.ByteSize))) -> CommandStart
listContents remote tvar = do
showStart' "list" (Just (Remote.name remote))
next $ Remote.listImportableContents (Remote.importActions remote) >>= \case
next $ listImportableContents remote >>= \case
Nothing -> giveup $ "Unable to list contents of " ++ Remote.name remote
Just importable -> do
importable' <- makeImportMatcher remote >>= \case

View file

@ -19,6 +19,14 @@ The solution is certianly to
1. filter out .git when importing
2. avoid deleting .git when exporting
As long as the export tracking branch did not contain .git,
an export will harm no .git directories, because an exporttree
remote uses removeExportDirectoryWhenEmpty, not removeExportDirectory,
so will not delete non-empty directories. And other than deleting
directories, exporting only deletes files that are removed in the git
diff between two trees; if neither tree contained .git, the diff won't
contain it either, and so if importing skips .git, this will be ok.
--[[Joey]]
> [[fixed|done]] --[[Joey]]