On Fri, Oct 02, 2026 at 09:01:27PM -0400, Grant Moyer wrote:
Show 43 quoted lines
> 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 <michele@locati.it>
> Co-authored-by: Michele Locati <michele@locati.it>
> Signed-off-by: Michele Locati <michele@locati.it>
> Signed-off-by: Grant Moyer <dev@grantmoyer.com>