diff --git a/handa-gdata.cabal b/handa-gdata.cabal
--- a/handa-gdata.cabal
+++ b/handa-gdata.cabal
@@ -1,5 +1,5 @@
 name: handa-gdata
-version: 0.6.6
+version: 0.6.7
 cabal-version: >=1.6
 
 -- CHANGELOG:
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -162,7 +162,7 @@
     , gshead
     , gssync
     ]
-    &= summary "hgData v0.6.6, (c) 2012-13 Brian W. Bush <b.w.bush@acm.org>, MIT license."
+    &= summary "hgData v0.6.7, (c) 2012-13 Brian W. Bush <b.w.bush@acm.org>, MIT license."
     &= program "hgdata"
     &= help "Command-line utility for accessing Google services and APIs. Send bug reports and feature requests to <http://code.google.com/p/hgdata/issues/entry>."
 
diff --git a/src/Network/Google/Storage/Sync.hs b/src/Network/Google/Storage/Sync.hs
--- a/src/Network/Google/Storage/Sync.hs
+++ b/src/Network/Google/Storage/Sync.hs
@@ -43,7 +43,7 @@
 import System.FilePath.Posix (joinPath)
 import System.IO (hFlush, stdout)
 import System.Locale (defaultTimeLocale)
-import System.PosixCompat.Files (fileSize, getFileStatus, modificationTime)
+import System.PosixCompat.Files (fileSize, getFileStatus, getSymbolicLinkStatus, isSymbolicLink, modificationTime)
 import Text.Regex.Posix ((=~))
 import Text.XML.Light (Element, QName(qName), filterChildrenName, filterChildName, ppTopElement, strContent)
 
@@ -345,6 +345,16 @@
 walkDirectories' eTags directory (y : ys) =
     do
       let
+        isWalkable path =
+          do
+            directoryExists <- doesDirectoryExist path
+            status <- getSymbolicLinkStatus path
+            return $ directoryExists && not (isSymbolicLink status)
+        isFileable path =
+          do
+            directoryExists <- doesDirectoryExist path
+            status <- getSymbolicLinkStatus path
+            return $ not directoryExists && not (isSymbolicLink status)
         handler :: a -> SomeException -> IO a
         handler def exception =
           do
@@ -375,6 +385,7 @@
             liftM (map (combine y) . (\\ [".", ".."]))
               $ getDirectoryContents (combine directory y)
           )
-      y' <- filterM (doesDirectoryExist . combine directory) files
-      x' <- mapM makeMetadata $ files \\ y'
+      y' <- filterM (isWalkable . combine directory) files
+      y'' <- filterM (isFileable . combine directory) files
+      x' <- mapM makeMetadata y''
       liftM (catMaybes x' ++) $ walkDirectories' eTags directory (y' ++ ys)
