From: Patrick Steinhardt Date: Mon, 05 Oct 2026 06:11:02 GMT Subject: Re: [PATCH v3] filter-branch: fix commit map init from state branch Message-ID: In-Reply-To: <20261003010128.256757-1-dev@grantmoyer.com> On Fri, Oct 02, 2026 at 09:01:27PM -0400, Grant Moyer wrote: > The "--state-branch" option asks git-filter-branch(1) to write a > mapping from old to new objects into a branch to enable incremental > processing of large histories. This object mapping is stored as > a simple blob at "$state_branch:filter.map" with one object pair > per line in the format "$from_commit:$to_commit". Before processing > commits in a subsequent run, the state branch is used to populate an > object mapping directory, where each file is named "map/$from_commit" > and has contents "$to_commit". > > In f6d855091e (filter-branch: stop depending on Perl, 2025-04-16), > we refactored git-filter-branch(1) to no longer require Perl, > but accidentally started to interpret object pairs in reverse (as > "$to_commit:$from_commit") when populating the map directory from > the state branch. This can cause all kinds of bad behavior from the > state-branch being effectively ignored to previously filtered objects > accidentally being mapped back to unfiltered objects. One especially > evident case occurs when "git filter-branch --prune-empty ..." maps > some commits to nothing, then on subsequent runs outputs many errors > while trying to create files with empty names, like: > > > /usr/lib/git-core/git-filter-branch: line 305: ../map/: Is a directory > > This regression went unnoticed because, since the introduction of > the only test for "--state-branch" in 709cfe848a (filter-branch: skip > commits present on --state-branch, 2018-06-26), the test accidentally > passes even if commits are not skipped. The test checks that after > populating a state branch with git-filter-branch(1), then running > it again with that state branch, the resulting filtered commits for > the first run and second run match. However since the filter used is > deterministic, the commits always match, even if the commits in the > state branch are re-filtered. > > Fix the population of the object mapping dir by interpreting > object pairs as "$from_commit:$to_commit". Also fix the existing > "--state-branch" test by directly exiting with a non-zero code if > any commits from the state branch aren't skipped. Finally, add a new > "--state-branch" test which directly checks that a commit from the > state branch is used when incrementally filtering a repo. > > Tested-by: Michele Locati > Co-authored-by: Michele Locati > Signed-off-by: Michele Locati > Signed-off-by: Grant Moyer Thanks, I'm happy with this version. Patrick