diff --git a/apply.c b/apply.c index 3d69fec836d41f..56790f515e0186 100644 --- a/apply.c +++ b/apply.c @@ -3778,8 +3778,11 @@ static int check_preimage(struct apply_state *state, return error_errno("%s", old_name); } - if (!state->cached && !previous) - st_mode = ce_mode_from_stat(*ce, st->st_mode); + if (!state->cached && !previous) { + if (!trust_executable_bit && patch->old_mode) + st_mode = patch->old_mode; + else st_mode = ce_mode_from_stat(*ce, st->st_mode); + } if (patch->is_new < 0) patch->is_new = 0; diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh index e7a7295f1b687d..95917fee128c4f 100755 --- a/t/t4129-apply-samemode.sh +++ b/t/t4129-apply-samemode.sh @@ -101,4 +101,19 @@ test_expect_success POSIXPERM 'do not use core.sharedRepository for working tree ) ' +test_expect_success FILEMODE 'ensure git apply respects core.fileMode' ' + test_config core.fileMode false && + echo true >script.sh && + git add --chmod=+x script.sh && + test_tick && git commit -m "Add script" && + + echo true >>script.sh && + test_tick && git commit -m "Modify script" script.sh && + git format-patch -1 --stdout >patch && + + git switch -c branch HEAD^ && + git apply patch 2>err && + ! test_grep "has type 100644, expected 100755" err +' + test_done