For work I need to use git to manage various aspects of client projects, and because the code is proprietary, I have to manage a private git system. The way you do this is to create a user called git and to setup your authorized keys for that user. Then you make sure the user is using the git-shell with “chsh git -s $(which git-shell)” and make sure that you echo $(which git-shell) >> /etc/shells.

On my local machine I have a script like so:

#!/bin/bash
mkdir -p $1
cd $1
git init
ssh admin@mygitserver -p 1337 "bash /home/admin/make-git-repo $1"
git remote add origin ssh://git@mygitserver:1337/home/git/$1.git
git pull origin master
if [ ! -f .gitignore ]; then
	cp ~/bin/gitignore_template .gitignore
	git add .
	git commit -a -m "Initial Commit of $1"
	git push -u origin master
else
	git branch master --set-upstream-to=origin/master
fi

On my server, I have a bash script like so:

#!/bin/bash
if [ "$1" = "" ]; then
	echo "You must name the repos, don't add .git!";
	exit 1;
fi
if [ -d "/home/git/$1.git" ]; then
	echo "/home/git/$1.git already exists";
	exit 0;
fi
mkdir /home/git/$1.git
cd /home/git/$1.git
git init --bare
cd ../
chown git:git -R $1.git

That way I can just cd into a directory and type: addrepo some-project. And it gets created on the server, and setup, or if it is already on the server, it pulls it down. Bada-bing.