#!/bin/bash set -e if test "${#}" -ne 1; then printf "%s\n" "usage: $(basename $0) https://url/repo" exit 1 fi REPO="${1}" REPO_NAME=$(basename "${REPO}") REPO_DIR="/srv/git/repos/${REPO_NAME}.git" if test -d "${REPO_DIR}"; then printf "%s\n" "[err] repository ${REPO_NAME}.git already exists at ${REPO_DIR}" exit 1 fi TMP_DIR=$(mktemp -d -p /tmp) trap 'rm -rf "$TMP_DIR"' EXIT printf "%s\n" "[inf] cloning upstream repo" git clone --mirror --quiet "${REPO}" "${TMP_DIR}" printf "%s\n" "[inf] creating bare fork repository" mkdir -p "${REPO_DIR}" git init --bare --quiet "${REPO_DIR}" cat > "${REPO_DIR}/hooks/post-receive" << "EOL" #!/bin/sh agefile="$(git rev-parse --git-dir)"/info/web/last-modified mkdir -p "$(dirname "$agefile")" && git for-each-ref \ --sort=-authordate --count=1 \ --format='%(authordate:iso8601)' \ >"$agefile" EOL chmod +x "${REPO_DIR}/hooks/post-receive" printf "%s\n" "[inf] pushing to bare repo" git --git-dir="${TMP_DIR}" push --mirror --quiet "${REPO_DIR}" printf "%s\n" "[inf] configuring bare repo" git --git-dir="${REPO_DIR}" config core.logallrefupdates true git --git-dir="${REPO_DIR}" config cgit.section "03. mirrors" git --git-dir="${REPO_DIR}" remote add upstream "${REPO}" chown -R git:git "${REPO_DIR}" chmod -R g-w "${REPO_DIR}" printf "%s\n" "[inf] mirrored ${REPO}"