diff options
Diffstat (limited to 'git-shell-commands/create-mirror')
-rwxr-xr-x | git-shell-commands/create-mirror | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/git-shell-commands/create-mirror b/git-shell-commands/create-mirror new file mode 100755 index 0000000..8d2129c --- /dev/null +++ b/git-shell-commands/create-mirror @@ -0,0 +1,53 @@ +#!/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}" |