Brandon Williams wrote: > --- a/builtin/fetch.c > +++ b/builtin/fetch.c > @@ -967,10 +967,16 @@ static int fetch_refs(struct transport *transport, struct ref *ref_map) > int ret = quickfetch(ref_map); > if (ret) > ret = transport_fetch_refs(transport, ref_map); > - if (!ret) > - ret |= store_updated_refs(transport->url, > - transport->remote->name, > - ref_map); > + if (ret) > + transport_unlock_pack(transport); > + return ret; > +} > + > +static int consume_refs(struct transport *transport, struct ref *ref_map) > +{ > + int ret = store_updated_refs(transport->url, > + transport->remote->name, > + ref_map); > transport_unlock_pack(transport); > return ret; > } [...] > - fetch_refs(transport, ref_map); > + if (!fetch_refs(transport, ref_map)) > + consume_refs(transport, ref_map); > Ah, I missed something in my previous reply. If transport_fetch_refs succeeds and store_updated_refs fails, then in the old code, transport_unlock_pack would clean up by removing the no longer needed .keep file. In the new code, that's consume_refs's responsibility, which I find much nicer. It's probably worth mentioning that in the commit message as well. Thanks again, Jonathan