add -find_cache_prunes

specify prune directories, space spapated.
imply -use_find_cache true if -find_cache_prunes given.

e.g.
 kati -find_cache_prunes=".repo .git"
diff --git a/func.go b/func.go
index a0d743b..3a944d5 100644
--- a/func.go
+++ b/func.go
@@ -771,14 +771,14 @@
 		}
 	}
 	if dir, ok := matchAndroidFindFileInDir(expr); ok {
-		androidFindCache.init()
+		androidFindCache.init(nil)
 		return &funcShellAndroidFindFileInDir{
 			funcShell: f,
 			dir:       dir,
 		}
 	}
 	if chdir, roots, ok := matchAndroidFindJavaInDir(expr); ok {
-		androidFindCache.init()
+		androidFindCache.init(nil)
 		return &funcShellAndroidFindJavaInDir{
 			funcShell: f,
 			chdir:     chdir,
@@ -786,7 +786,7 @@
 		}
 	}
 	if dir, ok := matchAndroidFindJavaResourceFileGroup(expr); ok {
-		androidFindCache.init()
+		androidFindCache.init(nil)
 		return &funcShellAndroidFindJavaResourceFileGroup{
 			funcShell: f,
 			dir:       dir,
diff --git a/main.go b/main.go
index b7c35e4..ad01f8a 100644
--- a/main.go
+++ b/main.go
@@ -50,6 +50,7 @@
 	useParaFlag           bool
 	useCache              bool
 	useFindCache          bool
+	findCachePrunes       string
 	useWildcardCache      bool
 	generateNinja         bool
 	ignoreOptionalInclude string
@@ -93,6 +94,8 @@
 	// TODO: Make this default.
 	flag.BoolVar(&useCache, "use_cache", false, "Use cache.")
 	flag.BoolVar(&useFindCache, "use_find_cache", false, "Use find cache.")
+	flag.StringVar(&findCachePrunes, "find_cache_prunes", "",
+		"space separated prune directories for find cache.")
 	flag.BoolVar(&useWildcardCache, "use_wildcard_cache", true, "Use wildcard cache.")
 	flag.BoolVar(&generateNinja, "ninja", false, "Generate build.ninja.")
 	flag.StringVar(&ignoreOptionalInclude, "ignore_optional_include", "", "If specified, skip reading -include directives start with the specified path.")
@@ -306,6 +309,11 @@
 		}()
 	}
 
+	if findCachePrunes != "" {
+		useFindCache = true
+		androidFindCache.init(strings.Fields(findCachePrunes))
+	}
+
 	clvars, targets := parseCommandLine()
 	InitMakefileCache()
 
diff --git a/pathutil.go b/pathutil.go
index 00162b5..31a9e55 100644
--- a/pathutil.go
+++ b/pathutil.go
@@ -98,14 +98,15 @@
 	return c.ok
 }
 
-func (c *androidFindCacheT) init() {
+func (c *androidFindCacheT) init(prunes []string) {
 	c.once.Do(func() {
 		c.mu.Lock()
-		go c.start()
+		go c.start(prunes)
 	})
 }
 
-func (c *androidFindCacheT) start() {
+func (c *androidFindCacheT) start(prunes []string) {
+	Logf("find cache init: %q", prunes)
 	defer c.mu.Unlock()
 	t := time.Now()
 	defer func() {
@@ -114,13 +115,21 @@
 	}()
 
 	err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
+		if info.IsDir() {
+			for _, prune := range prunes {
+				if info.Name() == prune {
+					Logf("find cache prune: %s", path)
+					return filepath.SkipDir
+				}
+			}
+		}
 		c.files = append(c.files, fileInfo{
 			path: strings.TrimPrefix(path, "./"),
 			mode: info.Mode(),
 		})
 		return nil
 	})
-	if err != nil {
+	if err != nil && err != filepath.SkipDir {
 		Logf("error in adnroid find cache: %v", err)
 		c.ok = false
 		return