Random Culprits‎ > ‎

HOWTO: Automatically Fix / Remove Trailing Whitespace in Git via a Pre-commit Hook

posted Aug 24, 2011, 12:34 PM by Nicolay Doytchev   [ updated Mar 29, 2012, 7:53 PM ]

Notes

The supplied shell script will not work with Mac OS X and possibly other non-GNU operating systems as their "sed" implementation takes different parameters. However you should be able to modify it to fit your environment.

HOWTO

If you are here, you've seen the trailing whitespace errors shown by Git when committing changes. These errors can indeed cause problems. Not only when e-mailing patches but also when working with weird glue tools such as git-p4 which relies on patches to sync changes to Perforce. One way to deal with these is ignoring them. While that works, it does only until whitespace introduces unintended change in a patch and things explode. To avoid that it is better to keep your files clean from trailing whitespace which can be easily achieved by using a pre-commit hook in Git. This hook is a script which is ran before each commit to do something useful. In this case to clean trailing whitespace. To install such a hook you can do the following:
  1. In a terminal of some sort, go to your working git repository ($GIT_DIR):
    cd $GIT_DIR
  2. Now open a new file for writing:
    cat > .git/hooks/pre-commit
  3. Paste the following code in the terminal:
    #!/bin/sh

    if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
       against=HEAD
    else
       # Initial commit: diff against an empty tree object
       against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
    fi
    # Find files with trailing whitespace
    for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq` ; do
       # Fix them!
       sed -i 's/[[:space:]]*$//' "$FILE"
       git add "$FILE"
    done
    exit
  4. Hit "Enter" and then "Control+D" to end editing.
  5. Finally, make the file executable:
    chmod +x .git/hooks/pre-commit
Now every time you commit changes, Git will run the hook and clear trailing whitespace before actually saving the changes.

Credits

The original shell script can be found here.
Comments

+Nicolay