#!/bin/sh set -eu PRG=$(basename "$0") showhelp() { cat <<EOF Usage: $PRG PROJECT [GIT_REPO [SSH_CONN [GIT_REMOTE]]] Initialize remote git, push local git, and set as default remote. PROJECT basename or relative path for remote git project GIT_REPO hostname for public git access, or absolute basepath default: "source." + current domainname SSH_CONN hostname for ssh, optionally with user + "@" prepended default: GIT_REPO unless it starts with "/" GIT_REMOTE name for local repository set default: "origin" Full remote path becomes SSH_USER@SSH_HOST:BASEPATH/PROJECT.git where BASEPATH is resolved as "/srv/git/" + GIT_REPO or simply GIT_REPO when it begins with "/". When local repository set is "origin" it is marked as default remote. Examples: $PRG myproject $PRG some/subproject git.example.org me@shell.example.org $PRG some/subproject /private/path/on/ssh/host me.example.org backup $PRG some/subproject /private/path/on/local/host EOF } exit1() { echo >&2 "${1:+ERROR: }${1:-Internal error!}" exit 1 } # parse cmdline options TEMP="`getopt -s sh -o h -l help -n "$PRG" -- "$@"`" || exit1 eval set -- "$TEMP" while true; do case "$1" in -h|--help) showhelp; exit;; --) shift; break;; *) exit1;; esac done PROJECT=${1-$(showhelp; exit1 "project name missing")} GIT_REPO=${2:-source.$(dnsdomainname --domain)} case "$GIT_REPO" in /*) BASEPATH=$GIT_REPO ;; *) GIT_HOST=$GIT_REPO BASEPATH=/srv/git/"$GIT_REPO" ;; esac SSH_CONN=${3:-$GIT_HOST} GIT_REMOTE=${4:-origin} [ origin != "$GIT_REMOTE" ] || ORIGIN_IS_DEFAULT=yes # TODO: handle /~ BASEPATH specially and stop blindly ignore any error [ -z "$SSH_CONN" ] || ssh "$SSH_CONN" git init --bare --shared "$BASEPATH"/"$PROJECT".git || true git remote add "$GIT_REMOTE" "$SSH_CONN":"$BASEPATH"/"$PROJECT".git git push ${ORIGIN_IS_DEFAULT:+--set-upstream} "$GIT_REMOTE" master