Skip to content

Instantly share code, notes, and snippets.

@johnjohndoe
Created November 6, 2012 11:48
Show Gist options
  • Star 32 You must be signed in to star a gist
  • Fork 11 You must be signed in to fork a gist
  • Save johnjohndoe/4024222 to your computer and use it in GitHub Desktop.
Save johnjohndoe/4024222 to your computer and use it in GitHub Desktop.
Git pre-commit hook to add a new line at the end of a file and remove trailing whitespaces
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# Usage:
# Remove the .sh file extension when you put the script in your hooks folder!
#
# Purposes:
# Add an empty line at the end of the file.
# Remove trailing spaces at the end of a line.
#
# Source: http://eng.wealthfront.com/2011/03/corrective-action-with-gits-pre-commit.html
# Version: 2011-03-08
# Related: http://stackoverflow.com/questions/13223868/how-to-stage-line-by-line-in-git-gui-although-no-newline-at-end-of-file-warnin
# Files (not deleted) in the index
files=$(git diff-index --name-status --cached HEAD | grep -v ^D | cut -c3-)
if [ "$files" != "" ]
then
for f in $files
do
# Only examine known text files
if [[ "$f" =~ [.](conf|css|erb|html|js|json|log|properties|rb|ru|txt|xml|yml|h|m)$ ]]
then
# Add a linebreak to the file if it doesn't have one
if [ "$(tail -c1 $f)" != '\n' ]
then
echo >> $f
git add $f
fi
# Remove trailing whitespace if it exists
if grep -q "[[:blank:]]$" $f
then
sed -i "" -e $'s/[ \t]*$//g' $f
git add $f
fi
fi
done
fi
@omahlama
Copy link

I personally added md, sh and scss as known text files. Good stuff otherwise!

@blelump
Copy link

blelump commented May 1, 2015

I came across strange issue on Ubuntu cause it still complained Syntax error: "(" unexpected (expecting "then") whereas the syntax seems to be just fine.

For those who are not familiar with (yet), Ubuntu has dash as default shell and dash does not support regexp comparison so either change /bin/sh to /bin/bash or change condition into if echo "$f" | egrep -q "[.](conf|css|erb|html|js|json|log|properties|rb|ru|txt|xml|yml|h|m)$".

@Martmists-GH
Copy link

0/10 can't use on windows

@jugaldb
Copy link

jugaldb commented Nov 6, 2020

I want to add stuff in the beginning of the file, lets say in each file I want to add, 'Hello this was added at - time'

@johnjohndoe
Copy link
Author

@jugaldb I am not maintaining the code snippet. I recommend you do some research, create a first script and ask specific questions on Stackoverflow to solve your problem.

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