mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
fast-export: Avoid dropping files from commits
When exporting a subset of commits on a branch that do not go back to a root commit (e.g. master~2..master), we still want each exported commit to have the same files in the exported tree as in the original tree. Previously, when given such a range, we would omit master~2 as a parent of master~1, but we would still diff against master~2 when selecting the list of files to include in master~1. This would result in only files that had changed in the given range showing up in the resulting export. In such cases, we should diff master~1 against the root instead (i.e. use diff_root_tree_sha1 instead of diff_tree_sha1). There's a special case to consider here: incremental exports (i.e. exports where the --import-marks flag is specified). If master~2 is an imported mark, then we still want to diff master~1 against master~2 when selecting the list of files to include. We can handle all cases, including the special case, by just checking whether master~2 corresponds to a known object mark when deciding what to diff against. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
4fa535a179
commit
ebeec7dbc5
@ -221,7 +221,8 @@ static void handle_commit(struct commit *commit, struct rev_info *rev)
|
||||
if (message)
|
||||
message += 2;
|
||||
|
||||
if (commit->parents) {
|
||||
if (commit->parents &&
|
||||
get_object_mark(&commit->parents->item->object) != 0) {
|
||||
parse_commit(commit->parents->item);
|
||||
diff_tree_sha1(commit->parents->item->tree->object.sha1,
|
||||
commit->tree->object.sha1, "", &rev->diffopt);
|
||||
|
@ -8,6 +8,9 @@ test_description='git fast-export'
|
||||
|
||||
test_expect_success 'setup' '
|
||||
|
||||
echo break it > file0 &&
|
||||
git add file0 &&
|
||||
test_tick &&
|
||||
echo Wohlauf > file &&
|
||||
git add file &&
|
||||
test_tick &&
|
||||
@ -57,8 +60,8 @@ test_expect_success 'fast-export master~2..master' '
|
||||
(cd new &&
|
||||
git fast-import &&
|
||||
test $MASTER != $(git rev-parse --verify refs/heads/partial) &&
|
||||
git diff master..partial &&
|
||||
git diff master^..partial^ &&
|
||||
git diff --exit-code master partial &&
|
||||
git diff --exit-code master^ partial^ &&
|
||||
test_must_fail git rev-parse partial~2)
|
||||
|
||||
'
|
||||
|
Loading…
Reference in New Issue
Block a user