| #!/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 |