diff --git a/hggit/git_handler.py b/hggit/git_handler.py
index 2e77e332f3b36723eadbaa5407ff2e98b5505f53_aGdnaXQvZ2l0X2hhbmRsZXIucHk=..345919960ea42205a08e12c6a4dccf1ccae31157_aGdnaXQvZ2l0X2hhbmRsZXIucHk= 100644
--- a/hggit/git_handler.py
+++ b/hggit/git_handler.py
@@ -287,9 +287,8 @@
         new_refs = {}
         def changed(refs):
             old_refs.update(refs)
-            to_push = set([v[1] for v in self.local_heads().itervalues()] +
-                          self.tags.values())
-            new_refs.update(self.get_changed_refs(refs, to_push, True))
+            exportable = self.get_exportable()
+            new_refs.update(self.get_changed_refs(refs, exportable, True))
             return refs # always return the same refs to make the send a no-op
 
         try:
@@ -912,10 +911,18 @@
         def changed(refs):
             self.ui.status(_("searching for changes\n"))
             old_refs.update(refs)
-            to_push = revs or set(
-                [v[1] for v in self.local_heads().itervalues()] +
-                self.tags.values())
-            return self.get_changed_refs(refs, to_push, force)
+            all_exportable = self.get_exportable()
+            if revs is None:
+                exportable = all_exportable
+            else:
+                exportable = {}
+                for rev in (hex(r) for r in revs):
+                    if rev not in all_exportable:
+                        raise hgutil.Abort("revision %s cannot be pushed since"
+                                           " it doesn't have a ref" %
+                                           self.repo[rev])
+                    exportable[rev] = all_exportable[rev]
+            return self.get_changed_refs(refs, exportable, force)
 
         def genpack(have, want):
             commits = []
@@ -947,7 +954,7 @@
         except (HangupException, GitProtocolError), e:
             raise hgutil.Abort(_("git remote error: ") + str(e))
 
-    def get_changed_refs(self, refs, revs, force):
+    def get_changed_refs(self, refs, exportable, force):
         new_refs = refs.copy()
         all_heads = self.local_heads()
 
@@ -965,5 +972,5 @@
                     bookmarks.setcurrent(self.repo, 'master')
                     new_refs['refs/heads/master'] = self.map_git_get(tip)
 
-        for rev in revs:
+        for rev, rev_refs in exportable.iteritems():
             ctx = self.repo[rev]
@@ -969,14 +976,5 @@
             ctx = self.repo[rev]
-            labels = lambda c: ctx.tags() + [
-                fltr for fltr, bm
-                in self._filter_for_bookmarks(ctx.bookmarks())
-            ]
-            prep = lambda itr: [i.replace(' ', '_') for i in itr]
-
-            heads = [t for t in prep(labels(ctx)) if t in all_heads]
-            tags = [t for t in prep(labels(ctx)) if t in self.tags]
-
-            if not (heads or tags):
+            if not rev_refs:
                 raise hgutil.Abort("revision %s cannot be pushed since"
                                    " it doesn't have a ref" % ctx)
 
@@ -988,8 +986,7 @@
             # dereferenced and stored as lightweight ones, as the annotated tag
             # is still stored in the git repo.
             uptodate_annotated_tags = []
-            for r in tags:
-                ref = 'refs/tags/'+r
+            for ref in rev_refs.tags:
                 # Check tag.
                 if not ref in refs:
                     continue
@@ -1004,12 +1001,7 @@
                 # If we've reached here, the tag's good.
                 uptodate_annotated_tags.append(ref)
 
-            for r in heads + tags:
-                if r in heads:
-                    ref = 'refs/heads/'+r
-                else:
-                    ref = 'refs/tags/'+r
-
+            for ref in rev_refs:
                 if ref not in refs:
                     new_refs[ref] = self.map_git_get(ctx.hex())
                 elif new_refs[ref] in self._map_git: