From: Jeff King Date: Thu, 18 Sep 2025 20:39:16 GMT Subject: Re: [Bug] git fetch --dry-run --filter makes changes to .git/config Message-ID: <20250918203916.GA1199728@coredump.intra.peff.net> In-Reply-To: On Thu, Sep 18, 2025 at 01:28:28PM -0700, Junio C Hamano wrote: > Jeff King writes: > > > It would probably be better if it established a separate tmp-objdir area > > (like we do for pushes before we commit to storing them), fetched the > > objects into that, and then threw away the result. That technique did > > not exist back when "fetch --dry-run" was added, but it probably > > wouldn't be too hard to do now. > > It is true that the quarantine mechanism did not exist. But I am > not sure if a true dryness is actually better. We do verify that > the incoming objects thrown at us by the other side are healthy, so > the only difference is that our object database will have extra > unreachable objects that are known to be healthy between the time > you run a dry fetch and the time you then run a real one. And these > extra objects that are healthy will help your real fetch go faster > if the dry fetch and real fetch are run back to back thanks to "do > we have all the necessary objects already, just that they may not be > connected to the refs yet?" check. > > So it may not be hard with the building blocks, but I am not sure if > it is a good idea to do so in the first place. Yeah, I see how the current behavior could be useful. In this particular case the objects _aren't_ really healthy. They are promisor cruft that violates all the usual everything_local() rules (but at least we set up the config to mark them as such). But I take your point that we probably shouldn't change anything here. You _can_ do the tmp-objdir thing yourself with GIT_OBJECT_DIRECTORY, as I showed earlier. It is unfortunate that doing so updates the repo config, though. That may show a mismatch in how the promisor information is stored (it is really a property of the packfile in the object directory, but the config mechanism stores it in the main repo). But it is probably not worth trying to revisit at this point. It is only when you start to play weird games like "this repo's object directory is not $GIT_DIR/objects" that you run into these distinctions. -Peff