Merge branch 'gm/filter-branch-state-map-fix' into next

The commit map populated from the state branch in 'git
filter-branch' has been corrected to parse the map using the
original-to-rewritten order.

* gm/filter-branch-state-map-fix:
  filter-branch: fix commit map init from state branch
next
Junio C Hamano 2026-10-08 10:52:21 -07:00
commit 1721845755
2 changed files with 27 additions and 2 deletions

View File

@ -302,7 +302,9 @@ then
do
case "$line" in
*:*)
echo "${line%:*}" >../map/"${line#*:}";;
from_commit=${line%:*}
to_commit=${line#*:}
echo "$to_commit" >../map/"$from_commit";;
*)
die "Unable to load state from $state_branch:filter.map";;
esac

View File

@ -121,10 +121,33 @@ W=$(git rev-parse HEAD)
test_expect_success 'using --state-branch to skip already rewritten commits' '
test_when_finished git reset --hard $V &&
git reset --hard $V &&
git filter-branch --state-branch state -f --tree-filter "touch file || :" HEAD &&
git filter-branch --state-branch state -f --tree-filter "exit 1" HEAD &&
test_cmp_rev $W HEAD
'

test_expect_success '--state-branch incremental rewrite uses the rewritten parents' '
test_when_finished "rm -fr incremental" &&
git init incremental &&
(
cd incremental &&
mkdir sub &&
test_commit first sub/file &&
test_commit outside root-file &&
git filter-branch --state-branch refs/state \
--prune-empty --subdirectory-filter sub -- HEAD &&
rewritten_first=$(git rev-parse HEAD) &&
git reset --hard outside &&
test_commit second sub/file &&
git filter-branch -f --state-branch refs/state \
--prune-empty --subdirectory-filter sub -- outside..HEAD &&
test_cmp_rev $rewritten_first HEAD^ &&
git show refs/state:filter.map >map &&
echo "$(git rev-parse second):$(git rev-parse HEAD)" >expect &&
grep "^$(git rev-parse second):" map >actual &&
test_cmp expect actual
)
'

git tag oldD HEAD~4
test_expect_success 'rewrite one branch, keeping a side branch' '
git branch modD oldD &&