diff --git a/.travis.yml b/.travis.yml
index 441fa194675e92e063c93289953d480470123130..d36d9071eaa558982f438c107a3a98a879b58c68 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -26,8 +26,4 @@ before_script:
 
 sudo: false
 script:
-  - go install -v ./cmd/cashier ./cmd/cashierd
-  - go list ./... |grep -v vendor/ |xargs go test
-  - gofmt -d $(find -type f -name '*.go' -not -path './vendor/*')
-  - go list ./... |grep -v vendor/ |xargs go vet
-  - go list ./... |grep -v vendor/ |xargs -L1 golint -set_exit_status
+  - ./run_tests.sh
diff --git a/run_tests.sh b/run_tests.sh
new file mode 100755
index 0000000000000000000000000000000000000000..87d5cbd8bae27d6395fff8ba5723ec33404e2441
--- /dev/null
+++ b/run_tests.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+
+# This can be used as a pre-commit script.  Just run
+#   cp run_tests.sh .git/hooks/pre-commit
+# and it will run before each commit.
+
+set -xue
+
+go install -v ./cmd/cashier ./cmd/cashierd
+go list ./... |grep -v vendor/ |xargs go test
+gofmt -d $(find * -type f -name '*.go' -not -path 'vendor/*')
+go list ./... |grep -v vendor/ |xargs go vet
+if ! type -f golint > /dev/null; then
+  go get -u github.com/golang/lint/golint
+fi
+go list ./... |grep -v vendor/ |xargs -L1 golint -set_exit_status