diff --git a/builtin-pack-refs.c b/builtin-pack-refs.c
index 23d0d0720..108765767 100644
--- a/builtin-pack-refs.c
+++ b/builtin-pack-refs.c
@@ -2,7 +2,7 @@
 #include "refs.h"
 
 static const char builtin_pack_refs_usage[] =
-"git-pack-refs [--prune]";
+"git-pack-refs [--all] [--prune]";
 
 struct ref_to_prune {
 	struct ref_to_prune *next;
@@ -68,6 +68,7 @@ int cmd_pack_refs(int argc, const char **argv, const char *prefix)
 {
 	int fd, i;
 	struct pack_refs_cb_data cbdata;
+	int (*iterate_ref)(each_ref_fn, void *) = for_each_tag_ref;
 
 	memset(&cbdata, 0, sizeof(cbdata));
 
@@ -77,6 +78,10 @@ int cmd_pack_refs(int argc, const char **argv, const char *prefix)
 			cbdata.prune = 1;
 			continue;
 		}
+		if (!strcmp(arg, "--all")) {
+			iterate_ref = for_each_ref;
+			continue;
+		}
 		/* perhaps other parameters later... */
 		break;
 	}
@@ -88,7 +93,7 @@ int cmd_pack_refs(int argc, const char **argv, const char *prefix)
 	if (!cbdata.refs_file)
 		die("unable to create ref-pack file structure (%s)",
 		    strerror(errno));
-	for_each_ref(handle_one_ref, &cbdata);
+	iterate_ref(handle_one_ref, &cbdata);
 	fflush(cbdata.refs_file);
 	fsync(fd);
 	fclose(cbdata.refs_file);
diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh
index ca5bd49ba..a4fbfda46 100755
--- a/t/t3210-pack-refs.sh
+++ b/t/t3210-pack-refs.sh
@@ -31,7 +31,7 @@ test_expect_success \
 test_expect_success \
     'see if a branch still exists when packed' \
     'git-branch b &&
-     git-pack-refs &&
+     git-pack-refs --all &&
      rm .git/refs/heads/b &&
      echo "$SHA1 refs/heads/b" >expect &&
      git-show-ref b >result &&
@@ -40,14 +40,14 @@ test_expect_success \
 test_expect_failure \
     'git branch c/d should barf if branch c exists' \
     'git-branch c &&
-     git-pack-refs &&
+     git-pack-refs --all &&
      rm .git/refs/heads/c &&
      git-branch c/d'
 
 test_expect_success \
     'see if a branch still exists after git pack-refs --prune' \
     'git-branch e &&
-     git-pack-refs --prune &&
+     git-pack-refs --all --prune &&
      echo "$SHA1 refs/heads/e" >expect &&
      git-show-ref e >result &&
      diff expect result'
@@ -55,22 +55,22 @@ test_expect_success \
 test_expect_failure \
     'see if git pack-refs --prune remove ref files' \
     'git-branch f &&
-     git-pack-refs --prune &&
+     git-pack-refs --all --prune &&
      ls .git/refs/heads/f'
 
 test_expect_success \
     'git branch g should work when git branch g/h has been deleted' \
     'git-branch g/h &&
-     git-pack-refs --prune &&
+     git-pack-refs --all --prune &&
      git-branch -d g/h &&
      git-branch g &&
-     git-pack-refs &&
+     git-pack-refs --all &&
      git-branch -d g'
 
 test_expect_failure \
     'git branch i/j/k should barf if branch i exists' \
     'git-branch i &&
-     git-pack-refs --prune &&
+     git-pack-refs --all --prune &&
      git-branch i/j/k'
 
 test_expect_success \
@@ -90,7 +90,7 @@ test_expect_success \
      git-branch -d n/o &&
      git-branch n/o/p &&
      git-branch -d n/op &&
-     git-pack-refs --prune &&
+     git-pack-refs --all --prune &&
      git-branch -d n/o/p &&
      git-branch n'