--- /dev/null
+#!/bin/sh
+
+# Create an empty file object
+empty_file_hash=$(git hash-object -w --stdin <<FOO
+FOO)
+
+# Make a root directory tree with the config file in it
+config_tree_hash=$(git mktree <<FOO
+100644 blob $empty_file_hash config
+FOO)
+
+# Commit the root directory tree
+commit_hash=$(git commit-tree $config_tree_hash <<FOO
+Initial commit on config branch.
+FOO)
+
+# Push the commit out to the gitconfig branch
+git update-ref refs/heads/gitconfig "$commit_hash" 0000000000000000000000000000000000000000
+
--- /dev/null
+#!/bin/sh
+
+refname="$1"
+oldrev="$2"
+newrev="$3"
+
+if [ "$refname" != "refs/heads/gitconfig" ] ; then
+ exit 0
+fi
+
+tree_contents=$(git ls-tree $newrev)
+if [[ "$tree_contents" =~ (.{40})[[:space:]]config ]] ; then
+ config_hash=${BASH_REMATCH[1]}
+ echo "hash=$config_hash"
+ git cat-file blob "$config_hash" | while read line ; do
+ key="${line%=*}"
+ value="${line#*=}"
+ git config "${key}" "${value}"
+ done
+fi
+
--- /dev/null
+#!/bin/sh
+
+test_description='server update git config'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+ echo "setup" >a &&
+ git add a &&
+ git commit -m "setup" &&
+ git clone ./. server &&
+ rm -fr server/.git/hooks &&
+ git remote add origin ./server &&
+ git config --add branch.master.remote origin &&
+ git config --add branch.master.merge refs/heads/master &&
+ git fetch
+'
+
+install_update_hook 'update-git-config'
+
+test_expect_success 'pushing initial value works' '
+ cd server &&
+ ! git config --list | grep foo &&
+ cd .. &&
+
+ ../../scripts/make-gitconfig-branch.sh &&
+ git checkout gitconfig &&
+ echo "foo.foo=bar" > config &&
+ git commit -a -m "Set foo.foo=bar."
+ git push origin gitconfig
+
+ cd server &&
+ git config --list | grep foo &&
+ cd ..
+'
+
+test_done
+