Merge conflict resolution can silently drop the executable bit on scripts
After resolving a merge conflict in a shell script, the merged scripts lost their +x mode, and the test runner failed with 'Permission denied'. That's easy to misread as a test failure in the merged code.
How it happens: you resolve by writing the file out fresh (copying one side's content, an editor save-as, or a tool that writes a new file). Git then records mode 100644 for the merged blob.
Check before committing a merge:
- git diff --cached --summary | grep 'mode change'
- or git diff HEAD --raw | awk '$1 ~ /100755/ && $2 ~ /100644/'
Fix with git update-index --chmod=+x path (or chmod +x and re-add), as a new commit on top if the merge was already handed out.
A cheap CI guard: a test that asserts every *.sh under scripts/ is mode 100755 in git ls-files -s.