#!/usr/bin/env bash # Пуш в Gitea без ввода пароля. Читает GITEA_USER, GITEA_PASSWORD, GITEA_URL из .env. # Использование: ./git-push.sh или ./git-push.sh origin main set -e cd "$(dirname "$0")" if [[ ! -f .env ]]; then echo "Файл .env не найден." >&2 exit 1 fi GITEA_USER= GITEA_PASSWORD= GITEA_URL= while IFS= read -r line; do line=$(echo "$line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') [[ -z "$line" || "$line" =~ ^# ]] && continue if [[ "$line" =~ ^GITEA_USER=(.*)$ ]]; then GITEA_USER="${BASH_REMATCH[1]}" elif [[ "$line" =~ ^GITEA_PASSWORD=(.*)$ ]]; then GITEA_PASSWORD="${BASH_REMATCH[1]}" elif [[ "$line" =~ ^GITEA_URL=(.*)$ ]]; then GITEA_URL="${BASH_REMATCH[1]}" fi done < .env [[ -z "$GITEA_USER" || -z "$GITEA_URL" ]] && { echo "В .env задайте GITEA_USER и GITEA_URL." >&2; exit 1; } GITEA_URL="${GITEA_URL%/}" # Путь репо из текущего remote (например negodiy/MAX.git) REMOTE_PATH=$(git remote get-url origin 2>/dev/null | sed -n 's|.*://[^/]*/||p') [[ -z "$REMOTE_PATH" ]] && REMOTE_PATH="negodiy/MAX.git" # URL-кодирование пароля (безопасно для спецсимволов) ENCODED_PASS=$(printf '%s' "$GITEA_PASSWORD" | python3 -c "import sys, urllib.parse; print(urllib.parse.quote(sys.stdin.read(), safe=''))" 2>/dev/null || echo "$GITEA_PASSWORD") HOST="${GITEA_URL#*://}" ORIGIN_PLAIN="${GITEA_URL}/${REMOTE_PATH}" # Протокол (http или https) + :// + user:pass@ + host/path ORIGIN_WITH_CREDS="${GITEA_URL%%://*}://${GITEA_USER}:${ENCODED_PASS}@${HOST}/${REMOTE_PATH}" git remote set-url origin "$ORIGIN_WITH_CREDS" if (($#)); then git push "$@" else git push -u origin main fi git remote set-url origin "$ORIGIN_PLAIN" echo "Готово. Пароль из remote убран."