Quick Tip - Prevent to commit unformatted Go code

One of the many things a love about Go, is that it gives you a set of tools so that you can keep true to your own code style. People can adapt to different formatting styles but it's better if they don't have to, and less time is devoted to the topic if everyone adheres to the same style. Go takes an unusual, and IMHO a great approach to let the machine take care of that for you.  The gofmt program reads a Go program and emits the source in a standard style of indentation and vertical alignment, retaining and if necessary reformatting comments.

Lets say our code is ready and since we're delegating the style responsability to the machine we forgot to gofmt our code before commiting to our repository. Now we have measy code in our production branch...

Don't worry! Simply create a file in your /.git/hooks/ directory with the following contents:

# Copyright 2012 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# git gofmt pre-commit hook
# To use, store as .git/hooks/pre-commit inside your repository and make sure
# it has execute permissions.
# This script does not handle file names that contain spaces.

gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '.go$')
[ -z "$gofiles" ] && exit 0

unformatted=$(gofmt -l $gofiles)
[ -z "$unformatted" ] && exit 0

# Some files are not gofmt'd. Print message and fail.

echo >&2 "Go files must be formatted with gofmt. Please run:"
for fn in $unformatted; do
    echo >&2 "  gofmt -w $PWD/$fn"

exit 1

Make it executable

$ chmod +x .git/hooks/file_name

And you're done! 


Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.

PHP code

  • You may post PHP code. You should include <?php ?> tags.