diff --git a/classes/gitpkgv.bbclass b/classes/gitpkgv.bbclass
index bedceb9..76c660b 100644
--- a/classes/gitpkgv.bbclass
+++ b/classes/gitpkgv.bbclass
@@ -50,8 +50,11 @@ def gitpkgv_drop_tag_prefix(version):
 def get_git_pkgv(d, use_tags):
 	import os
 	import bb
+	from pipes import quote
 
 	urls = bb.data.getVar('SRC_URI', d, 1).split()
+	cachedir = bb.data.expand("${DL_DIR}/gitpkgv", d)
+	bb.mkdirhier(cachedir)
 
 	for url in urls:
 		(type, host, path, user, pswd, parm) = bb.decodeurl(bb.data.expand(url, d))
@@ -63,22 +66,36 @@ def get_git_pkgv(d, use_tags):
 				return None
 
 			rev = bb.fetch.get_srcrev(d).split('+')[1]
+			rev_file = os.path.join(cachedir, rev)
 
-			cwd = os.getcwd()
-			os.chdir(repodir)
+			vars = { 'repodir' : quote(repodir),
+				 'rev' : quote(rev),
+			       }
 
-			commits = bb.fetch.runfetchcmd("git rev-list %s -- 2> /dev/null | wc -l" % rev, d, quiet=True).strip()
+			if not os.path.exists(rev_file) or os.path.getsize(rev_file)==0:
+				commits = bb.fetch.runfetchcmd(
+				       "cd %(repodir)s && "
+				       "git rev-list %(rev)s -- 2> /dev/null | wc -l" % vars,
+				       d, quiet=True).strip()
+
+				if commits != "0":
+					oe.path.remove(rev_file, recurse=False)
+					open(rev_file, "w").write("%d\n" % commits)
+			else:
+				commits = open(rev_file, "r").readline(128).strip()
 
 			if use_tags:
 				try:
-					ver = gitpkgv_drop_tag_prefix(bb.fetch.runfetchcmd("git describe %s 2>/dev/null" % rev, d, quiet=True).strip())
+					tmp = bb.fetch.runfetchcmd(
+					"cd %(repodir)s && "
+					"git describe %(rev)s 2>/dev/null" % vars,
+					d, quiet=True).strip()
+					ver = gitpkgv_drop_tag_prefix(tmp)
 				except Exception:
 					ver = "0.0-%s-g%s" % (commits, rev[:7])
 			else:
 				ver = "%s+%s" % (commits, rev[:7])
 
-			os.chdir(cwd)
-
 			return ver
 
 	return "0+0"
