Subject: Re: [PATCH] filter-branch: Big syntax change; support rewriting multiplerefs

From: Johannes Sixt <[email-masked]>
Date: Tue, 24 Jul 2007 11:27:49 +0200

Johannes Schindelin wrote:
> +# These refs should be updated if their heads were rewritten
> +
> +git rev-parse --revs-only --symbolic "$@" |
> +while read ref
> +do
> +       # normalize ref
> +       case "$ref" in
> +       HEAD)
> +               ref="$(git symbolic-ref "$ref")"
> +       ;;
> +       refs/*)
> +       ;;
> +       *)
> +               ref="$(git for-each-ref --format='%(refname)' |
> +                       grep /"$ref")"
> +       esac
> +
> +       git check-ref-format "$ref" && echo "$ref"
> +done > "$tempdir"/heads

This does not work as I'd expected it: I can't successfully say:

   git-filter-branch master

It tells me:

   Which ref do you want to rewrite?

> +# NEEDSWORK: we should sort the unmapped refs topologically first
> +while read ref
> +do
> +       sha1=$(git rev-parse "$ref"^0)
> +       test -f "$workdir"/../map/$sha1 && continue
> +       # Assign the boundarie(s) in the set of rewritten commits
> +       # as the replacement commit(s).
> +       # (This would look a bit nicer if --not --stdin worked.)
> +       for p in $((cd "$workdir"/../map; ls | sed "s/^/^/") |
> +               git rev-list $ref --boundary --stdin |
> +               sed -n "s/^-//p")
> +       do
> +               map $p >> "$workdir"/../map/$sha1
> +       done
> +done < "$tempdir"/heads

This logic seems to be borked, and I don't grok it. I was trying this:

   git-filter-branch -- --since=2007.01.10 \
		refs/heads/topic refs/heads/master

where topic's last change is from before 2007.01.10, i.e. it is not
among the rewritten commits. And I get this:

WARNING: Ref 'refs/heads/master' is unchanged
WARNING: 'refs/heads/topic' was rewritten into multiple commits:
329325526647503382ae7dee41c12fe6b81bbe43
2bdf3349b76f72ceb71755c75a555d60bc7c73aa
ce6c9dfeac5ddbd64da2d9360d6552717df81d1f

The first 2 of these 3 sha1s happen to be merge bases of topic and
master, but none of them appear anywhere in

   git rev-list --parents --boundary --since=2007.07.10 \
		refs/heads/topic refs/heads/master

What's up?

-- Hannes