They have been marked as UNINTERESTING for a reason, lets respect that.

Currently the first ref is handled properly, but not the rest, so:

 % git fast-export master ^master

Would currently throw a reset for master (2nd ref), which is not what we

 % git fast-export master ^foo ^bar ^roo
 % git fast-export master salsa..tacos

Even if all these refs point to the same object; foo, bar, roo, salsa,
and tacos would all get a reset, and to a non-existing object (invalid
mark :0).

And even more, it would only happen if the ref is pointing to exactly
the same commit, but not otherwise:

 % git fast-export ^next next
 reset refs/heads/next
 from :0

 % git fast-export ^next next^{commit}
 # nothing
 % git fast-export ^next next~0
 # nothing
 % git fast-export ^next next~1
 # nothing
 % git fast-export ^next next~2
 # nothing

The reason this happens is that before traversing the commits,
fast-export checks if any of the refs point to the same object, and any
duplicated ref gets added to a list in order to issue 'reset' commands
after the traversing. Unfortunately, it's not even checking if the
commit is flagged as UNINTERESTING. The fix of course, is to do
precisely that.

The current behavior is most certainly not what we want. After this
patch, nothing gets exported, because nothing was selected (everything

Signed-off-by: Felipe Contreras <>
 builtin/fast-export.c  | 4 +++-
 t/ | 6 ++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 26f6d1c..7a310e4 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -529,7 +529,9 @@ static void get_tags_and_duplicates(struct object_array 
                 * sure it gets properly upddated eventually.
                if (commit->util || commit->object.flags & SHOWN)
-                       string_list_append(extra_refs, full_name)->util = 
+                       if (!(commit->object.flags & UNINTERESTING))
+                               string_list_append(extra_refs, full_name)->util 
= commit;
                if (!commit->util)
                        commit->util = full_name;
diff --git a/t/ b/t/
index 67a7372..9b53ba7 100755
--- a/t/
+++ b/t/
@@ -469,4 +469,10 @@ test_expect_success 'refs are updated even if no commits 
need to be exported' '
        test_cmp expected actual
+test_expect_success 'proper extra refs handling' '
+       git fast-export master ^master master..master > actual &&
+       echo -n > expected &&
+       test_cmp expected actual

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to