diff --git a/README.md b/README.md index 2594b0a..e8502a3 100644 --- a/README.md +++ b/README.md @@ -56,16 +56,16 @@ ## Git -Репозиторий инициализирован, первый коммит на ветке `main`. Remote: `origin` → Gitea (при необходимости измените URL). +Репозиторий на ветке `main`, remote `origin` → Gitea. -Чтобы отправить код на сервер (после создания репозитория MAX в Gitea при необходимости): +**Пуш без ввода пароля:** скрипт **`./git-push.sh`** читает `GITEA_USER`, `GITEA_PASSWORD`, `GITEA_URL` из `.env` и пушит в `origin main`. Пароль в URL после push убирается. ```bash cd /dev/MAX -git push -u origin main +./git-push.sh ``` -Логин/пароль Gitea запросит при первом push. +Можно сказать «запуш» — тогда будет выполнен этот скрипт (с текущими изменениями нужно сначала сделать `git add` и `git commit`). ## Лицензия / конфиденциальность diff --git a/git-push.sh b/git-push.sh new file mode 100755 index 0000000..a9824aa --- /dev/null +++ b/git-push.sh @@ -0,0 +1,48 @@ +#!/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 убран."