Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Pre-commit hook script for git to fix whitespace and long lines.
# Pre-commit hook for git which removes trailing whitespace, converts tabs to spaces, and enforces a max line length.
if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
# Initial commit: diff against an empty tree object
files_with_whitespace=`git diff-index --check --cached $against | # Find all changed files
sed '/^[+-]/d' | # Remove lines which start with + or -
sed -E 's/:[0-9]+:.*//' | # Remove end of lines which contains numbers, etc.
sed '/Generated/d' | # Ignore generated files
sed '/Libraries/d' | # Ignore libraries
sed '/\.[mh]\$/!d' | # Only process .m and .h files
uniq` # Remove duplicate files
# Change field separator to newline so that for correctly iterates over lines
# Find files with trailing whitespace
for FILE in $files_with_whitespace ; do
echo "Fixing whitespace in $FILE" >&2
# Replace tabs with four spaces
sed -i "" $'s/\t/ /g' "$FILE"
# Strip trailing whitespace
sed -i '' -E 's/[[:space:]]*$//' "$FILE"
git add "$FILE"
# Detect too long lines in .m and .h files:
changed_source_files=`git diff-index --cached $against --numstat |
cut -f3 |
egrep '\.[hm]$'`
if [[ -n "$changed_source_files" ]]; then
for file in $changed_source_files ; do
too_long=`git diff-index --cached -p $against -- "$file" |
egrep '^\+.{117,}' |
sed -E 's/^\+//'`
if [[ -n "$too_long" ]]; then
printf "\n$file:\n%s\n" "$too_long" >&2
if [[ -n $found_offenses ]]; then
echo "\nAborting commit because you added lines longer than 116 chars." >&2
exit 1
Copy link

larsxschneider commented Oct 22, 2012

Can you give me a hint to detect "cpp" files with "sed '/.[mh]$/!d'" ? :D

Copy link

8bitDesigner commented Nov 16, 2012

Would this work? - "sed '/.(m|h|cpp)\$/!d'"

Copy link

8bitDesigner commented Nov 16, 2012

Oh man, forgot sed has crazy escaping rules:

"sed '/.\(m|h|cpp\)\$/!d'"

Copy link

james-gardner commented Dec 11, 2015

What about mixed sequences of tabs and spaces? Not sure sed will help here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment