diff --git a/.gitattributes b/.gitattributes
index f2cc330c3db2f1d368c645c5d16f3c2ed381677b..3323f94b9bf89c214c31ec264378e6c1d7916353 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -4,5 +4,6 @@
 *                export-ignore
 
 config*          eol=lf         whitespace=indent-with-non-tab
+git-*            eol=lf         whitespace=indent-with-non-tab
 tips             eol=lf         whitespace=indent-with-non-tab
 setup-*          eol=lf         whitespace=indent-with-non-tab
diff --git a/git-gerrit-push b/git-gerrit-push
new file mode 100755
index 0000000000000000000000000000000000000000..2471490c25ba59b85d2a4f8bc38360642fa613ba
--- /dev/null
+++ b/git-gerrit-push
@@ -0,0 +1,73 @@
+#!/usr/bin/env bash
+#=============================================================================
+# Copyright 2010-2012 Kitware, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+USAGE="[<remote>] [--no-topic] [--dry-run] [--]"
+OPTIONS_SPEC=
+SUBDIRECTORY_OK=Yes
+. "$(git --exec-path)/git-sh-setup"
+
+#-----------------------------------------------------------------------------
+
+remote=''
+refspecs=''
+no_topic=''
+dry_run=''
+
+# Parse the command line options.
+while test $# != 0; do
+	case "$1" in
+		--no-topic) no_topic=1 ;;
+		--dry-run)  dry_run=--dry-run ;;
+		--) shift; break ;;
+		-*) usage ;;
+		*) test -z "$remote" || usage ; remote="$1" ;;
+	esac
+	shift
+done
+test $# = 0 || usage
+
+# Default remote.
+test -n "$remote" || remote="gerrit"
+
+if test -z "$no_topic"; then
+	# Identify and validate the topic branch name.
+	topic="$(git symbolic-ref HEAD | sed -e 's|^refs/heads/||')"
+	if test "$topic" = "master"; then
+		die 'Please name your topic:
+		git checkout -b descriptive-name'
+	fi
+	refspecs="HEAD:refs/for/master/$topic"
+fi
+
+# Exit early if we have nothing to push.
+if test -z "$refspecs"; then
+	echo "Nothing to push!"
+	exit 0
+fi
+
+# Fetch the current upstream master branch head.
+# This helps the computation of a minimal pack to push.
+echo "Fetching $remote master"
+fetch_out=$(git fetch "$remote" master 2>&1) || die "$fetch_out"
+
+# Push.  Save output and exit code.
+echo "Pushing to $remote"
+push_stdout=$(git push --porcelain $dry_run "$remote" $refspecs); push_exit=$?
+echo "$push_stdout"
+
+# Reproduce the push exit code.
+exit $push_exit