git-push.sh: пуш в Gitea без ввода пароля (креды из .env)

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
root
2026-02-16 09:32:24 +03:00
parent 7cd3ccf21c
commit 175345194c
2 changed files with 52 additions and 4 deletions

View File

@@ -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`).
## Лицензия / конфиденциальность

48
git-push.sh Executable file
View File

@@ -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 убран."