blob: 248f3ee34ea9070762c886282ecceb80c0e93086 [file]
#!/bin/sh
#
# Fail if any tracked file is matched by an ignore rule. That combination is
# always a mistake: git status stops reporting edits to the file, so changes
# go unnoticed. It usually happens when a configure-generated file is promoted
# to a tracked source file and the stale rule is left behind.
#
# core.excludesFile=/dev/null keeps the verdict dependent only on the ignore
# files in the repository, not on a developer's global excludes.
set -e
tracked_ignored=$(git -c core.excludesFile=/dev/null \
ls-files --cached --ignored --exclude-standard)
if [ -z "$tracked_ignored" ]; then
exit 0
fi
echo "These tracked files are matched by an ignore rule:"
echo
# --no-index because check-ignore skips tracked files otherwise, which is
# exactly the set being reported here.
echo "$tracked_ignored" | while read -r file; do
git -c core.excludesFile=/dev/null \
check-ignore --no-index -v "$file" || echo " $file"
done
echo
echo "A tracked file must not be ignored. Either delete the file, or drop"
echo "or negate the rule that matches it."
exit 1