]> git.ipfire.org Git - thirdparty/git.git/commit - git-filter-branch.sh
filter-branch: eliminate duplicate mapped parents
authorCharles Bailey <cbailey32@bloomberg.net>
Mon, 30 Jun 2014 21:20:27 +0000 (22:20 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 1 Jul 2014 15:30:41 +0000 (08:30 -0700)
commit79bc4ef3686bc6795aa79a1d4aa6d3060a2cbd93
tree51a1c1d703693b4e74a9bc728ea75e669cfbc1a0
parent341e7e8eda3dbeb6867f4f8f45b671201b807de5
filter-branch: eliminate duplicate mapped parents

When multiple parents of a merge commit get mapped to the same
commit, filter-branch used to pass all instances of the parent
commit to the parent and commit filters and to "git commit-tree" or
"git_commit_non_empty_tree".

This can often happen when extracting a small project from a large
repository; merges can join history with no commits on any branch
which affect the paths being retained.  Once the intermediate
commits have been filtered out, all the immediate parents of the
merge commit can end up being mapped to the same commit - either the
original merge-base or an ancestor of it.

"git commit-tree" would display an error but write the commit with
the normalized parents in any case.  "git_commit_non_empty_tree"
would fail to notice that the commit being made was in fact a
non-merge commit and would retain it even if a further pass with
"--prune-empty" would discard the commit as empty.

Ensure that duplicate parents are pruned before the parent filter to
make "--prune-empty" idempotent, removing all empty non-merge
commits in a singe pass.

Signed-off-by: Charles Bailey <cbailey32@bloomberg.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-filter-branch.sh
t/t7003-filter-branch.sh