#!/usr/bin/env bash # サーバー上で root として手動実行する # repos.txt に基づいてベアリポジトリとワークツリーを作成し、 # git/hooks/ のフックを /var/git/*/hooks/ に展開する set -euo pipefail APP_DIR="$(cd "$(dirname "$0")/.." && pwd)" REPOS_FILE="$APP_DIR/git/repos.txt" HOOKS_SRC="$APP_DIR/git/hooks" AUTH_KEYS_SRC="$APP_DIR/server/authorized_keys" if [[ "$(id -u)" -ne 0 ]]; then echo "ERROR: root として実行してください" >&2 exit 1 fi echo "=== SSH authorized_keys ===" if [[ -f "$AUTH_KEYS_SRC" ]]; then mkdir -p /root/.ssh chmod 700 /root/.ssh if diff -q "$AUTH_KEYS_SRC" /root/.ssh/authorized_keys >/dev/null 2>&1; then echo " unchanged" else cp "$AUTH_KEYS_SRC" /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys echo " installed" fi fi echo "" echo "=== Repositories ===" while IFS=: read -r repo_name work_tree; do [[ "$repo_name" =~ ^#.*$ || -z "$repo_name" ]] && continue bare_repo="/var/git/${repo_name}.git" if [[ ! -d "$bare_repo" ]]; then echo " create: $bare_repo" mkdir -p "$bare_repo" git init --bare "$bare_repo" else echo " exists: $bare_repo" fi if [[ ! -d "$work_tree" ]]; then echo " mkdir: $work_tree" mkdir -p "$work_tree" fi done < "$REPOS_FILE" echo "" echo "=== Hooks ===" for repo_src in "$HOOKS_SRC"/*/; do repo_name="$(basename "$repo_src")" git_hooks_dir="/var/git/${repo_name}.git/hooks" if [[ ! -d "$git_hooks_dir" ]]; then echo " SKIP: $git_hooks_dir not found ($repo_name)" continue fi for hook_file in "$repo_src"*; do hook_name="$(basename "$hook_file")" dst="$git_hooks_dir/$hook_name" if diff -q "$hook_file" "$dst" >/dev/null 2>&1; then echo " unchanged: $repo_name/$hook_name" else cp "$hook_file" "$dst" chmod +x "$dst" echo " installed: $repo_name/$hook_name" fi done done echo "" echo "Done."