diff --git a/Annex.hs b/Annex.hs
--- a/Annex.hs
+++ b/Annex.hs
@@ -43,6 +43,7 @@
 import qualified Git.Config
 import Git.CatFile
 import Git.CheckAttr
+import Git.CheckIgnore
 import Git.SharedRepository
 import qualified Git.Queue
 import Types.Backend
@@ -91,6 +92,7 @@
 	, repoqueue :: Maybe Git.Queue.Queue
 	, catfilehandles :: M.Map FilePath CatFileHandle
 	, checkattrhandle :: Maybe CheckAttrHandle
+	, checkignorehandle :: Maybe (Maybe CheckIgnoreHandle)
 	, forcebackend :: Maybe String
 	, forcenumcopies :: Maybe Int
 	, limit :: Matcher (FileInfo -> Annex Bool)
@@ -123,6 +125,7 @@
 	, repoqueue = Nothing
 	, catfilehandles = M.empty
 	, checkattrhandle = Nothing
+	, checkignorehandle = Nothing
 	, forcebackend = Nothing
 	, forcenumcopies = Nothing
 	, limit = Left []
diff --git a/Annex/CheckIgnore.hs b/Annex/CheckIgnore.hs
new file mode 100644
--- /dev/null
+++ b/Annex/CheckIgnore.hs
@@ -0,0 +1,32 @@
+{- git check-ignore interface, with handle automatically stored in
+ - the Annex monad
+ -
+ - Copyright 2013 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Annex.CheckIgnore (
+	checkIgnored,
+	checkIgnoreHandle
+) where
+
+import Common.Annex
+import qualified Git.CheckIgnore as Git
+import qualified Annex
+
+checkIgnored :: FilePath -> Annex Bool
+checkIgnored file = go =<< checkIgnoreHandle
+  where
+  	go Nothing = return False
+	go (Just h) = liftIO $ Git.checkIgnored h file
+
+checkIgnoreHandle :: Annex (Maybe Git.CheckIgnoreHandle)
+checkIgnoreHandle = maybe startup return =<< Annex.getState Annex.checkignorehandle
+  where
+	startup = do
+		v <- inRepo $ Git.checkIgnoreStart
+		when (isNothing v) $
+			warning "The installed version of git is too old for .gitignores to be honored by git-annex."
+		Annex.changeState $ \s -> s { Annex.checkignorehandle = Just v }
+		return v
diff --git a/Annex/Content.hs b/Annex/Content.hs
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -48,12 +48,14 @@
 import Utility.DataUnits
 import Utility.CopyFile
 import Config
-import Annex.Exception
 import Git.SharedRepository
 import Annex.Perms
 import Annex.Link
 import Annex.Content.Direct
 import Annex.ReplaceFile
+#ifndef mingw32_HOST_OS
+import Annex.Exception
+#endif
 
 {- Checks if a given key's content is currently present. -}
 inAnnex :: Key -> Annex Bool
@@ -91,34 +93,34 @@
 inAnnexSafe = inAnnex' (fromMaybe False) (Just False) go
   where
 	go f = liftIO $ openforlock f >>= check
-	openforlock f = catchMaybeIO $
 #ifndef mingw32_HOST_OS
+	openforlock f = catchMaybeIO $
 		openFd f ReadOnly Nothing defaultFileFlags
 #else
-		return ()
+	openforlock _ = return $ Just ()
 #endif
 	check Nothing = return is_missing
-	check (Just h) = do
 #ifndef mingw32_HOST_OS
+	check (Just h) = do
 		v <- getLock h (ReadLock, AbsoluteSeek, 0, 0)
 		closeFd h
 		return $ case v of
 			Just _ -> is_locked
 			Nothing -> is_unlocked
 #else
-		return is_unlocked
+	check (Just _) = return is_unlocked
 #endif
+#ifndef mingw32_HOST_OS
 	is_locked = Nothing
+#endif
 	is_unlocked = Just True
 	is_missing = Just False
 
 {- Content is exclusively locked while running an action that might remove
  - it. (If the content is not present, no locking is done.) -}
 lockContent :: Key -> Annex a -> Annex a
+#ifndef mingw32_HOST_OS
 lockContent key a = do
-#ifdef mingw32_HOST_OS
-	a
-#else
 	file <- calcRepo $ gitAnnexLocation key
 	bracketIO (openforlock file >>= lock) unlock (const a)
   where
@@ -140,6 +142,8 @@
 			Right _ -> return $ Just fd
 	unlock Nothing = noop
 	unlock (Just l) = closeFd l
+#else
+lockContent _key a = a -- no locking for Windows!
 #endif
 
 {- Runs an action, passing it a temporary filename to get,
diff --git a/Annex/Environment.hs b/Annex/Environment.hs
--- a/Annex/Environment.hs
+++ b/Annex/Environment.hs
@@ -10,11 +10,14 @@
 module Annex.Environment where
 
 import Common.Annex
-import Utility.Env
 import Utility.UserInfo
 import qualified Git.Config
 import Config
 import Annex.Exception
+
+#ifndef mingw32_HOST_OS
+import Utility.Env
+#endif
 
 {- Checks that the system's environment allows git to function.
  - Git requires a GECOS username, or suitable git configuration, or
diff --git a/Annex/Journal.hs b/Annex/Journal.hs
--- a/Annex/Journal.hs
+++ b/Annex/Journal.hs
@@ -86,12 +86,13 @@
 	mode <- annexFileMode
 	bracketIO (lock lockfile mode) unlock (const a)
   where
-	lock lockfile mode = do
 #ifndef mingw32_HOST_OS
+	lock lockfile mode = do
 		l <- noUmask mode $ createFile lockfile mode
 		waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0)
 		return l
 #else
+	lock lockfile _mode = do
 		writeFile lockfile ""
 		return lockfile
 #endif
diff --git a/Annex/LockPool.hs b/Annex/LockPool.hs
--- a/Annex/LockPool.hs
+++ b/Annex/LockPool.hs
@@ -14,7 +14,9 @@
 
 import Common.Annex
 import Annex
+#ifndef mingw32_HOST_OS
 import Annex.Perms
+#endif
 
 {- Create a specified lock file, and takes a shared lock. -}
 lockFile :: FilePath -> Annex ()
diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs
--- a/Annex/Ssh.hs
+++ b/Annex/Ssh.hs
@@ -19,11 +19,13 @@
 
 import Common.Annex
 import Annex.LockPool
-import Annex.Perms
 import qualified Build.SysConfig as SysConfig
 import qualified Annex
 import Config
 import Utility.Env
+#ifndef mingw32_HOST_OS
+import Annex.Perms
+#endif
 
 {- Generates parameters to ssh to a given host (or user@host) on a given
  - port, with connection caching. -}
diff --git a/Assistant/DeleteRemote.hs b/Assistant/DeleteRemote.hs
--- a/Assistant/DeleteRemote.hs
+++ b/Assistant/DeleteRemote.hs
@@ -18,7 +18,7 @@
 import qualified Remote
 import Remote.List
 import qualified Git.Command
-import qualified Git.Version
+import qualified Git.BuildVersion
 import Logs.Trust
 import qualified Annex
 
@@ -39,7 +39,7 @@
 			[ Param "remote"
 			-- name of this subcommand changed
 			, Param $
-				if Git.Version.older "1.8.0"
+				if Git.BuildVersion.older "1.8.0"
 					then "rm"
 					else "remove"
 			, Param (Remote.name remote)
diff --git a/Assistant/Install/Menu.o b/Assistant/Install/Menu.o
Binary files a/Assistant/Install/Menu.o and b/Assistant/Install/Menu.o differ
diff --git a/Assistant/Threads/Committer.hs b/Assistant/Threads/Committer.hs
--- a/Assistant/Threads/Committer.hs
+++ b/Assistant/Threads/Committer.hs
@@ -22,7 +22,7 @@
 import qualified Annex.Queue
 import qualified Git.Command
 import qualified Git.LsFiles
-import qualified Git.Version
+import qualified Git.BuildVersion
 import qualified Command.Add
 import Utility.ThreadScheduler
 import qualified Utility.Lsof as Lsof
@@ -234,9 +234,9 @@
 		, Param "--no-verify"
 		]
 	nomessage ps
-		| Git.Version.older "1.7.2" =
+		| Git.BuildVersion.older "1.7.2" =
 			Param "-m" : Param "autocommit" : ps
-		| Git.Version.older "1.7.8" =
+		| Git.BuildVersion.older "1.7.8" =
 			Param "--allow-empty-message" :
 			Param "-m" : Param "" : ps
 		| otherwise =
diff --git a/Assistant/Threads/Watcher.hs b/Assistant/Threads/Watcher.hs
--- a/Assistant/Threads/Watcher.hs
+++ b/Assistant/Threads/Watcher.hs
@@ -1,11 +1,11 @@
 {- git-annex assistant tree watcher
  -
- - Copyright 2012 Joey Hess <joey@kitenet.net>
+ - Copyright 2012-2013 Joey Hess <joey@kitenet.net>
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
 
-{-# LANGUAGE DeriveDataTypeable, CPP #-}
+{-# LANGUAGE DeriveDataTypeable, BangPatterns, CPP #-}
 
 module Assistant.Threads.Watcher (
 	watchThread,
@@ -33,6 +33,7 @@
 import Annex.Direct
 import Annex.Content.Direct
 import Annex.CatFile
+import Annex.CheckIgnore
 import Annex.Link
 import Annex.FileMatcher
 import Annex.ReplaceFile
@@ -141,6 +142,8 @@
 
 		return (True, r)
 
+{- Hardcoded ignores, passed to the DirWatcher so it can avoid looking
+ - at the entire .git directory. Does not include .gitignores. -}
 ignored :: FilePath -> Bool
 ignored = ig . takeFileName
   where
@@ -152,6 +155,12 @@
 #endif
 	ig _ = False
 
+unlessIgnored :: FilePath -> Assistant (Maybe Change) -> Assistant (Maybe Change)
+unlessIgnored file a = ifM (liftAnnex $ checkIgnored file)
+	( noChange
+	, a
+	)
+
 type Handler = FilePath -> Maybe FileStatus -> Assistant (Maybe Change)
 
 {- Runs an action handler, and if there was a change, adds it to the ChangeChan.
@@ -186,7 +195,9 @@
 
 onAdd :: FileMatcher -> Handler
 onAdd matcher file filestatus
-	| maybe False isRegularFile filestatus = add matcher file
+	| maybe False isRegularFile filestatus =
+		unlessIgnored file $
+			add matcher file
 	| otherwise = noChange
 
 {- In direct mode, add events are received for both new files, and
@@ -214,9 +225,10 @@
 					liftAnnex $ changedDirect key file
 					add matcher file
 				)
-		_ -> guardSymlinkStandin Nothing $ do
-			debug ["add direct", file]
-			add matcher file
+		_ -> unlessIgnored file $
+			guardSymlinkStandin Nothing $ do
+				debug ["add direct", file]
+				add matcher file
   where
  	{- On a filesystem without symlinks, we'll get changes for regular
 	 - files that git uses to stand-in for symlinks. Detect when
@@ -240,7 +252,7 @@
  - before adding it.
  -}
 onAddSymlink :: Bool -> Handler
-onAddSymlink isdirect file filestatus = do
+onAddSymlink isdirect file filestatus = unlessIgnored file $ do
 	linktarget <- liftIO (catchMaybeIO $ readSymbolicLink file)
 	kv <- liftAnnex (Backend.lookupFile file)
 	onAddSymlink' linktarget (fmap fst kv) isdirect file filestatus
diff --git a/Build/Configure.hs b/Build/Configure.hs
--- a/Build/Configure.hs
+++ b/Build/Configure.hs
@@ -17,6 +17,7 @@
 import Utility.Monad
 import Utility.Exception
 import Utility.ExternalSHA
+import qualified Git.Version
 
 tests :: [TestCase]
 tests =
@@ -121,10 +122,8 @@
 	middle = drop 1 . init
 
 getGitVersion :: Test
-getGitVersion = do
-	s <- readProcess "git" ["--version"] ""
-	let version = unwords $ drop 2 $ words $ head $ lines s
-	return $ Config "gitversion" (StringConfig version)
+getGitVersion = Config "gitversion" . StringConfig . show
+	<$> Git.Version.installed
 
 getSshConnectionCaching :: Test
 getSshConnectionCaching = Config "sshconnectioncaching" . BoolConfig <$>
diff --git a/Build/Configure.o b/Build/Configure.o
Binary files a/Build/Configure.o and b/Build/Configure.o differ
diff --git a/Build/DesktopFile.o b/Build/DesktopFile.o
Binary files a/Build/DesktopFile.o and b/Build/DesktopFile.o differ
diff --git a/Build/TestConfig.o b/Build/TestConfig.o
Binary files a/Build/TestConfig.o and b/Build/TestConfig.o differ
diff --git a/BuildFlags.hs b/BuildFlags.hs
--- a/BuildFlags.hs
+++ b/BuildFlags.hs
@@ -48,4 +48,7 @@
 #ifdef WITH_DNS
 	, "DNS"
 #endif
+#ifdef WITH_FEEDS
+	, "Feeds"
+#endif
 	]
diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,17 @@
+git-annex (4.20130815) unstable; urgency=low
+
+  * assistant, watcher: .gitignore files and other git ignores are now
+    honored, when git 1.8.4 or newer is installed.
+    (Thanks, Adam Spiers, for getting the necessary support into git for this.)
+  * importfeed: Ignores transient problems with feeds. Only exits nonzero
+    when a feed has repeatedly had a problems for at least 1 day.
+  * importfeed: Fix handling of dots in extensions.
+  * Windows: Added support for encrypted special remotes.
+  * Windows: Fixed permissions problem that prevented removing files
+    from directory special remote. Directory special remotes now fully usable.
+
+ -- Joey Hess <joeyh@debian.org>  Thu, 15 Aug 2013 10:14:33 +0200
+
 git-annex (4.20130802) unstable; urgency=low
 
   * dropunused behavior change: Now refuses to drop the last copy of a
diff --git a/CmdLine.hs b/CmdLine.hs
--- a/CmdLine.hs
+++ b/CmdLine.hs
@@ -17,7 +17,7 @@
 import qualified Data.Map as M
 import Control.Exception (throw)
 import System.Console.GetOpt
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 import System.Posix.Signals
 #endif
 
@@ -123,7 +123,7 @@
 {- Actions to perform each time ran. -}
 startup :: Annex Bool
 startup = liftIO $ do
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	void $ installHandler sigINT Default Nothing
 #endif
 	return True
diff --git a/Command/ImportFeed.hs b/Command/ImportFeed.hs
--- a/Command/ImportFeed.hs
+++ b/Command/ImportFeed.hs
@@ -13,6 +13,7 @@
 import qualified Data.Set as S
 import qualified Data.Map as M
 import Data.Char
+import Data.Time.Clock
 
 import Common.Annex
 import qualified Annex
@@ -23,6 +24,8 @@
 import qualified Utility.Format
 import Utility.Tmp
 import Command.AddUrl (addUrlFile, relaxedOption)
+import Annex.Perms
+import Backend.URL (fromUrl)
 
 def :: [Command]
 def = [notBareRepo $ withOptions [templateOption, relaxedOption] $
@@ -48,20 +51,30 @@
 	v <- findEnclosures url
 	case v of
 		Just l | not (null l) -> do
-			mapM_ (downloadEnclosure relaxed cache) l
+			ok <- all id
+				<$> mapM (downloadEnclosure relaxed cache) l
+			next $ cleanup url ok
+		_ -> do
+			feedProblem url "bad feed content"
 			next $ return True
-		_ -> stop
 
+cleanup :: URLString -> Bool -> CommandCleanup
+cleanup url ok = do
+	when ok $
+		clearFeedProblem url
+	return ok
+
 data ToDownload = ToDownload
 	{ feed :: Feed
+	, feedurl :: URLString
 	, item :: Item
 	, location :: URLString
 	}
 
-mkToDownload :: Feed -> Item -> Maybe ToDownload
-mkToDownload f i = case getItemEnclosure i of
+mkToDownload :: Feed -> URLString -> Item -> Maybe ToDownload
+mkToDownload f u i = case getItemEnclosure i of
 	Nothing -> Nothing
-	Just (enclosureurl, _, _) -> Just $ ToDownload f i enclosureurl
+	Just (enclosureurl, _, _) -> Just $ ToDownload f u i enclosureurl
 
 data Cache = Cache
 	{ knownurls :: S.Set URLString
@@ -80,13 +93,10 @@
 	ret s = return $ Cache s tmpl
 
 findEnclosures :: URLString -> Annex (Maybe [ToDownload])
-findEnclosures url = go =<< downloadFeed url
+findEnclosures url = extract <$> downloadFeed url
   where
-	go Nothing = do
-		warning $ "failed to parse feed " ++ url
-		return Nothing
-	go (Just f) = return $ Just $
-		mapMaybe (mkToDownload f) (feedItems f)
+	extract Nothing = Nothing
+	extract (Just f) = Just $ mapMaybe (mkToDownload f url) (feedItems f)
 
 {- Feeds change, so a feed download cannot be resumed. -}
 downloadFeed :: URLString -> Annex (Maybe Feed)
@@ -95,16 +105,15 @@
 	liftIO $ withTmpFile "feed" $ \f h -> do
 		fileEncoding h
 		ifM (Url.download url [] [] f)
-			( parseFeedString <$> hGetContentsStrict h
+			( liftIO $ parseFeedString <$> hGetContentsStrict h
 			, return Nothing
 			)
 
 {- Avoids downloading any urls that are already known to be associated
  - with a file in the annex, unless forced. -}
-downloadEnclosure :: Bool -> Cache -> ToDownload -> Annex ()
+downloadEnclosure :: Bool -> Cache -> ToDownload -> Annex Bool
 downloadEnclosure relaxed cache enclosure
-	| S.member url (knownurls cache) =
-		whenM forced go
+	| S.member url (knownurls cache) = ifM forced (go, return True)
 	| otherwise = go
   where
   	forced = Annex.getState Annex.force
@@ -112,13 +121,17 @@
 	go = do
 		dest <- makeunique (1 :: Integer) $ feedFile (template cache) enclosure
 		case dest of
-			Nothing -> noop
+			Nothing -> return True
 			Just f -> do
 				showStart "addurl" f
-				ifM (addUrlFile relaxed url f)
-					( showEndOk
-					, showEndFail
-					)
+				ok <- addUrlFile relaxed url f
+				if ok
+					then do
+						showEndOk
+						return True
+					else do
+						showEndFail
+						checkFeedBroken (feedurl enclosure)
 	{- Find a unique filename to save the url to.
 	 - If the file exists, prefixes it with a number.
 	 - When forced, the file may already exist and have the same
@@ -169,5 +182,41 @@
 	fieldMaybe k (Just v) = field k v
 
 	sanitize c
+		| c == '.' = c
 		| isSpace c || isPunctuation c || c == '/' = '_'
 		| otherwise = c
+
+{- Called when there is a problem with a feed.
+ - Throws an error if the feed is broken, otherwise shows a warning. -}
+feedProblem :: URLString -> String -> Annex ()
+feedProblem url message = ifM (checkFeedBroken url)
+	( error $ message ++ " (having repeated problems with this feed!)"
+	, warning $ "warning: " ++ message
+	)
+
+{- A feed is only broken if problems have occurred repeatedly, for at
+ - least 23 hours. -}
+checkFeedBroken :: URLString -> Annex Bool
+checkFeedBroken url = checkFeedBroken' url =<< feedState url
+checkFeedBroken' :: URLString -> FilePath -> Annex Bool
+checkFeedBroken' url f = do
+	prev <- maybe Nothing readish <$> liftIO (catchMaybeIO $ readFile f)
+	now <- liftIO getCurrentTime
+	case prev of
+		Nothing -> do
+			createAnnexDirectory (parentDir f)
+			liftIO $ writeFile f $ show now
+			return False
+		Just prevtime -> do
+			let broken = diffUTCTime now prevtime > 60 * 60 * 23
+			when broken $
+				-- Avoid repeatedly complaining about
+				-- broken feed.
+				clearFeedProblem url
+			return broken
+
+clearFeedProblem :: URLString -> Annex ()
+clearFeedProblem url = void $ liftIO . tryIO . removeFile =<< feedState url
+
+feedState :: URLString -> Annex FilePath
+feedState url = fromRepo . gitAnnexFeedState =<< fromUrl url Nothing
diff --git a/Config/Files.o b/Config/Files.o
Binary files a/Config/Files.o and b/Config/Files.o differ
diff --git a/Creds.hs b/Creds.hs
--- a/Creds.hs
+++ b/Creds.hs
@@ -15,7 +15,9 @@
 import Crypto
 import Types.Remote (RemoteConfig, RemoteConfigKey)
 import Remote.Helper.Encryptable (remoteCipher, embedCreds)
+#ifndef mingw32_HOST_OS
 import Utility.Env (setEnv)
+#endif
 
 import System.Environment
 import qualified Data.ByteString.Lazy.Char8 as L
@@ -107,7 +109,7 @@
 
 {- Stores a CredPair in the environment. -}
 setEnvCredPair :: CredPair -> CredPairStorage -> IO ()
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 setEnvCredPair (l, p) storage = do
 	set uenv l
 	set penv p
diff --git a/Git.hs b/Git.hs
--- a/Git.hs
+++ b/Git.hs
@@ -32,13 +32,15 @@
 ) where
 
 import Network.URI (uriPath, uriScheme, unEscapeString)
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 import System.Posix.Files
 #endif
 
 import Common
 import Git.Types
+#ifndef mingw32_HOST_OS
 import Utility.FileMode
+#endif
 
 {- User-visible description of a git repo. -}
 repoDescribe :: Repo -> String
@@ -131,7 +133,7 @@
 	ifM (catchBoolIO $ isexecutable hook)
 		( return $ Just hook , return Nothing )
   where
-#if __WINDOWS__
+#if mingw32_HOST_OS
 	isexecutable f = doesFileExist f
 #else
 	isexecutable f = isExecutable . fileMode <$> getFileStatus f
diff --git a/Git/BuildVersion.hs b/Git/BuildVersion.hs
new file mode 100644
--- /dev/null
+++ b/Git/BuildVersion.hs
@@ -0,0 +1,21 @@
+{- git build version
+ -
+ - Copyright 2011 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Git.BuildVersion where
+
+import Git.Version
+import qualified Build.SysConfig
+
+{- Using the version it was configured for avoids running git to check its
+ - version, at the cost that upgrading git won't be noticed.
+ - This is only acceptable because it's rare that git's version influences
+ - code's behavior. -}
+buildVersion :: GitVersion
+buildVersion = normalize Build.SysConfig.gitversion
+
+older :: String -> Bool
+older n = buildVersion < normalize n 
diff --git a/Git/CatFile.hs b/Git/CatFile.hs
--- a/Git/CatFile.hs
+++ b/Git/CatFile.hs
@@ -93,10 +93,10 @@
 			, Param "-p"
 			, Param query
 			] repo
-		(_, Just h, _, pid) <- withNullHandle $ \null -> 
+		(_, Just h, _, pid) <- withNullHandle $ \h -> 
 			createProcess p
 				{ std_out = CreatePipe
-				, std_err = UseHandle null
+				, std_err = UseHandle h
 				}
 		fileEncoding h
 		content <- L.hGetContents h
diff --git a/Git/CheckAttr.hs b/Git/CheckAttr.hs
--- a/Git/CheckAttr.hs
+++ b/Git/CheckAttr.hs
@@ -10,7 +10,7 @@
 import Common
 import Git
 import Git.Command
-import qualified Git.Version
+import qualified Git.BuildVersion
 import qualified Utility.CoProcess as CoProcess
 
 type CheckAttrHandle = (CoProcess.CoProcessHandle, [Attr], String)
@@ -54,7 +54,7 @@
 	 - With newer git, git check-attr chokes on some absolute
 	 - filenames, and the bugs that necessitated them were fixed,
 	 - so use relative filenames. -}
-	oldgit = Git.Version.older "1.7.7"
+	oldgit = Git.BuildVersion.older "1.7.7"
 	file'
 		| oldgit = absPathFrom cwd file
 		| otherwise = relPathDirToFile cwd $ absPathFrom cwd file
diff --git a/Git/CheckIgnore.hs b/Git/CheckIgnore.hs
new file mode 100644
--- /dev/null
+++ b/Git/CheckIgnore.hs
@@ -0,0 +1,71 @@
+{- git check-ignore interface
+ -
+ - Copyright 2013 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Git.CheckIgnore (
+	CheckIgnoreHandle,
+	checkIgnoreStart,
+	checkIgnoreStop,
+	checkIgnored
+) where
+
+import Common
+import Git
+import Git.Command
+import qualified Git.Version
+import qualified Utility.CoProcess as CoProcess
+
+import System.IO.Error
+
+type CheckIgnoreHandle = CoProcess.CoProcessHandle
+
+{- Starts git check-ignore running, and returns a handle.
+ -
+ - This relies on git check-ignore --non-matching -v outputting
+ - lines for both matching an non-matching files. Also relies on
+ - GIT_FLUSH behavior flushing the output buffer when git check-ignore
+ - is piping to us.
+ -
+ - The first version of git to support what we need is 1.8.4.
+ - Nothing is returned if an older git is installed.
+ -}
+checkIgnoreStart :: Repo -> IO (Maybe CheckIgnoreHandle)
+checkIgnoreStart repo = ifM supportedGitVersion
+	( Just <$> (CoProcess.rawMode =<< gitCoProcessStart True params repo)
+	, return Nothing
+	)
+  where
+	params =
+		[ Param "check-ignore" 
+		, Params "-z --stdin --verbose --non-matching"
+		]
+
+supportedGitVersion :: IO Bool
+supportedGitVersion = do
+	v <- Git.Version.installed
+	return $ v >= Git.Version.normalize "1.8.4"
+
+checkIgnoreStop :: CheckIgnoreHandle -> IO ()
+checkIgnoreStop = CoProcess.stop
+
+{- Returns True if a file is ignored. -}
+checkIgnored :: CheckIgnoreHandle -> FilePath -> IO Bool
+checkIgnored h file = CoProcess.query h send (receive "")
+  where
+	send to = do
+		hPutStr to $ file ++ "\0"
+		hFlush to
+	receive c from = do
+		s <- hGetSomeString from 1024
+		if null s
+			then eofError
+			else do
+				let v = c ++ s
+				maybe (receive v from) return (parse v)
+	parse s = case segment (== '\0') s of
+		(_source:_line:pattern:_pathname:_eol:[]) -> Just $ not $ null pattern
+		_ -> Nothing
+	eofError = ioError $ mkIOError userErrorType "git cat-file EOF" Nothing Nothing
diff --git a/Git/CurrentRepo.hs b/Git/CurrentRepo.hs
--- a/Git/CurrentRepo.hs
+++ b/Git/CurrentRepo.hs
@@ -13,7 +13,9 @@
 import Git.Types
 import Git.Construct
 import qualified Git.Config
+#ifndef mingw32_HOST_OS
 import Utility.Env
+#endif
 
 {- Gets the current git repository.
  -
@@ -40,8 +42,8 @@
 				setCurrentDirectory d
 			return $ addworktree wt r
   where
-	pathenv s = do
 #ifndef mingw32_HOST_OS
+	pathenv s = do
 		v <- getEnv s
 		case v of
 			Just d -> do
@@ -49,7 +51,7 @@
 				Just <$> absPath d
 			Nothing -> return Nothing
 #else
-		return Nothing
+	pathenv _ = return Nothing
 #endif
 
 	configure Nothing (Just r) = Git.Config.read r
diff --git a/Git/Merge.hs b/Git/Merge.hs
--- a/Git/Merge.hs
+++ b/Git/Merge.hs
@@ -10,7 +10,7 @@
 import Common
 import Git
 import Git.Command
-import Git.Version
+import Git.BuildVersion
 
 {- Avoids recent git's interactive merge. -}
 mergeNonInteractive :: Ref -> Repo -> IO Bool
diff --git a/Git/Version.hs b/Git/Version.hs
--- a/Git/Version.hs
+++ b/Git/Version.hs
@@ -1,6 +1,6 @@
-{- git version checking
+{- git versions
  -
- - Copyright 2011 Joey Hess <joey@kitenet.net>
+ - Copyright 2011, 2013 Joey Hess <joey@kitenet.net>
  -
  - Licensed under the GNU GPL version 3 or higher.
  -}
@@ -8,24 +8,29 @@
 module Git.Version where
 
 import Common
-import qualified Build.SysConfig
 
-{- Using the version it was configured for avoids running git to check its
- - version, at the cost that upgrading git won't be noticed.
- - This is only acceptable because it's rare that git's version influences
- - code's behavior. -}
-version :: String
-version = Build.SysConfig.gitversion
+data GitVersion = GitVersion String Integer
+	deriving (Eq)
 
-older :: String -> Bool
-older v = normalize version < normalize v
+instance Ord GitVersion where
+	compare (GitVersion _ x) (GitVersion _ y) = compare x y
 
+instance Show GitVersion where
+	show (GitVersion s _) = s
+
+installed :: IO GitVersion
+installed = normalize . extract <$> readProcess "git" ["--version"]
+  where
+  	extract s = case lines s of
+		[] -> ""
+		(l:_) -> unwords $ drop 2 $ words l
+
 {- To compare dotted versions like 1.7.7 and 1.8, they are normalized to
  - a somewhat arbitrary integer representation. -}
-normalize :: String -> Integer
-normalize = sum . mult 1 . reverse .
-		extend precision . take precision .
-		map readi . split "."
+normalize :: String -> GitVersion
+normalize v = GitVersion v $ 
+	sum $ mult 1 $ reverse $ extend precision $ take precision $
+		map readi $ split "." v
   where
 	extend n l = l ++ replicate (n - length l) 0
 	mult _ [] = []
diff --git a/Git/Version.o b/Git/Version.o
new file mode 100644
Binary files /dev/null and b/Git/Version.o differ
diff --git a/GitAnnex.hs b/GitAnnex.hs
--- a/GitAnnex.hs
+++ b/GitAnnex.hs
@@ -23,7 +23,7 @@
 import qualified Command.FromKey
 import qualified Command.DropKey
 import qualified Command.TransferKey
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 import qualified Command.TransferKeys
 #endif
 import qualified Command.ReKey
@@ -118,7 +118,7 @@
 	, Command.FromKey.def
 	, Command.DropKey.def
 	, Command.TransferKey.def
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	, Command.TransferKeys.def
 #endif
 	, Command.ReKey.def
diff --git a/Init.hs b/Init.hs
--- a/Init.hs
+++ b/Init.hs
@@ -26,21 +26,23 @@
 import Logs.UUID
 import Annex.Version
 import Annex.UUID
-import Utility.UserInfo
 import Utility.Shell
-import Utility.FileMode
 import Config
 import Annex.Direct
 import Annex.Content.Direct
 import Annex.Environment
 import Backend
+#ifndef mingw32_HOST_OS
+import Utility.UserInfo
+import Utility.FileMode
+#endif
 
 genDescription :: Maybe String -> Annex String
 genDescription (Just d) = return d
 genDescription Nothing = do
 	reldir <- liftIO . relHome =<< fromRepo Git.repoPath
 	hostname <- fromMaybe "" <$> liftIO getHostname
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	let at = if null hostname then "" else "@"
 	username <- liftIO myUserName
 	return $ concat [username, at, hostname, ":", reldir]
@@ -129,7 +131,7 @@
  - or removing write access from files. -}
 probeCrippledFileSystem :: Annex Bool
 probeCrippledFileSystem = do
-#ifdef __WINDOWS__
+#ifdef mingw32_HOST_OS
 	return True
 #else
 	tmp <- fromRepo gitAnnexTmpDir
@@ -177,7 +179,7 @@
 
 probeFifoSupport :: Annex Bool
 probeFifoSupport = do
-#ifdef __WINDOWS__
+#ifdef mingw32_HOST_OS
 	return False
 #else
 	tmp <- fromRepo gitAnnexTmpDir
diff --git a/Limit.hs b/Limit.hs
--- a/Limit.hs
+++ b/Limit.hs
@@ -35,8 +35,10 @@
 import Text.Regex.TDFA
 import Text.Regex.TDFA.String
 #else
+#ifndef mingw32_HOST_OS
 import System.Path.WildMatch
 import Types.FileMatcher
+#endif
 #endif
 
 type MatchFiles = AssumeNotPresent -> FileInfo -> Annex Bool
diff --git a/Locations.hs b/Locations.hs
--- a/Locations.hs
+++ b/Locations.hs
@@ -28,6 +28,8 @@
 	gitAnnexFsckState,
 	gitAnnexTransferDir,
 	gitAnnexCredsDir,
+	gitAnnexFeedStateDir,
+	gitAnnexFeedState,
 	gitAnnexMergeDir,
 	gitAnnexJournalDir,
 	gitAnnexJournalLock,
@@ -189,6 +191,13 @@
  - remotes. -}
 gitAnnexCredsDir :: Git.Repo -> FilePath
 gitAnnexCredsDir r = addTrailingPathSeparator $ gitAnnexDir r </> "creds"
+
+{- .git/annex/feeds/ is used to record per-key (url) state by importfeeds -}
+gitAnnexFeedStateDir :: Git.Repo -> FilePath
+gitAnnexFeedStateDir r = addTrailingPathSeparator $ gitAnnexDir r </> "feedstate"
+
+gitAnnexFeedState :: Key -> Git.Repo -> FilePath
+gitAnnexFeedState k r = gitAnnexFeedStateDir r </> keyFile k
 
 {- .git/annex/merge/ is used for direct mode merges. -}
 gitAnnexMergeDir :: Git.Repo -> FilePath
diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs
--- a/Logs/Transfer.hs
+++ b/Logs/Transfer.hs
@@ -129,8 +129,8 @@
 			unless ok $ recordFailedTransfer t info
 			return ok
   where
-	prep tfile mode info = do
 #ifndef mingw32_HOST_OS
+	prep tfile mode info = do
 		mfd <- catchMaybeIO $
 			openFd (transferLockFile tfile) ReadWrite (Just mode)
 				defaultFileFlags { trunc = True }
@@ -145,6 +145,7 @@
 						void $ tryIO $ writeTransferInfoFile info tfile
 						return (mfd, False)
 #else
+	prep tfile _mode info = do
 		mfd <- catchMaybeIO $ do
 			writeFile (transferLockFile tfile) ""
 			writeTransferInfoFile info tfile
diff --git a/Remote/Directory.hs b/Remote/Directory.hs
--- a/Remote/Directory.hs
+++ b/Remote/Directory.hs
@@ -231,6 +231,11 @@
 remove :: FilePath -> Key -> Annex Bool
 remove d k = liftIO $ do
 	void $ tryIO $ allowWrite dir
+#ifdef mingw32_HOST_OS
+	{- Windows needs the files inside the directory to be writable
+	 - before it can delete them. -}
+	void $ tryIO $ mapM_ allowWrite =<< dirContents dir
+#endif
 	catchBoolIO $ do
 		removeDirectoryRecursive dir
 		return True
diff --git a/Remote/Git.hs b/Remote/Git.hs
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -17,7 +17,6 @@
 import Control.Exception.Extensible
 
 import Common.Annex
-import Utility.CopyFile
 import Utility.Rsync
 import Remote.Helper.Ssh
 import Annex.Ssh
@@ -44,6 +43,9 @@
 import qualified Fields
 import Logs.Location
 import Utility.Metered
+#ifndef mingw32_HOST_OS
+import Utility.CopyFile
+#endif
 
 import Control.Concurrent
 import Control.Concurrent.MSampleVar
@@ -360,8 +362,8 @@
 		bracketIO noop (const $ tryIO $ killThread tid) (const $ a feeder)
 
 copyFromRemoteCheap :: Remote -> Key -> FilePath -> Annex Bool
-copyFromRemoteCheap r key file
 #ifndef mingw32_HOST_OS
+copyFromRemoteCheap r key file
 	| not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do
 		loc <- liftIO $ gitAnnexLocation key (repo r) $
 			fromJust $ remoteGitConfig $ gitconfig r
@@ -371,8 +373,10 @@
 			( copyFromRemote' r key Nothing file
 			, return False
 			)
-#endif
 	| otherwise = return False
+#else
+copyFromRemoteCheap _ _ _ = return False
+#endif
 
 {- Tries to copy a key's content to a remote's annex. -}
 copyToRemote :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
diff --git a/Remote/Helper/Hooks.hs b/Remote/Helper/Hooks.hs
--- a/Remote/Helper/Hooks.hs
+++ b/Remote/Helper/Hooks.hs
@@ -15,7 +15,9 @@
 import Types.Remote
 import qualified Annex
 import Annex.LockPool
+#ifndef mingw32_HOST_OS
 import Annex.Perms
+#endif
 
 {- Modifies a remote's access functions to first run the
  - annex-start-command hook, and trigger annex-stop-command on shutdown.
@@ -71,8 +73,8 @@
 		run starthook
 
 		Annex.addCleanup (remoteid ++ "-stop-command") $ runstop lck
-	runstop lck = do
 #ifndef __WINDOWS__
+	runstop lck = do
 		-- Drop any shared lock we have, and take an
 		-- exclusive lock, without blocking. If the lock
 		-- succeeds, we're the only process using this remote,
@@ -88,5 +90,5 @@
 			Right _ -> run stophook
 		liftIO $ closeFd fd
 #else
-		run stophook
+	runstop _lck = run stophook
 #endif
diff --git a/Setup.o b/Setup.o
Binary files a/Setup.o and b/Setup.o differ
diff --git a/Test.hs b/Test.hs
--- a/Test.hs
+++ b/Test.hs
@@ -58,7 +58,7 @@
 import qualified Utility.Gpg
 import qualified Utility.Matcher
 import qualified Utility.Exception
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 import qualified GitAnnex
 #endif
 
@@ -75,7 +75,7 @@
 	putStrLn "  (Do not be alarmed by odd output here; it's normal."
         putStrLn "   wait for the last line to see how it went.)"
 	rs <- runhunit =<< prepare False
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	directrs <- runhunit =<< prepare True
 #else
 	-- Windows is only going to use direct mode, so don't test twice.
@@ -221,7 +221,7 @@
 		git_annex env "add" ["dir"] @? "add of subdir failed"
 		createDirectory "dir2"
 		writeFile ("dir2" </> "foo") $ content annexedfile
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 		{- This does not work on Windows, for whatever reason. -}
 		setCurrentDirectory "dir"
 		git_annex env "add" [".." </> "dir2"] @? "add of ../subdir failed"
@@ -666,7 +666,6 @@
 						boolSystem "git" [Params "remote add r3", File ("../../" ++ r3)] @? "remote add"
 					git_annex env "get" [annexedfile] @? "get failed"
 					boolSystem "git" [Params "remote rm origin"] @? "remote rm"
-#ifndef __WINDOWS__
 				forM_ [r3, r2, r1] $ \r -> indir env r $
 					git_annex env "sync" [] @? "sync failed"
 				forM_ [r3, r2] $ \r -> indir env r $
@@ -678,7 +677,6 @@
 					 - mangled location log data and it
 					 - thought the file was still in r2 -}
 					git_annex_expectoutput env "find" ["--in", "r2"] []
-#endif
 
 {- Regression test for the automatic conflict resolution bug fixed
  - in f4ba19f2b8a76a1676da7bb5850baa40d9c388e2. -}
@@ -707,7 +705,6 @@
 						git_annex env "unlock" [annexedfile] @? "unlock failed"		
 						writeFile annexedfile newcontent
 					)
-#ifndef __WINDOWS__
 			{- Sync twice in r1 so it gets the conflict resolution
 			 - update from r2 -}
 			forM_ [r1, r2, r1] $ \r -> indir env r $ do
@@ -721,7 +718,6 @@
 			 - been put in it. -}
 			forM_ [r1, r2] $ \r -> indir env r $ do
 			 	git_annex env "get" [] @? "unable to get all files after merge conflict resolution in " ++ rname r
-#endif
 
 test_map :: TestEnv -> Test
 test_map env = "git-annex map" ~: intmpclonerepo env $ do
@@ -761,7 +757,7 @@
 
 test_hook_remote :: TestEnv -> Test
 test_hook_remote env = "git-annex hook remote" ~: intmpclonerepo env $ do
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	git_annex env "initremote" (words "foo type=hook encryption=none hooktype=foo") @? "initremote failed"
 	createDirectory dir
 	git_config "annex.foo-store-hook" $
@@ -802,17 +798,14 @@
 	annexed_present annexedfile
 	git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed"
 	annexed_notpresent annexedfile
-#ifndef __WINDOWS__
-	-- moving from directory special remote fails on Windows TODO
 	git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from directory remote failed"
 	annexed_present annexedfile
 	not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail"
 	annexed_present annexedfile
-#endif
 
 test_rsync_remote :: TestEnv -> Test
 test_rsync_remote env = "git-annex rsync remote" ~: intmpclonerepo env $ do
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	createDirectory "dir"
 	git_annex env "initremote" (words $ "foo type=rsync encryption=none rsyncurl=dir") @? "initremote failed"
 	git_annex env "get" [annexedfile] @? "get of file failed"
@@ -849,7 +842,7 @@
 -- gpg is not a build dependency, so only test when it's available
 test_crypto :: TestEnv -> Test
 test_crypto env = "git-annex crypto" ~: intmpclonerepo env $ whenM (Utility.Path.inPath Utility.Gpg.gpgcmd) $ do
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	Utility.Gpg.testTestHarness @? "test harness self-test failed"
 	Utility.Gpg.testHarness $ do
 		createDirectory "dir"
@@ -882,7 +875,7 @@
 -- (when the OS allows) so test coverage collection works.
 git_annex :: TestEnv -> String -> [String] -> IO Bool
 git_annex env command params = do
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	forM_ (M.toList env) $ \(var, val) ->
 		Utility.Env.setEnv var val True
 
diff --git a/Upgrade.hs b/Upgrade.hs
--- a/Upgrade.hs
+++ b/Upgrade.hs
@@ -11,7 +11,7 @@
 
 import Common.Annex
 import Annex.Version
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 import qualified Upgrade.V0
 import qualified Upgrade.V1
 #endif
@@ -20,7 +20,7 @@
 upgrade :: Annex Bool
 upgrade = go =<< getVersion
   where
-#ifndef __WINDOWS__
+#ifndef mingw32_HOST_OS
 	go (Just "0") = Upgrade.V0.upgrade
 	go (Just "1") = Upgrade.V1.upgrade
 #else
diff --git a/Utility/Applicative.o b/Utility/Applicative.o
Binary files a/Utility/Applicative.o and b/Utility/Applicative.o differ
diff --git a/Utility/Daemon.hs b/Utility/Daemon.hs
--- a/Utility/Daemon.hs
+++ b/Utility/Daemon.hs
@@ -10,13 +10,14 @@
 module Utility.Daemon where
 
 import Common
+#ifndef mingw32_HOST_OS
 import Utility.LogFile
+#endif
 
 #ifndef mingw32_HOST_OS
 import System.Posix
 #else
 import System.PosixCompat
-import System.Posix.Types
 #endif
 
 {- Run an action as a daemon, with all output sent to a file descriptor.
diff --git a/Utility/Env.o b/Utility/Env.o
Binary files a/Utility/Env.o and b/Utility/Env.o differ
diff --git a/Utility/FileSystemEncoding.o b/Utility/FileSystemEncoding.o
Binary files a/Utility/FileSystemEncoding.o and b/Utility/FileSystemEncoding.o differ
diff --git a/Utility/FreeDesktop.o b/Utility/FreeDesktop.o
Binary files a/Utility/FreeDesktop.o and b/Utility/FreeDesktop.o differ
diff --git a/Utility/Gpg.hs b/Utility/Gpg.hs
--- a/Utility/Gpg.hs
+++ b/Utility/Gpg.hs
@@ -9,16 +9,21 @@
 
 module Utility.Gpg where
 
-import System.Posix.Types
 import Control.Applicative
 import Control.Concurrent
-import Control.Exception (bracket)
-import System.Path
 
 import Common
-import Utility.Env
 import qualified Build.SysConfig as SysConfig
 
+#ifndef mingw32_HOST_OS
+import System.Posix.Types
+import Control.Exception (bracket)
+import System.Path
+import Utility.Env
+#else
+import Utility.Tmp
+#endif
+
 newtype KeyIds = KeyIds [String]
 	deriving (Ord, Eq)
 
@@ -77,8 +82,8 @@
  - Note that to avoid deadlock with the cleanup stage,
  - the reader must fully consume gpg's input before returning. -}
 feedRead :: [CommandParam] -> String -> (Handle -> IO ()) -> (Handle -> IO a) -> IO a
-#ifndef mingw32_HOST_OS
 feedRead params passphrase feeder reader = do
+#ifndef mingw32_HOST_OS
 	-- pipe the passphrase into gpg on a fd
 	(frompipe, topipe) <- createPipe
 	void $ forkIO $ do
@@ -89,17 +94,23 @@
 	let passphrasefd = [Param "--passphrase-fd", Param $ show pfd]
 
 	params' <- stdParams $ [Param "--batch"] ++ passphrasefd ++ params
-	closeFd frompipe `after`
-		withBothHandles createProcessSuccess (proc gpgcmd params') go
-  where
-	go (to, from) = do
-		void $ forkIO $ do
-			feeder to
-			hClose to
-		reader from
+	closeFd frompipe `after` go params'
 #else
-feedRead = error "gpg feedRead not implemented on Windows" -- TODO
+	-- store the passphrase in a temp file for gpg
+	withTmpFile "gpg" $ \tmpfile h -> do
+		hPutStr h passphrase
+		hClose h
+		let passphrasefile = [Param "--passphrase-file", File tmpfile]
+		params' <- stdParams $ [Param "--batch"] ++ passphrasefile ++ params
+		go params'
 #endif
+  where
+	go params' = withBothHandles createProcessSuccess (proc gpgcmd params')
+		$ \(to, from) -> do
+			void $ forkIO $ do
+				feeder to
+				hClose to
+			reader from
 
 {- Finds gpg public keys matching some string. (Could be an email address,
  - a key id, or a name; See the section 'HOW TO SPECIFY A USER ID' of
diff --git a/Utility/LogFile.hs b/Utility/LogFile.hs
--- a/Utility/LogFile.hs
+++ b/Utility/LogFile.hs
@@ -58,8 +58,8 @@
 redirLog _ = error "redirLog TODO"
 #endif
 
-#ifndef mingw32_HOST_OS
 redir :: Fd -> Fd -> IO ()
+#ifndef mingw32_HOST_OS
 redir newh h = do
 	closeFd h
 	void $ dupTo newh h
diff --git a/Utility/Misc.hs b/Utility/Misc.hs
--- a/Utility/Misc.hs
+++ b/Utility/Misc.hs
@@ -17,9 +17,8 @@
 import Control.Applicative
 #ifndef mingw32_HOST_OS
 import System.Posix.Process (getAnyProcessStatus)
-#endif
-
 import Utility.Exception
+#endif
 
 {- A version of hgetContents that is not lazy. Ensures file is 
  - all read before it gets closed. -}
diff --git a/Utility/Misc.o b/Utility/Misc.o
Binary files a/Utility/Misc.o and b/Utility/Misc.o differ
diff --git a/Utility/OSX.o b/Utility/OSX.o
Binary files a/Utility/OSX.o and b/Utility/OSX.o differ
diff --git a/Utility/PartialPrelude.o b/Utility/PartialPrelude.o
Binary files a/Utility/PartialPrelude.o and b/Utility/PartialPrelude.o differ
diff --git a/Utility/Process.hs b/Utility/Process.hs
--- a/Utility/Process.hs
+++ b/Utility/Process.hs
@@ -42,9 +42,9 @@
 import Control.Concurrent
 import qualified Control.Exception as E
 import Control.Monad
-import Data.Maybe
 #ifndef mingw32_HOST_OS
 import System.Posix.IO
+import Data.Maybe
 #endif
 
 import Utility.Misc
diff --git a/Utility/UserInfo.o b/Utility/UserInfo.o
Binary files a/Utility/UserInfo.o and b/Utility/UserInfo.o differ
diff --git a/debian/.changelog.swp b/debian/.changelog.swp
deleted file mode 100644
Binary files a/debian/.changelog.swp and /dev/null differ
diff --git a/debian/changelog b/debian/changelog
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+git-annex (4.20130815) unstable; urgency=low
+
+  * assistant, watcher: .gitignore files and other git ignores are now
+    honored, when git 1.8.4 or newer is installed.
+    (Thanks, Adam Spiers, for getting the necessary support into git for this.)
+  * importfeed: Ignores transient problems with feeds. Only exits nonzero
+    when a feed has repeatedly had a problems for at least 1 day.
+  * importfeed: Fix handling of dots in extensions.
+  * Windows: Added support for encrypted special remotes.
+  * Windows: Fixed permissions problem that prevented removing files
+    from directory special remote. Directory special remotes now fully usable.
+
+ -- Joey Hess <joeyh@debian.org>  Thu, 15 Aug 2013 10:14:33 +0200
+
 git-annex (4.20130802) unstable; urgency=low
 
   * dropunused behavior change: Now refuses to drop the last copy of a
diff --git a/doc/assistant/.release_notes.mdwn.swp b/doc/assistant/.release_notes.mdwn.swp
deleted file mode 100644
Binary files a/doc/assistant/.release_notes.mdwn.swp and /dev/null differ
diff --git a/doc/assistant/release_notes.mdwn b/doc/assistant/release_notes.mdwn
--- a/doc/assistant/release_notes.mdwn
+++ b/doc/assistant/release_notes.mdwn
@@ -1,3 +1,15 @@
+## version 4.20130802
+
+This release fixes several bugs, including a reversion introduced in the last
+version that broke direct mode on Windows, Android, and other crippled
+filesystems. It contains a workaround for a bug in recent git pre-releases
+that broke handling of filenames containing spaces.
+It is a highly recommended upgrade.
+
+The webapp can now detect repositories that did not finish getting properly set
+up, and can recover from one common bug that broke local pairing and remote
+ssh server setups on systems using `ssh-agent`.
+
 ## version 4.20130723
 
 This release fixes some bugs. Notably it fixes a bug that could result in data
diff --git a/doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn b/doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn
@@ -0,0 +1,32 @@
+### Please describe the problem.
+
+Git annex can't use remotes with the type "file://" if the path contains spaces
+
+### What steps will reproduce the problem?
+
+- Create one repository with a space in the path (and initialize annex in it)
+- Clone that repo to an other directory (and initialize annex also in that)
+- add a file to the first repository in the annex way
+- chdir to the second repository and try to get that file, it won't work (also after git pull or git sync pull)
+
+Check this typescripts for a more detailed description
+
+<http://uz.sns.it/~enrico/git-annex-bugreport.txt>
+
+<http://pastebin.com/f8wkDNrG> (thanks mhameed for that data)
+
+
+### What version of git-annex are you using? On what operating system?
+
+I'm using debian testing (jessie) on a i386 machine.
+
+`git-annex` version: 4.20130521 (according to apt data and `git annex version`)
+
+`git-annex` build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+
+`git` version: 1.7.10.4
+
+
+### Please provide any additional information below.
+
+I don't use git annex assistant nor the webapp
diff --git a/doc/bugs/Using_a_revoked_GPG_key.mdwn b/doc/bugs/Using_a_revoked_GPG_key.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/Using_a_revoked_GPG_key.mdwn
@@ -0,0 +1,31 @@
+### Please describe the problem.
+git-annex refuses to use revoked GPG keys. This may be understandable for the initial remote setup, but it hit me when I tried to add a new key to a remote. The previous key has been revoked (because it has been superseded by the new one), and git-annex refused to reinvoke the shared key with both keys because one of them was revoked.
+
+Given the encryption model does not allow key replacement, it should not refuse to reencrypt using a revoked key. Maybe using `--expert` would help.
+
+### What steps will reproduce the problem?
+Encrypt a special remote with a key K1. Revoke key K1. Try to add key K2 with enableremote. git-annex will refuse to encrypt the shared key with the revoked one.
+
+### What version of git-annex are you using? On what operating system?
+git-annex version: 4.20130802-g1452ac3
+
+### Please provide any additional information below.
+
+[[!format sh """
+% git annex enableremote zoidberg-crypted encryption=42B8F7C2 
+enableremote zoidberg-crypted (encryption update) 
+You need a passphrase to unlock the secret key for
+user: "Samuel Tardieu <sam@rfc1149.net>"
+2048-bit ELG key, ID F0D70BAF, created 2002-05-31 (main key ID 1B80ADE6)
+
+gpg: NOTE: key has been revoked
+gpg: reason for revocation: Key is superseded
+gpg: revocation comment: Key superseded by 42B8F7C2
+gpg: revocation comment: (fingerprint 1D36 D924 8B33 DCAB 7BA5  BA44 7A30 BCF4 42B8 F7C2)
+gpg: F13322411B80ADE6: skipped: Unusable public key
+gpg: [stdin]: encryption failed: Unusable public key
+
+git-annex: user error (gpg ["--quiet","--trust-model","always","--encrypt","--no-encrypt-to","--no-default-recipient","--recipient","7A30BCF442B8F7C2","--recipient","F13322411B80ADE6"] exited 2)
+failed
+git-annex: enableremote: 1 failed
+"""]]
diff --git a/doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn b/doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn
@@ -0,0 +1,106 @@
+### Please describe the problem.
+
+A mere `git annex sync` does not go through the reachable remotes.
+
+### What steps will reproduce the problem?
+
+I do not know what could have put my repository in this state.
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 4.20130802-g1452ac3
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+local repository version: 4
+default repository version: 3
+supported repository versions: 3 4
+upgrade supported from repository versions: 0 1 2
+
+Linux dawn 3.10.3-1-ARCH #1 SMP PREEMPT Fri Jul 26 11:26:59 CEST 2013 x86_64 GNU/Linux
+
+### Please provide any additional information below.
+
+[[!format sh """
+% git annex status
+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+supported remote types: git S3 bup directory rsync web webdav glacier hook
+repository mode: direct
+trusted repositories: 1
+	f3cb4e8f-65f1-4ded-a6a1-abef64ddcff5 -- zoidberg (sam@git-annex:/media/git-annex/Music)
+semitrusted repositories: 5
+	00000000-0000-0000-0000-000000000001 -- web
+ 	063a31dc-542d-407f-a9ed-124479fa6354 -- here (dawn)
+ 	22b72aa6-058b-4622-8132-27aa2d8950dc -- arrakis (sam@arrakis:~/Music)
+ 	5b3a1abf-5e0b-41bc-a141-774d6236ec76 -- backup on old USB disk
+ 	6affec3c-fd26-11e2-9ddd-53f02e5ca176 -- music on eeePC
+untrusted repositories: 0
+transfers in progress: none
+available local disk space: 9.83 gigabytes (+1 megabyte reserved)
+local annex keys: 3947
+local annex size: 23.51 gigabytes
+known annex keys: 3965
+known annex size: 23.56 gigabytes
+bloom filter size: 16 mebibytes (0.8% full)
+backend usage: 
+	SHA256E: 7912
+
+% git remote -v
+arrakis	arrakis:Music (fetch)
+arrakis	arrakis:Music (push)
+zoidberg	ssh://git-annex@zoidberg.rfc1149.net:2222/~/Music (fetch)
+zoidberg	ssh://git-annex@zoidberg.rfc1149.net:2222/~/Music (push)
+
+# Note how here it does not seem to sync with any remote
+% git annex sync
+(Recording state in git...)
+commit  
+ok
+
+% git annex sync zoidberg
+(Recording state in git...)
+commit  
+ok
+pull zoidberg 
+ok
+push zoidberg 
+Everything up-to-date
+ok
+
+% git annex sync arrakis
+(Recording state in git...)
+commit  
+ok
+pull arrakis 
+From arrakis:Music
+   c1a24bd..ba060b7  git-annex  -> arrakis/git-annex
+   98b9a8e..be9c146  master     -> arrakis/master
+   e0df2be..be9c146  synced/master -> arrakis/synced/master
+ok
+
+# A nameless sync with debug turned on
+% git annex sync --debug        
+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","symbolic-ref","HEAD"]
+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","refs/heads/master"]
+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","git-annex"]
+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..ba060b7777413ab687d64771b5d6c2b36a072335","--oneline","-n1"]
+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..f401f2b7b67567862df7c5b8d304f52c3af43f4b","--oneline","-n1"]
+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..feaba7c5ea5f4ca73c123e6ea44ffd6333bf383e","--oneline","-n1"]
+[2013-08-06 10:59:57 CEST] chat: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","cat-file","--batch"]
+[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","ls-files","--stage","-z","--others","--exclude-standard","--","/home/sam/Music"]
+[2013-08-06 10:59:57 CEST] chat: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","cat-file","--batch"]
+(Recording state in git...)
+[2013-08-06 11:00:16 CEST] feed: xargs ["-0","git","--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","add","-f"]
+commit  
+[2013-08-06 11:00:16 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","commit","-m","git-annex automatic sync"]
+ok
+[2013-08-06 11:00:17 CEST] call: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--verify","-q","refs/heads/synced/master"]
+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/master..refs/heads/synced/master","--oneline","-n1"]
+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","git-annex"]
+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..ba060b7777413ab687d64771b5d6c2b36a072335","--oneline","-n1"]
+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..f401f2b7b67567862df7c5b8d304f52c3af43f4b","--oneline","-n1"]
+[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..feaba7c5ea5f4ca73c123e6ea44ffd6333bf383e","--oneline","-n1"]
+[2013-08-06 11:00:17 CEST] call: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","branch","-f","synced/master"]
+"""]]
+
+[[done]]
diff --git a/doc/bugs/assistant_ignore_.gitignore.mdwn b/doc/bugs/assistant_ignore_.gitignore.mdwn
--- a/doc/bugs/assistant_ignore_.gitignore.mdwn
+++ b/doc/bugs/assistant_ignore_.gitignore.mdwn
@@ -27,3 +27,5 @@
 > or a gitignore parser. --[[Joey]] 
 
 [[!tag /design/assistant]]
+
+> [[fixed|done]]; with git 1.8.4 the assistant honors .gitignore --[[Joey]]
diff --git a/doc/bugs/authentication_to_rsync.net_fails.mdwn b/doc/bugs/authentication_to_rsync.net_fails.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/authentication_to_rsync.net_fails.mdwn
@@ -0,0 +1,27 @@
+### Please describe the problem.
+
+Used assistant to "Add a cloud repository".  Supplied hostname, username in webapp. Directory "annex" port 22.
+Clicked on "Use this rsync.net repository" and got
+
+**********************
+ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
+ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
+ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
+Received disconnect from 69.43.165.7: 2: Too many authentication failures for 2440
+**********************
+
+### What steps will reproduce the problem?
+See above?  A simple "ssh user@host.rsync.net ls /usr/bin" reveals that indeed no ssh-askpass is available in that namespace.
+
+### What version of git-annex are you using? On what operating system?
+git-annex version: 4.20130521 on debian linux 7.1.
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+That log is empty.
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn b/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn
@@ -0,0 +1,6 @@
+I ran the assistant in a subdir in direct mode, and it seemed to move files from other places outside that subdir
+into it, and commit them there. These may have been files that needed to be committed, and it just staged them to the wrong place.
+
+I'm pretty sure this does not affect indirect mode.
+
+--[[Joey]]
diff --git a/doc/bugs/git-annex_opens_too_many_files.mdwn b/doc/bugs/git-annex_opens_too_many_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git-annex_opens_too_many_files.mdwn
@@ -0,0 +1,38 @@
+### Please describe the problem.
+After running git-annex some minutes, the websites is not responsible any more and it even crashes eventually.
+
+### What steps will reproduce the problem?
+Start the assistant.
+
+### What version of git-annex are you using? On what operating system?
+it-annex version: 4.20130802-g1452ac3
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+[2013-08-06 13:32:51 CEST] main: starting assistant version 4.20130802-g1452ac3                     
+                                                                                                    
+Already up-to-date.                                                                                 
+(scanning...) [2013-08-06 13:32:51 CEST] Watcher: Performing startup scan                           
+                                                                                                    
+Already up-to-date.                                                                                 
+(started...)                                                                                        
+git-annex: accept: resource exhausted (Too many open files)                                         
+[2013-08-06 19:50:37 CEST] read: git ["--git-dir=/home/christian/git-annex/.git","--work-tree=/home/+christian/git-annex","symbolic-ref","HEAD"]                                                        
+git-annex: runInteractiveProcess: pipe: Too many open files                                         
+[2013-08-06 19ND:ea5te1Wm:ao1tn1cS htCeaErtSFuTas]l  lcNbreaatcsWkha etcdcr:ha es/rhh:eo dmd:ee /tgc+eihctrt:ie sdct rineaeantt/wegoPirrtko- cacenosnnsen:xe /cr.tegisiootnu/                           
+racnen[ e2ex0x/1h:3a -uo0sp8te-en0dT6 e (m1Tp9oF:oi5 l1me:a:1n 1yr  eCosEpoSeuTnr] c feri eleaexdsh:+)a                                                                                                 
+ugsitte d[ "(-T-ogoi tm-adniyr =o/pheonm ef/iclhersi)s                                              
+tian/git-annex/.git","--work-tree=/home/christian/git-annex","symbolic-ref","HEAD"]                 
+git-annex: runInteractiveProcess: pipe: Too many open files                                         
+git-annex: git: createProcess: resource exhausted (Too many open files)                             
+[2013-08-06 19:51:11 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProces+s: resource exhausted (Too many open files)                                                        
+[2013-08-06 19:51:11 CEST] DaemonStatus: warning DaemonStatus crashed: /home/christian/git-annex/.gi+t/annex/: openTempFile: resource exhausted (Too many open files) 
+
+(system was asleep from 14:00 until 19:50)
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn b/doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn
@@ -0,0 +1,26 @@
+### Please describe the problem.
+I have a git annex clone on Andrew File System. I obtain an error when I try
+to add a file to the annex:
+
+git-annex: test: createLink: unsupported operation (Invalid cross-device link)
+
+### What steps will reproduce the problem?
+Create a test file with touch and add it with git annex add.
+
+### What version of git-annex are you using? On what operating system?
+git-annex 4.20130723 on Debian sid.
+
+### Please provide any additional information below.
+
+[[!format sh """
+gio@crack:~/nobackup/archive$ touch test
+gio@crack:~/nobackup/archive$ git annex add test
+add test 
+git-annex: test: createLink: unsupported operation (Invalid cross-device link)
+failed
+git-annex: add: 1 failed
+gio@crack:~/nobackup/archive$ logout
+"""]]
+
+It seems to me that AFS doesn't support hard links between different
+directories.
diff --git a/doc/bugs/immediately_drops_files.mdwn b/doc/bugs/immediately_drops_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/immediately_drops_files.mdwn
@@ -0,0 +1,222 @@
+### Please describe the problem.
+When I `git annex get` files in a certain directory, they are got, then are dropped.
+When I do the same in a different directory, then the files there remains (as expected).
+
+`git annex fsck` also fails on these files, but after that the problem persists.
+
+I'm not really sure where to look to see why this is happening, especially why only on some directories.
+The filesystem (ext4) this is on has several GB free.
+
+Looking at the (broken) symlinks, they are strange:
+
+[[!format sh """
+git annex fsck IMG_4230.JPG > /dev/null
+ls -l IMG_4230.JPG
+lrwxrwxrwx 1 walter walter 207 Aug 13 12:14 IMG_4230.JPG -> ../../../.git/annex/objects/86/KF/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG
+"""]]
+
+But then after getting it (and it being dropped somehow), the symlink is different (the number of ..s)
+
+[[!format sh """
+git annex get IMG_4230.JPG > /dev/null
+ls -l IMG_4230.JPG
+lrwxrwxrwx 1 walter walter 210 Aug 13 12:16 IMG_4230.JPG -> ../../../../.git/annex/objects/86/KF/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG
+"""]]
+
+
+
+### What steps will reproduce the problem?
+
+I'm not really sure; I will test later whether this happens on other computers.
+
+### What version of git-annex are you using? On what operating system?
+    git-annex version: 4.20130812-gc590455
+    build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS
+    local repository version: 3
+    default repository version: 3
+    supported repository versions: 3 4
+    upgrade supported from repository versions: 0 1 2
+
+On ubuntu 12.10
+
+
+--Walter
+
+### Please provide any additional information below.
+
+*output of git annex fsck*
+[[!format sh """
+git annex fsck 2013/08/01/IMG_4230.JPG
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-files","--cached","-z","--","2013/08/01/IMG_4230.JPG"]
+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"]
+fsck 2013/08/01/IMG_4230.JPG [2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","cat-file","--batch"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["config","--null","--list"]
+ok
+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-w","--stdin-paths","--no-filters"]
+[2013-08-13 12:01:25 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+(Recording state in git...)
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","write-tree"]
+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit-tree","78aca82f86ffb91bc841a3978f410e55aa6e0efe","-p","refs/heads/git-annex"]
+[2013-08-13 12:01:25 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-ref","refs/heads/git-annex","14908fedbd44917815dd013125b69def1f7f8f7c"]
+
+"""]]
+
+*output of git annex get* (output taken from daemon.log, as output from command does not include the dropping part)
+[[!format sh """
+git annex get 2013/08/01/IMG_4230.JPG
+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer starting: Download UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d" 2013/08/01/IMG_4230.JPG Nothing
+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer starting: Download UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d" 2013/08/01/IMG_4230.JPG Nothing
+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d", transferKey = Key {keyName = "bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG", keyBackendName = "SHA256E", keySize = Just 4209479, keyMtime = Nothing}}
+[2013-08-13 12:03:46 NZST] Watcher: add symlink 01/IMG_4230.JPG
+[2013-08-13 12:03:46 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]
+[2013-08-13 12:03:46 NZST] Committer: committing 1 changes
+[2013-08-13 12:03:46 NZST] Committer: Committing changes to git
+[2013-08-13 12:03:46 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 12:03:46 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]
+[2013-08-13 12:03:46 NZST] Pusher: Synok
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+drop 01/IMG_4230.JPG cing with Adata, b(checking cloud...) itbucket 
+[2013-08-13 12:03:46 NZST] Committer: dropped 01/IMG_4230.JPG (from here) (copies now 4) : file renamed
+[2013-08-13 12:03:46 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-w","--stdin-paths","--no-filters"]
+[2013-08-13 12:03:46 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","write-tree"]
+[2013-08-13 12:03:47 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit-tree","f288bfce8d133cc0ce00b65d48ca726809da34e6","-p","refs/heads/git-annex"]
+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-ref","refs/heads/git-annex","5a188246bda51207d12adf86c6d87568ca7076d7"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]
+[2013-08-13 12:03:47 NZST] Pusher: pushing to [Remote { name ="Adata" },Remote { name ="bitbucket" }]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]
+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master:synced/master"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] Watcher: add symlink 01/IMG_4230.JPG
+[2013-08-13 12:03:47 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]
+To /media/walter/327D522A6727FE79/Pictures
+   3afd101..5a18824  git-annex -> synced/git-annex
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] Committer: committing 1 changes
+[2013-08-13 12:03:48 NZST] Committer: Committing changes to git
+[2013-08-13 12:03:48 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]
+To git@bitbucket.org:waltersom/Pictures.git
+   3afd101..5a18824  git-annex -> synced/git-annex
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:03:58 NZST] Pusher: Syncing with Adata, bitbucket 
+[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]
+[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]
+[2013-08-13 12:03:58 NZST] Pusher: pushing to [Remote { name ="Adata" },Remote { name ="bitbucket" }]
+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]
+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master:synced/master"]
+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]
+Everything up-to-date
+[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master"]
+Everything up-to-date
+[2013-08-13 12:04:02 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]
+
+"""
+]]
+
+
+
+I tried removing the USB drive I had plugged in, and was able to get the file from S3, and it wasn't dropped.
+However, checking the logs, I see that it did try to drop the file, but was unable to verify numcopies, so gives up.
+Also odd, is that it doesn't suggest making the USB drive available, but `git annex whereis` knows that the drive does have it. Also, annex.numcopies is 1, and it got it from S3, so why can't it drop it on the computer?
+Or, why does it say that it needs two copies? `git config annex.numcopies` gives 1.
+
+[[!format sh """
+[2013-08-13 16:52:08 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Nothing
+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Just 65504
+[...]
+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Just 4192256
+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "be992080-b1db-11e1-8f79-1b10bb4092ef", transferKey = Key {keyName = "bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG", keyBackendName = "SHA256E", keySize = Just 4209479, keyMtime = Nothing}}
+[2013-08-13 16:54:06 NZST] Watcher: add symlink 01/IMG_4230.JPG
+[2013-08-13 16:54:06 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]
+[2013-08-13 16:54:06 NZST] Committer: committing 1 changes
+[2013-08-13 16:54:06 NZST] Committer: Committing changes to git
+[2013-08-13 16:54:06 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 16:54:06 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]
+[2013-08-13 16:54:06 
+  Could only verify the existence of 1 out of 2 necessary copies
+
+  Try making some of these repositories available:
+  	416aa28e-b1d4-11e1-9539-c39b14a3f7d2 -- timeline laptop
+   	f42d30a0-b1d2-11e1-8b32-3bdd169e3280 -- my desktop
+
+  (Use --force to override this check, or adjust annex.numcopies.)
+failed
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+drop 01/IMG_4230.JPG NZST] Pusher:(checking cloud...)  Syncing with bitbucket 
+(unsafe) [2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]
+[2013-08-13 16:54:07 NZST] Pusher: pushing to [Remote { name ="bitbucket" }]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 16:54:07 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 16:54:07 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..7b6b1c6c479a13f9d4ece135bdf3ba31bc484b31","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..11a0c19d7c79f3e574b81295782ab2820caea232","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5ebb3e46b8fc109c2966ceccdd716f469d94fcad","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]
+To git@bitbucket.org:waltersom/Pictures.git
+   5ebb3e4..7b6b1c6  git-annex -> synced/git-annex
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..7b6b1c6c479a13f9d4ece135bdf3ba31bc484b31","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..11a0c19d7c79f3e574b81295782ab2820caea232","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+"""]]
diff --git a/doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn b/doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn
@@ -0,0 +1,17 @@
+### Please describe the problem.
+When running importfeed on gitminutes <http://feeds.gitminutes.com/gitminutes-podcast> git-annex interprets the extension as "_mp3" rather than ".mp3" which means that renaming is needed for various audio players to accept the files.
+
+### What steps will reproduce the problem?
+git annex importfeed http://feeds.gitminutes.com/gitminutes-podcast --fast
+
+### What version of git-annex are you using? On what operating system?
+git-annex version: 4.20130802
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+local repository version: 3
+default repository version: 3
+supported repository versions: 3 4
+upgrade supported from repository versions: 0 1 2
+
+on Debian Sid
+
+> Already fixed in git. [[done]] --[[Joey]]
diff --git a/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn
@@ -0,0 +1,38 @@
+### Please describe the problem.
+
+Changing a file in a repository from a symlink to a normal file causes annex to create an annexed file from that typechange regardless of weather or not it was an annexed file.
+
+
+### What steps will reproduce the problem?
+
+    git init newrepo
+    cd newrepo && git annex init
+    touch realfile
+    git add .
+    git commit -m "added realfile"
+    mkdir newdir && cd newdir
+    ln -s ../realfile newfile
+    git add .
+    git commit -m "Added placeholder until we get assets from designers"
+    rm newfile
+    dd bs=1024 count=10000 if=/dev/zero of=newfile
+    git add .
+    git commit -m "Finally got assets from designers"
+    ls -la newfile
+    # lrwxrwxrwx 1 user user <date> newfile -> ../.git/annex/objects/XX/XX/UUID/UUID
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 4.20130802
+
+Ubuntu 12.04 LTS
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/test_suite_failure_on_samba_mount.mdwn b/doc/bugs/test_suite_failure_on_samba_mount.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/test_suite_failure_on_samba_mount.mdwn
@@ -0,0 +1,278 @@
+### Please describe the problem.
+
+`git annex test` show multiple failures on a samba mounted partition.
+
+### What steps will reproduce the problem?
+
+just run `git annex test` (in the mounted dir)
+
+### What version of git-annex are you using? On what operating system?
+
+4.20130521, built for architecture `armhf` by the Raspbian maintainers ("jessie" suite at the time of writing)
+
+### Please provide any additional information below.
+
+Here are the last lines of `git annex test` output; AFAICT they are the only lines mentioning failures. Before them the output mentions `+++ OK, passed 100 tests.`.
+
+[[!format text """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+Cases: 1  Tried: 0  Errors: 0  Failures: 0----------------------------------------------------------------------
+Now, some broader checks ...
+  (Do not be alarmed by odd output here; it's normal.
+   wait for the last line to see how it went.)
+----------------------------------------------------------------------
+init
+  Detected a crippled filesystem.
+  Enabling direct mode.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+                                          Cases: 1  Tried: 1  Errors: 0  Failures: 0
+Cases: 3  Tried: 0  Errors: 0  Failures: 0Cases: 3  Tried: 1  Errors: 0  Failures: 0----------------------------------------------------------------------
+add
+  Detected a crippled filesystem.
+  Enabling direct mode.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+Cases: 3  Tried: 2  Errors: 0  Failures: 0  Detected a crippled filesystem.
+  Enabling direct mode.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+error: unable to create temporary sha1 filename : No such file or directory
+
+git-annex: user error (git ["--git-dir=/media/freebox/.t/tmprepo0/.git","--work-tree=/media/freebox/.t/tmprepo0","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 1)
+                                          ### Failure in: git-annex add:2
+git annex init failed
+Cases: 3  Tried: 3  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0----------------------------------------------------------------------
+reinject
+  Detected a crippled filesystem.
+  Enabling direct mode.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+  Detected a crippled filesystem.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+                                          Cases: 1  Tried: 1  Errors: 0  Failures: 0
+Cases: 2  Tried: 0  Errors: 0  Failures: 0not supported in direct mode; skipping
+----------------------------------------------------------------------
+unannex
+  Detected a crippled filesystem.
+  Enabling direct mode.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+error: unable to create temporary sha1 filename : No such file or directory
+
+git-annex: user error (git ["--git-dir=/media/freebox/.t/tmprepo1/.git","--work-tree=/media/freebox/.t/tmprepo1","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 1)
+                                          ### Failure in: git-annex unannex:0:no content
+git annex init failed
+Cases: 2  Tried: 1  Errors: 0  Failures: 1  Detected a crippled filesystem.
+  Enabling direct mode.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+  Detected a crippled filesystem.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+                                          Cases: 2  Tried: 2  Errors: 0  Failures: 1
+Cases: 3  Tried: 0  Errors: 0  Failures: 0not supported in direct mode; skipping
+----------------------------------------------------------------------
+drop
+  Detected a crippled filesystem.
+  Enabling direct mode.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+error: unable to create temporary sha1 filename : No such file or directory
+
+git-annex: user error (git ["--git-dir=/media/freebox/.t/tmprepo2/.git","--work-tree=/media/freebox/.t/tmprepo2","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 1)
+                                          ### Failure in: git-annex drop:0:no remotes
+git annex init failed
+Cases: 3  Tried: 1  Errors: 0  Failures: 1  Detected a crippled filesystem.
+  Enabling direct mode.
+  Detected a filesystem without fifo support.
+  Disabling ssh connection caching.
+Cases: 3  Tried: 2  Errors: 0  Failures: 1/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex drop:2:untrusted remote
+git clone failed
+Cases: 3  Tried: 3  Errors: 0  Failures: 2
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex get
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex move
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex copy
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex unlock/lock
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 2  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex edit/commit:0
+git clone failed
+Cases: 2  Tried: 1  Errors: 0  Failures: 1/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex edit/commit:1
+git clone failed
+Cases: 2  Tried: 2  Errors: 0  Failures: 2
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex fix
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex trust/untrust/semitrust/dead
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 4  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex fsck:0
+git clone failed
+Cases: 4  Tried: 1  Errors: 0  Failures: 1/media/freebox/.t/tmprepo3/refs: No such file or directory
+                                          ### Failure in: git-annex fsck:1
+git clone failed
+Cases: 4  Tried: 2  Errors: 0  Failures: 2/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex fsck:2
+git clone failed
+Cases: 4  Tried: 3  Errors: 0  Failures: 3/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex fsck:3
+git clone failed
+Cases: 4  Tried: 4  Errors: 0  Failures: 4
+Cases: 2  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex migrate:0
+git clone failed
+Cases: 2  Tried: 1  Errors: 0  Failures: 1/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex migrate:1
+git clone failed
+Cases: 2  Tried: 2  Errors: 0  Failures: 2
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex unused/dropunused
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex describe
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex find
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex merge
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex status
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex version
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex sync
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: union merge regression
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: automatic conflict resolution
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex map
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex uninit
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex upgrade
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex whereis
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex hook remote
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex directory remote
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex rsync remote
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex bup remote
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+Cases: 1  Tried: 0  Errors: 0  Failures: 0/media/freebox/.t/tmprepo3/.git: No such file or directory
+                                          ### Failure in: git-annex crypto
+git clone failed
+Cases: 1  Tried: 1  Errors: 0  Failures: 1
+----------------------------------------------------------------------
+get
+----------------------------------------------------------------------
+move
+----------------------------------------------------------------------
+copy
+----------------------------------------------------------------------
+lock
+----------------------------------------------------------------------
+edit
+----------------------------------------------------------------------
+fix
+----------------------------------------------------------------------
+trust
+----------------------------------------------------------------------
+fsck
+----------------------------------------------------------------------
+migrate
+----------------------------------------------------------------------
+ unused
+----------------------------------------------------------------------
+describe
+----------------------------------------------------------------------
+find
+----------------------------------------------------------------------
+merge
+----------------------------------------------------------------------
+status
+----------------------------------------------------------------------
+version
+----------------------------------------------------------------------
+sync
+----------------------------------------------------------------------
+union merge regression
+----------------------------------------------------------------------
+conflict resolution
+----------------------------------------------------------------------
+map
+----------------------------------------------------------------------
+uninit
+----------------------------------------------------------------------
+upgrade
+----------------------------------------------------------------------
+whereis
+----------------------------------------------------------------------
+hook remote
+----------------------------------------------------------------------
+directory remote
+----------------------------------------------------------------------
+rsync remote
+----------------------------------------------------------------------
+bup remote
+----------------------------------------------------------------------
+crypto
+git-annex: .t/repo/.git/annex: removeDirectory: unsatisified constraints (Directory not empty)
+
+# End of transcript or log.
+"""]]
diff --git a/doc/bugs/unfinished_repos_in_webapp.mdwn b/doc/bugs/unfinished_repos_in_webapp.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/bugs/unfinished_repos_in_webapp.mdwn
@@ -0,0 +1,27 @@
+### Please describe the problem.
+
+Hi,  all excited that the new release fixes the unknown UUID issue in the Webapp I hurridly installed the latest versions.  
+
+Some progress in that the webapp now reports my missing/non-existent repo as an "unfinished repository" in the process of being setup.  I see a check status box that when clicked says "in progress please be patient".  Also I see the ssh config has changed to use IdentitiesOnly option.
+
+I had a go a deleting details via git-annex vicfg and directly editing the git-annex branch log files as detailed [here](http://git-annex.branchable.com/forum/Reappearing_repos_in_webapp_and_vicfg/).  But still no joy.  
+
+Any hints on what to do?  Nothing in the log seems to help...
+
+### What steps will reproduce the problem?
+
+Not sure anymore.
+
+### What version of git-annex are you using? On what operating system?
+
+Latest.
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+
+# End of transcript or log.
+"""]]
diff --git a/doc/design/assistant/blog/day_310__release_day.mdwn b/doc/design/assistant/blog/day_310__release_day.mdwn
--- a/doc/design/assistant/blog/day_310__release_day.mdwn
+++ b/doc/design/assistant/blog/day_310__release_day.mdwn
@@ -10,3 +10,9 @@
 
 Pleased that the git-cat-files bug was quickly fixed by Peff and has
 already been pulled into Junio's release tree!
+
+----
+
+This evening, I've added an interface around the new improved 
+`git check-ignore` in git 1.8.4. The assistant can finally honor `.gitignore`
+files!
diff --git a/doc/design/assistant/blog/day_311__Windows_porting.mdwn b/doc/design/assistant/blog/day_311__Windows_porting.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/design/assistant/blog/day_311__Windows_porting.mdwn
@@ -0,0 +1,10 @@
+Made two big improvements to the Windows port, in just a few hours.
+First, got gpg working, and encrypted special remotes work on Windows.
+Next, fixed a permissions problem that was breaking removing files
+from directory special remotes on Windows.
+(Also cleaned up a lot of compiler warnings on Windows.)
+
+I think I'm almost ready to move the Windows port from alpha to beta
+status. The only really bad problem that I know of with using it is that
+due to a lack of locking, it's not safe to run multiple git-annex
+commands at the same time in Windows.
diff --git a/doc/design/assistant/inotify.mdwn b/doc/design/assistant/inotify.mdwn
--- a/doc/design/assistant/inotify.mdwn
+++ b/doc/design/assistant/inotify.mdwn
@@ -14,14 +14,6 @@
 
 ## todo
 
-* Run niced and ioniced? Seems to make sense, this is a background job.
-* configurable option to only annex files meeting certian size or
-  filename criteria
-* option to check files not meeting annex criteria into git directly,
-  automatically
-* honor .gitignore, not adding files it excludes (difficult, probably
-  needs my own .gitignore parser to avoid excessive running of git commands
-  to check for ignored files)
 * There needs to be a way for a new version of git-annex, when installed,
   to restart any running watch or assistant daemons. Or for the daemons
   to somehow detect it's been upgraded and restart themselves. Needed
diff --git a/doc/design/assistant/polls/Android_default_directory.mdwn b/doc/design/assistant/polls/Android_default_directory.mdwn
--- a/doc/design/assistant/polls/Android_default_directory.mdwn
+++ b/doc/design/assistant/polls/Android_default_directory.mdwn
@@ -4,4 +4,4 @@
 want the first time they run it, but to save typing on android, anything
 that gets enough votes will be included in a list of choices as well.
 
-[[!poll open=yes expandable=yes 54 "/sdcard/annex" 5 "Whole /sdcard" 4 "DCIM directory (photos and videos only)" 1 "Same as for regular git-annex. ~/annex/"]]
+[[!poll open=yes expandable=yes 55 "/sdcard/annex" 5 "Whole /sdcard" 4 "DCIM directory (photos and videos only)" 1 "Same as for regular git-annex. ~/annex/"]]
diff --git a/doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment b/doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment
new file mode 100644
--- /dev/null
+++ b/doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://caust1c.myopenid.com/"
+ nickname="asbraithwaite"
+ subject="comment 7"
+ date="2013-08-12T18:06:21Z"
+ content="""
+Would it be safe to add largefiles to gitignore in direct mode?
+
+Can git-annex still track large files ignored by git?
+
+Thanks. :-)
+"""]]
diff --git a/doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment b/doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment
new file mode 100644
--- /dev/null
+++ b/doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="arand"
+ ip="130.243.226.21"
+ subject="comment 8"
+ date="2013-08-12T18:12:32Z"
+ content="""
+asbraithwaite:
+No, as far as I know it can not.
+"""]]
diff --git a/doc/forum/Accessing_files_directly_on__a_USB_device.mdwn b/doc/forum/Accessing_files_directly_on__a_USB_device.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Accessing_files_directly_on__a_USB_device.mdwn
@@ -0,0 +1,11 @@
+Using the assistant, I have created a repository on my laptop plus a synced repository on a USB disk. Looking into the first repository, I see my files accompanied by a .git directory. However, looking on the USB disk (e.g. /media/usb/annex), all I see is what looks like the content of a .git directory.
+
+This means that it is difficult to retrieve any file directly from this disk -- it has to be synced to another local repository first.
+
+Is there any way to change this ? E.g. to have a copy of the working tree, plus a .git directory, on the disk ?
+
+My use case: I have added plenty of media files to my repository. In addition to using the USB disk as a backup/medium for transfering these files to another computer, I'd like to be able to plug the disk to e.g. a media player and read the files directly from the tree, but it does not work at the moment.
+
+Is there anything I am missing ?
+
+Edited: yes, there is something I was missing: the forum entry at [[forum/USB_backup_with_files_visible/]]
diff --git a/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn
@@ -0,0 +1,41 @@
+I'm trying to automate syncing of two repos A and B. My goal is to run `git annex sync` from A and have the working copy of B updated automatically. According to the manual page, `git annex merge` should to the trick. It works just fine when I run it manually in B, but not when I run it from the post-receive hook, as suggested in the manual page.
+
+Here is a test script that illustrates the issue: <https://gist.github.com/anonymous/6197019>
+
+The output I get:
+
+    [...]
+    file1 exists after manual git annex merge
+    [...]
+    file2 does not exist after git annex merge in post-receive
+
+From the output I can see that `git annex merge` is run on the remote end, and seems to do it's thing (`file2` is added):
+
+    remote: merge git-annex (merging synced/git-annex into git-annex...)
+    remote: ok
+    remote: merge synced/master Updating 6e5bfba..0dcbcfd
+    remote: Fast-forward
+    remote:  file2 |    1 +
+    remote:  1 file changed, 1 insertion(+)
+    remote:  create mode 120000 file2
+    remote: 
+    remote: ok
+
+However, the working copy in B does not have the file `file2`. Even worse, `git status` in B shows the file as deleted:
+
+    # On branch master
+    # Your branch is ahead of 'origin/master' by 2 commits.
+    #
+    # Changes not staged for commit:
+    #   (use "git add/rm <file>..." to update what will be committed)
+    #   (use "git checkout -- <file>..." to discard changes in working directory)
+    #
+    #	deleted:    file2
+    #
+    no changes added to commit (use "git add" and/or "git commit -a")
+
+So when running `git annex sync` from B now, the file will be deleted from A as well, which is not what I expected.
+
+This is on Ubuntu 12.04, using the precompiled git-annex tarball (amd64).
+
+What am I doing wrong?
diff --git a/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn b/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn
@@ -0,0 +1,13 @@
+I'm wondering if it is possible to have remotes that don't have the *content* of git-annex tracked.
+
+# My use case:
+
+I have a number of projects that I am working on at any one time.  They all are tracking independently by `git` and more recently I am using `git annex` to manage the large files.
+
+However because I have so many projects I work on one (called `AAA`), move to another, delete `AAA` to save disk space, ...time passes... return to `AAA`.
+
+Now, prior to `git-annex` I could just clone `AAA` from my central repository folder do work, commit, push, repeat and then delete and there is no indication that I had one, or many copies of `AAA` floating around.  Now with `git-annex` there is some trail of me cloning, running `git annex get`, etc.
+
+Is there some way to set a remote as `untracked`?  By that I mean it is classed as `untrusted` - so I can move files around, add them, copy to trusted remotes and delete the whole repository without worrying about losing data - but it also doesn't push any of the git-annex tracking info of where a copy of a file actually is.  I don't want to know if any or all of my other `untracked` repositories have a copy of a file or not. 
+
+I don't want my `git annex whereis` polluted with many references to repositories that just don't exist any more.  I guess I could set them to dead but that still keeps all of the tracking info around in all the repos, which seems unnecessary...
diff --git a/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn b/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn
@@ -0,0 +1,23 @@
+Hey,
+
+I've found that git annex works great as a way to publish websites to a web server.  I can edit my website on my computer, `git annex sync` my working directory to the VPS, and then `git annex get files-I-want-to-publish`.  This works great.  I can maintain my normal working directory structure on the VPS and I don't have to worry about people seeing files I DIDN'T want to publish, since the dead symlinks just show up as 404s.
+
+There's one small problem.  
+
+Say:
+
+ 1) I've already published a file using `git annex get file-to-update`
+
+ 2) I update that file on my computer
+
+ 3) I do `git annex sync`
+
+ 4) I do `git annex get file-to-update`
+
+Between steps 3 and 4, file-to-update goes from being an accessible web resource to being a dead symlink.  It's not really a problem for me, as hardly anyone visits my site. But it would be nice if I could make `sync` leave the old symlink to the old file until I `get`ed the new one.
+
+Is this possible?
+
+PS: For those who might follow in my footsteps, remember that you probably don't want people reading the contents of your .git dir, so make a re-write rule for this!
+
+Timothy
diff --git a/doc/forum/Manual_Setup_of_a_Central_Repo.mdwn b/doc/forum/Manual_Setup_of_a_Central_Repo.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Manual_Setup_of_a_Central_Repo.mdwn
@@ -0,0 +1,1 @@
+My current setup involves 3 computers, one desktop one laptop and a vps. In my current setup I have created annex repos on the server and cloned from it, both machines sync to the server. All three use non base repos. Now I have another annex folder on the desktop that I would like to sync between the three. Both machines are behind NAT so server can not communicate with the machines. In order to init the repo on the vps, I was thinking of setting up a temporary VPN/port forward between the desktop and the VPS then clone from the desktop finally remove the remote section in .git/config on the server so VPS becomes the master again. First of all is there an easier way to do this? if not is it safe to do this? or is it going to cause problems down the line.
diff --git a/doc/forum/Poor_man__39__s_IMAP.mdwn b/doc/forum/Poor_man__39__s_IMAP.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Poor_man__39__s_IMAP.mdwn
@@ -0,0 +1,6 @@
+I have an e-mail server configured to save my mail in ~/Maildir on an account that is available over ssh. I'd like to keep emailserver:~/Maildir in a two-way sync with laptop:~/Mail/private essentially creating a poor man's IMAP — without setting up and maintaining an actual IMAP server. **Is it an appropriate use of git-annex or would another tool be more fitting? And how do I go about doing it?** I'd like to sync the files, the content, not just information about the files or other meta-data. 
+
+I tried setting it up with the webUI to the assistant but it only offers encrypted storage[1] on the remote server. I looked into setting it up manually but "git-annex does not notice when files are added to remote rsync repositories."[2]
+
+[1] http://git-annex.branchable.com/bugs/Remote_repositories_have_to_be_setup_encrypted/  
+[2] from comments on http://git-annex.branchable.com/special_remotes/rsync/
diff --git a/doc/forum/Relocating_annex_directory.mdwn b/doc/forum/Relocating_annex_directory.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Relocating_annex_directory.mdwn
@@ -0,0 +1,1 @@
+I have around 70 GBs of data spread around 4 repositories on a Linux (Ubuntu) box. My problem is I need to reformat the drive they are on. I would like to move them to an external usb drive temporarily during reinstall then move them back to their original location. When I started with annex I did try to mv annexFolder/ toNewLoc/ which failed leaving behind a corrupt repo. What is a safe way to move an annex folder? My primary connection is a 3G modem so I am trying to avoid re downloading everything. Another thing I am trying to avoid is cloning the repos to the external drive, reinstall, clone it back to the internal drive and mark original and external repos as dead, but AFAIK those dead repos will show up in the output of whereis, so everytime I reformat I gonna have two extra dead repos.
diff --git a/doc/forum/Revert_file_linkage_to_original_files.mdwn b/doc/forum/Revert_file_linkage_to_original_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/Revert_file_linkage_to_original_files.mdwn
@@ -0,0 +1,9 @@
+I've recently found the following problem:
+
+I really really want to get back my original folder structure - which includes the real files, not the symlinks. I've searched for quite a while, but I simply could not find an acceptable solution...
+
+So I thought I would like to ask you guys here, if anybody experienced similar problems (or at least knows a solution for my problem)?
+
+Greetings
+
+Pethor
diff --git a/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant.txt b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant.txt
new file mode 100644
--- /dev/null
+++ b/doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant.txt
@@ -0,0 +1,22 @@
+1. Set up two computers with a client repository.
+2. Add a removable drive repository and set it to transfer group.
+3. Start adding files to computer #1 repository. See how the files get synced to the usb drive.
+4. Connect the usb drive to computer #2 and see the files getting transferred to computer #2. Everything is looking good.
+
+
+5. Connect the usb drive to computer #1 again. 
+6. Add a file that is larger than the remaining size of the usb drive, BUT smaller than the original size of the usb drive.
+7. The file does not get transferred to the usb drive due to lack of disk space.
+
+I would expect the assistant to make some space on the usb drive. Removing the files it knows has been transferred to computer #2, and then transfer the new file to the usb drive. But this does not seem to happen. 
+
+Have I missed something about how the transfer group is supposed to work?
+
+ 
+Using version:
+git-annex version: 4.20130802-g0a52f02
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+
+Pre built tar file.
+
+
diff --git a/doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn b/doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn
@@ -0,0 +1,3 @@
+I am trying to share files between my PC at home at that at work using the walkthrough here: http://git-annex.branchable.com/assistant/remote_sharing_walkthrough/. However, I don't have the option on my machine to "Share with other devices". Any ideas why this would be missing? I am using Ubuntu 13.04 if that helps. 
+
+Update: it now works after a software update, I guess I just had an older version of git-annex. Now, I have version 4.20130723. 
diff --git a/doc/forum/taskwarrior.mdwn b/doc/forum/taskwarrior.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/taskwarrior.mdwn
@@ -0,0 +1,11 @@
+I try to sync my taskWarrior files .task/*.data with git-annex ... but there is two problem :
+
+- i need to chmod 755 my files because taskWarrior doesn't recognize them, or say "problem with permission" 
+
+- taskwarrior seems crazy with symbolic link used by git-annex, undo not work, task appear multiple times , etc.
+
+Is there any solution ?
+Any user experienced the same problem?
+
+Thanks
+Sr.
diff --git a/doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment b/doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment
new file mode 100644
--- /dev/null
+++ b/doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
+ nickname="Richard"
+ subject="comment 1"
+ date="2013-08-06T12:44:11Z"
+ content="""
+* You could try metastore (not merge friendly), git-cache-meta (pretty minimal) or metamonger (not done yet) to sync your file permissions
+* Look into direct mode to avoid symlinks
+* Alternatively, check your taskwarrior files into git, not git-annex, to avoid symlinks
+"""]]
diff --git a/doc/forum/unknown_response_from_git_cat-file.mdwn b/doc/forum/unknown_response_from_git_cat-file.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/forum/unknown_response_from_git_cat-file.mdwn
@@ -0,0 +1,8 @@
+Hi,
+
+when running git annex add in my direct mode repository, since a few days ago I only get:
+
+$ git annex add
+git-annex: unknown response from git cat-file (":./Archiv/Someone missing",:./Archiv/Someone Like You Cover-fCvjvEGkTu4.flv)
+
+The :./Archiv/Someone missing part strikes me odd because it so much looks like broken shell meta-character escaping in git-annex, but I doubt that because it stopped working just suddenly.
diff --git a/doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment b/doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment
new file mode 100644
--- /dev/null
+++ b/doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"
+ nickname="Nigel"
+ subject="minor suggestion"
+ date="2013-08-10T14:31:31Z"
+ content="""
+The contents of large files are not stored in git, only the names of the files and some other metadata remain there.
+
+Would this read better to the newbie as:
+
+The contents of 'annexed' files are not stored in git, only the names of the files and some other metadata remain there.
+
+First time for me, the note about large files made me think that maybe annex operated on files above a certain size.
+"""]]
diff --git a/doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment b/doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment
@@ -0,0 +1,44 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA"
+ nickname="Gregor"
+ subject="Installation on tonidoplug"
+ date="2013-08-03T07:19:54Z"
+ content="""
+I tried various ways to install git-annex on my [TonidoPlug](http://www.tonidoplug.com/).
+
+System Info:
+
+	root@TonidoPlug2:~# uname -a
+	Linux TonidoPlug2 2.6.31.8-topkick1281p2-001-004-20101214 #1 Thu Jun 16 10:06:20 CST 2011 armv5tel GNU/Linux
+
+`apt-get` didn't work.
+
+	root@TonidoPlug2:~# apt-get install git-annex
+	Reading package lists... Done
+	Building dependency tree       
+	Reading state information... Done
+	E: Unable to locate package git-annex
+
+The Linux standalone installation results in an error message like this, when calling `git-annex` (or `git annex`)
+
+	~$ git-annex.linux/git-annex
+	/home/gitolite/git-annex.linux/bin/git-annex: 1: Syntax error: \")\" unexpected
+
+(git-annex.linux/bin/git-annex is a binary file and works fine on other distros)
+
+When installing with cabal, I get the error message (tried as root and gitolite user)
+
+	~$ cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns\"
+	Resolving dependencies...
+	cabal: cannot configure git-annex-4.20130802. It requires base >=4.5 && <4.8
+	For the dependency on base >=4.5 && <4.8 there are these packages:
+	base-4.5.0.0, base-4.5.1.0, base-4.6.0.0 and base-4.6.0.1. However none of
+	them are available.
+	base-4.5.0.0 was excluded because of the top level dependency base -any
+	base-4.5.1.0 was excluded because of the top level dependency base -any
+	base-4.6.0.0 was excluded because of the top level dependency base -any
+	base-4.6.0.1 was excluded because of the top level dependency base -any
+
+Any help is appreciated.
+Thanks for providing git-annex. I started cleaning up my backups with it yesterday and really like it.
+"""]]
diff --git a/doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment b/doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="2001:4978:f:21a::2"
+ subject="comment 12"
+ date="2013-08-07T16:31:30Z"
+ content="""
+The Linux standalone builds for i386 and amd64 will not work on Arm systems.
+
+There are builds of git-annex for arm in eg, Debian. You should be able to use one of those if this system is running Debian. You may need to upgrade to eg, Debian stable, which includes git-annex.
+
+It looks like you have an old and/or broken GHC compiler too. You could upgrade that to a newer version (eg from Debian stable) and build it that way, but it seems like the long way around if you have a Debian system there.
+"""]]
diff --git a/doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment b/doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment
new file mode 100644
--- /dev/null
+++ b/doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawlXEIT2PEAuHuInLP4UYVzWE0lceMYd2lA"
+ nickname="Gregor"
+ subject="TonidoPlug"
+ date="2013-08-09T17:46:28Z"
+ content="""
+@Joey Thanks for the answer. I didn't want to mess around too much with the TonidoPlug. I am currently setting up a raspberry pi, which works fine. 
+"""]]
diff --git a/doc/news/version_4.20130621.mdwn b/doc/news/version_4.20130621.mdwn
deleted file mode 100644
--- a/doc/news/version_4.20130621.mdwn
+++ /dev/null
@@ -1,40 +0,0 @@
-git-annex 4.20130621 released with [[!toggle text="these changes"]]
-[[!toggleable text="""
-   * Supports indirect mode on encfs in paranoia mode, and other
-     filesystems that do not support hard links, but do support
-     symlinks and other POSIX filesystem features.
-   * Android: Add .thumbnails to .gitignore when setting up a camera
-     repository.
-   * Android: Make the "Open webapp" menu item open the just created
-     repository when a new repo is made.
-   * webapp: When the user switches to display a different repository,
-     that repository becomes the default repository to be displayed next time
-     the webapp gets started.
-   * glacier: Better handling of the glacier inventory, which avoids
-     duplicate uploads to the same glacier repository by `git annex copy`.
-   * Direct mode: No longer temporarily remove write permission bit of files
-     when adding them.
-   * sync: Better support for bare git remotes. Now pushes directly to the
-     master branch on such a remote, instead of to synced/master. This
-     makes it easier to clone from a bare git remote that has been populated
-     with git annex sync or by the assistant.
-   * Android: Fix use of cp command to not try to use features present
-     only on build system.
-   * Windows: Fix hang when adding several files at once.
-   * assistant: In direct mode, objects are now only dropped when all
-     associated files are unwanted. This avoids a repreated drop/get loop
-     of a file that has a copy in an archive directory, and a copy not in an
-     archive directory. (Indirect mode still has some buggy behavior in this
-     area, since it does not keep track of associated files.)
-     Closes: #[712060](http://bugs.debian.org/712060)
-   * status: No longer shows dead repositories.
-   * annex.debug can now be set to enable debug logging by default.
-     The webapp's debugging check box does this.
-   * fsck: Avoid getting confused by Windows path separators
-   * Windows: Multiple bug fixes, including fixing the data written to the
-     git-annex branch.
-   * Windows: The test suite now passes on Windows (a few broken parts are
-     disabled).
-   * assistant: On Linux, the expensive transfer scan is run niced.
-   * Enable assistant and WebDAV support on powerpc and sparc architectures,
-     which now have the necessary dependencies built."""]]
diff --git a/doc/news/version_4.20130815.mdwn b/doc/news/version_4.20130815.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/news/version_4.20130815.mdwn
@@ -0,0 +1,11 @@
+git-annex 4.20130815 released with [[!toggle text="these changes"]]
+[[!toggleable text="""
+   * assistant, watcher: .gitignore files and other git ignores are now
+     honored, when git 1.8.4 or newer is installed.
+     (Thanks, Adam Spiers, for getting the necessary support into git for this.)
+   * importfeed: Ignores transient problems with feeds. Only exits nonzero
+     when a feed has repeatedly had a problems for at least 1 day.
+   * importfeed: Fix handling of dots in extensions.
+   * Windows: Added support for encrypted special remotes.
+   * Windows: Fixed permissions problem that prevented removing files
+     from directory special remote. Directory special remotes now fully usable."""]]
diff --git a/doc/special_remotes/directory.mdwn b/doc/special_remotes/directory.mdwn
--- a/doc/special_remotes/directory.mdwn
+++ b/doc/special_remotes/directory.mdwn
@@ -5,6 +5,10 @@
 [[encrypted|encryption]] contents). Just set up both systems to use
 the drive's mountpoint as a directory remote.
 
+If you just want two copies of your repository with the files "visible"
+in the tree in both, the directory special remote is not what you want.
+Instead, you should use a regular `git clone` of your git-annex repository.
+
 ## configuration
 
 These parameters can be passed to `git annex initremote` to configure the
diff --git a/doc/special_remotes/xmpp.mdwn b/doc/special_remotes/xmpp.mdwn
--- a/doc/special_remotes/xmpp.mdwn
+++ b/doc/special_remotes/xmpp.mdwn
@@ -21,4 +21,25 @@
 to see incoming pushes, the XMPP remote cannot be used with git at the
 command line.
 
+## Hosted server support status
+[[!table  data="""
+Server|Status|Notes
+Gmail|Working|Google apps users will have to edit `.git/annex/creds/xmpp` manually
+Facebook|Failing|Maybe non 2-factor will work
+League Of Legends|Failing
+"""]]
+
+## Server daemon support status
+[[!table  data="""
+Server|Status|Notes
+[[Prosody|http://prosody.im/]]|Working
+[[Metronome|http://www.lightwitch.org/]]|Working
+Ejabberd|[[Failing|http://git-annex.branchable.com/forum/XMPP_authentication_failure/]]|[[Authentication bug|https://support.process-one.net/browse/EJAB-1632]]: Fixed in debian unstable with version 2.1.10-5
+jabberd14|[[Failing|http://git-annex.branchable.com/forum/XMPP_authentication_failure/#comment-4ce5aeabd12ca3016290b3d8255f6ef1]]|No further information
+jabberd2|?|Please update
+Openfire|?|Please update
+Tigase|?|Please update
+iChat Server|?|Please update
+"""]]
+
 See also: [[xmpp_protocol_design_notes|design/assistant/xmpp]]
diff --git a/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn b/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn
--- a/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn
+++ b/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn
@@ -10,16 +10,16 @@
 
 Then, log into your *home* computer, with *port forwarding*:
 
-    ssh me@myhome.no-ip.org L 2201:localhost:22
+    ssh me@myhome.no-ip.org -R 2201:localhost:22
 
 Your *home* computer can now ssh into your *on-the-go* computer, as long as you keep the above shell running.
 
 You can now add your *on-the-go* computer as a remote on your *home* computer. Use the port forwarding shell you just connected with the command above, if you like. 
 
     ssh-keygen -t rsa
-    ssh-copy-id me@localhost -p 2201
+    ssh-copy-id "me@localhost -p 2201"
     cd ~/annex
-    git annex remote add on-the-go ssh://me@localhost:2201/home/myuser/annex
+    git remote add on-the-go ssh://me@localhost:2201/home/myuser/annex
 
 Now you can run normal annex operations, as long as the port forwarding shell is running³.
 
diff --git a/doc/tips/Git_annex_and_Calibre.mdwn b/doc/tips/Git_annex_and_Calibre.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/tips/Git_annex_and_Calibre.mdwn
@@ -0,0 +1,118 @@
+The problem
+===========
+
+[Calibre](http://calibre-ebook.com/) is a ebook manager that is
+available in [debian](http://packages.debian.org/sid/calibre). I use
+it to maintain my library, but also to dowload every day an epub
+version of a French newspaper and then put it on my kobo.
+
+Configuring git annex for this
+==============================
+
+I wanted to use git-annex, so
+
+    $ git init
+    $ git annex init "some useful name"
+
+But I don't want every thing in annex, because Calibre use some text
+file to save some metadata, so I used:
+
+    $ git config annex.largefiles "include=* exclude=*.opf exclude=*.json"
+
+then lets add everything
+
+    $ git annex add *
+    $ git add *
+    $ git commit -m "first commit"
+
+Calibre need read and write access on the its database, so let unlock it:
+
+    $ git annex unlock metadata.db
+
+On my other computer I only need to do
+
+    $ git clone $user@$host:Calibre\ library
+    $ cd Calibre\ library
+    $ git annex init "another useful name"
+    $ git annex get .
+    $ git annex unlock metadata.db
+
+The problem is that every time you will `git annex sync`, git annex
+will lock again the metadata.db, so lets unlock it automatically. I
+use git hooks, in `.git/hooks/post-commit` I have
+
+    #!/bin/bash
+
+    git annex edit metadata.db
+
+don't forget to make this file executable
+
+    $ chmod a+x .git/hooks/post-commit
+
+Day to day operation
+====================
+
+    $ git annex add .
+
+Will put new file into the annex
+
+    $ git add .
+
+Will take care of the files that should no go into annex
+
+    $ git annex sync
+
+Will make the repositories exchange informations about all this, and
+make remote change local
+
+    $ git annex get .
+
+Will make remote book locally available
+
+Merge conflict
+--------------
+You should not run calibre on the two computer simultaneously, or
+without syncing before it. If you do, you will have a conflict that
+git-annex will automatically *solve* by rename both of the file.
+
+You can then either:
+
+ - Choose one. If no books have been changed or added on one of the
+   computer, to use the other `metadata.db` will not make you loose
+   any information
+ - rebuild it. `calibredb restore_database` won't do it, but will tell
+   you how to do it.
+
+Checking the library
+--------------------
+You can use `calibredb check_library` to check you library is
+correct. If you use git for it, it will always tell you that it is not
+correct: there is this author ".git" it doesn't know about. Just don't
+care about it.
+
+Maybe this can be solved by using `vcsh` but apparently
+`vcsh`+`git annex` it not well tested yet.
+
+Automatic stuff
+---------------
+I use `mr` to automatically run all this, but some config could be
+done (I believe) to have `git annex copy --auto` do what it should.
+
+There are also the git annex assistant for this kind of automatic
+synchronizations of contents, but I don't know if my automatic
+unlocking of one file will break this.
+
+It might be interesting to find someway to unlock and lock the library
+only when running calibre, a simple script to launch calibre will do
+that. Note that each time you will lock and unlock, you will have a
+new commit in git.
+
+Another solution
+===================
+You could also use direct mode in place of the auto unlock feature
+
+    git annex indirect
+
+The remove the `post-commit` git hook (or do not add it). Its a
+simpler solution, but remember that interaction between git annex direct
+repositories and plain git are complex
diff --git a/doc/todo/add_metadata_to_annexed_files.mdwn b/doc/todo/add_metadata_to_annexed_files.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/add_metadata_to_annexed_files.mdwn
@@ -0,0 +1,5 @@
+I would like to attach metadata to annexed files (objects) without cluttering the workdir with files containing this metadata. A common use case would be to add titles to my photo collection that could than end up in a generated photo album.
+
+Depending on the implementation it might also be possible to use the metadata facility for a threaded commenting system.
+
+The first question is whether the metadata is attached to the objects and thus shared by all paths pointing to the same data object or to paths in the worktree. I've no preference here at this point.
diff --git a/doc/todo/assistant_parallel_file_transfers.txt b/doc/todo/assistant_parallel_file_transfers.txt
new file mode 100644
--- /dev/null
+++ b/doc/todo/assistant_parallel_file_transfers.txt
@@ -0,0 +1,15 @@
+Hi and thank you for an incredible piece of software and great work!
+
+I've noticed that when I add new files to a repository and I have my USB drive connected, the assistant alternate it's transfers of files. And only transfers one queued file at the time.
+
+file1 -->> Internet offsite computer
+file1 -->> USB drive
+file2 -->> Internet offsite computer
+file2 -->> USB drive
+
+
+I would prefer a logic where the assistant transfer files in parallel to my different repositories. I know that it might not be a good thing doing that with network accessed repositories, but when I have "low cost", locally attached USB drives it would be great if the transfers could be done in parallel.
+
+
+Is there a configuration option for this already?
+
diff --git a/doc/todo/keep_annexed_files_for_a_while.mdwn b/doc/todo/keep_annexed_files_for_a_while.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/keep_annexed_files_for_a_while.mdwn
@@ -0,0 +1,8 @@
+I don't want files that I dropped to immediately disappear from my local or all of my remotes repos on the next sync. Especially in situations where changes to the git-annex repo get automatically and immediately replicated to remote repos, I want a configurable "grace" period before files in .git/annex/objects get really deleted.
+
+This has similarities to the "trash" on a desktop. It might also be nice to
+
+* configure a maximum amount of space of the "trash"
+* have a way to see the contents of the trash to easily recover deleted files
+
+Maybe it would make sense to just move dropped files to the desktops trash? "git annex trash" as an alternative to drop?
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn b/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn
@@ -0,0 +1,6 @@
+As discussed on debconf, I have the following use case:
+
+* I have a dump remote, a folder on my webserver where files are uploaded through the web app. I don't have git on the webserver, just a plain folder.
+* I have git-annex repo on a development server. The development server polls the webserver (ssh/ftp) once in an hour and synchronizes the state of the local git-annex repo with the state found on the webserver and commits that.
+* This is not meant to be backup facility. I just want to be able to have a state on my development machine that is very likely to the state on the webserver.
+
diff --git a/doc/todo/untracked_remotes.mdwn b/doc/todo/untracked_remotes.mdwn
new file mode 100644
--- /dev/null
+++ b/doc/todo/untracked_remotes.mdwn
@@ -0,0 +1,9 @@
+Seems that a fairly common desire in some use cases is to be able to make a
+clone of a repository and be able to get files, without updating the
+location tracking information. (And without even recording a uuid in the
+remote.log.) Use cases include wanting to have temporary
+clones without cluttering history, and centralized development where the
+developers don't care to know about one-another's systems.
+
+It seems that such an untracked repository would need to automatically
+consider itself untrusted. Is that enough to avoid losing data?
diff --git a/doc/todo/windows_support.mdwn b/doc/todo/windows_support.mdwn
--- a/doc/todo/windows_support.mdwn
+++ b/doc/todo/windows_support.mdwn
@@ -3,12 +3,10 @@
 
 ## status
 
-* Does not support encryption with gpg.
 * Does not work with Cygwin's build of git (that git does not consistently
   support use of DOS style paths, which git-annex uses on Windows). 
   Must use the upstream build of git for Windows.
-* Test suite works and passes, but 6 tests are disabled due to failing.
-* Directory and rsync special remotes are known buggy.
+* rsync special remotes are known buggy.
 * Bad file locking, it's probably not safe to run more than one git-annex
   process at the same time on Windows.
 * No support for the assistant or webapp.
diff --git a/git-annex.cabal b/git-annex.cabal
--- a/git-annex.cabal
+++ b/git-annex.cabal
@@ -1,5 +1,5 @@
 Name: git-annex
-Version: 4.20130802
+Version: 4.20130815
 Cabal-Version: >= 1.8
 License: GPL-3
 Maintainer: Joey Hess <joey@kitenet.net>
diff --git a/standalone/windows/build.sh b/standalone/windows/build.sh
--- a/standalone/windows/build.sh
+++ b/standalone/windows/build.sh
@@ -26,10 +26,12 @@
 # for haskell libraries to link them with the cygwin library.
 cabal update || true
 
-rm -rf MissingH-1.2.0.0
+MISSINGH_VERSION="1.2.0.1"
+
+rm -rf MissingH-${MISSINGH_VERSION}
 cabal unpack MissingH
-cd MissingH-1.2.0.0
-withcyg patch -p1 <../standalone/windows/haskell-patches/MissingH_1.2.0.0-0001-hack-around-strange-build-problem-in-jenkins-autobui.patch
+cd MissingH-${MISSINGH_VERSION}
+withcyg patch -p1 <../standalone/windows/haskell-patches/ccc5967426a14eb7e8978277ed4fa937f8e0c514.patch
 cabal install || true
 cd ..
 
