summaryrefslogtreecommitdiff
path: root/git-shell-commands/create-mirror
diff options
context:
space:
mode:
Diffstat (limited to 'git-shell-commands/create-mirror')
-rwxr-xr-xgit-shell-commands/create-mirror53
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}"