7.4 KiB
name, title, description, version, author, license
| name | title | description | version | author | license |
|---|---|---|---|---|---|
| project-git-setup | Git-инициализация нового проекта (gitverse.ru + gitea pull-mirror) | Use when setting up git for a new project. | 1.0.0 | hermes | MIT |
Git-инициализация нового проекта
When to Use
Любой новый проект или перевод существующего каталога под git — сразу после создания проекта (даже «пустого», с одним README). Схема: локальный git → приватный репозиторий на gitverse.ru (истина) → pull mirror в gitea.nixg.ru (локальная резервная копия, синхронизация каждые 12 часов = 2 раза в сутки).
Триггеры
- «новый проект», «заведи git», «инициализируй репозиторий»
- Создание проекта, который будет жить в
/opt/<name>(стандарт окружения — всё в /opt)
Шаг 0. Собрать факты
- Имя репозитория: lowercase, дефисы (
tproxy-web,monitoring,openspec-lab) - Путь проекта (обычно
/opt/<name>) - Стек: есть ли
Dockerfile/docker-compose.yml/compose.yaml? Node/Python/Go? - Существующий
.gitignore(дополнить, не затирать)
Токены — только из настроек (НИКОГДА не искать по каталогам)
Единый источник: /opt/hermes/.hermes/secrets/git-tokens.env (chmod 600).
source /opt/hermes/.hermes/secrets/git-tokens.env
# → GITVERSE_LOGIN, GITVERSE_PAT, GITVERSE_API, GITEA_API, GITEA_TOKEN
Если файла нет — создать по образцу (значения брать из obsidian
homelab/gitea.nixg.ru/Gitverse mirror token.md ИЛИ из URL существующего mirror:
docker exec gitea cat /data/git/repositories/estorozhenko/<repo>.git/config),
затем записать в secrets и chmod 600.
Правила:
- Токены в коде/README/коммитах не хранить. В
.gitignoreвсех проектов — строкаsecrets/. - Внутри скиллов и reference — только плейсхолдеры
<PAT>/${GITVERSE_PAT}, не значения. - Новый токен создаётся один раз, кладётся в secrets файл, дальше только
source.
Шаг 1. .gitignore
Шаблон templates/docker-gitignore.md использовать если в проекте есть docker
(compose/Dockerfile — почти всегда в наших проектах). Для не-docker проектов — базовый
шаблон оттуда без docker-секции. Дополнить спецификой стека (секции Python/Node/Go в шаблоне).
НИКОГДА не игнорить: docker-compose*.yml, Dockerfile*, README*, *.md, *.yml конфиги, план/статус-файлы (PLAN.md, STATUS.md, TODO.md).
Шаг 2. Локальный git
cd /opt/<name>
git init
git config user.name "estorozhenko" # если не задан глобально
git config user.email "estorozhenko@nixg.ru"
git add -A
git commit -m "Initial commit"
Шаг 3. Создать ПРИВАТНЫЙ репозиторий на gitverse.ru
source /opt/hermes/.hermes/secrets/git-tokens.env
# проверить логин (реальный аккаунт — kpa39l, НЕ estorozhenko!)
curl -s -H "Authorization: Bearer $GITVERSE_PAT" \
-H "Accept: application/vnd.gitverse.object+json;version=1" \
"$GITVERSE_API/user"
# создать репо: private:true ОБЯЗАТЕЛЬНО, auto_init:false (иначе push упадёт)
curl -s -X POST "$GITVERSE_API/user/repos" \
-H "Authorization: Bearer $GITVERSE_PAT" \
-H "Accept: application/vnd.gitverse.object+json;version=1" \
-H "Content-Type: application/json" \
-d "{\"name\":\"<repo>\",\"description\":\"<описание>\",\"private\":true,\"auto_init\":false}"
HTTP 201 = создан; 409 = уже существует.
Шаг 4. Push на gitverse
git remote add origin "https://$GITVERSE_LOGIN:$GITVERSE_PAT@gitverse.ru/$GITVERSE_LOGIN/<repo>.git"
git push -u origin <текущая-ветка>
Ветку НЕ переименовывать без явной команды пользователя (в разных проектах уже master и main — сохранять как есть).
Шаг 5. Pull mirror в gitea (синхронизация 2 раза в сутки)
source /opt/hermes/.hermes/secrets/git-tokens.env
# токен gitea уже в GITEA_TOKEN; при необходимости перевыпустить:
# docker exec -u 1000 gitea gitea admin user generate-access-token \
# --username estorozhenko --token-name <repo>-mirror \
# --scopes "read:repository,write:repository,read:user,write:user" --raw
# и обновить GITEA_TOKEN в secrets/git-tokens.env
curl -X POST "$GITEA_API/repos/migrate" \
-H "Authorization: token $GITEA_TOKEN" -H "Content-Type: application/json" \
-d "{\"clone_addr\":\"https://oauth2:$GITVERSE_PAT@gitverse.ru/$GITVERSE_LOGIN/<repo>.git\",
\"repo_name\":\"<repo>\",\"repo_owner\":\"estorozhenko\",\"service\":\"git\",
\"mirror\":true,\"mirror_interval\":\"12h\"}"
HTTP 201 = mirror создан, интервал 12h = два раза в сутки.
Шаг 6. Проверка (обязательно)
- HEAD совпадает:
source /opt/hermes/.hermes/secrets/git-tokens.env git ls-remote "https://oauth2:$GITVERSE_PAT@gitverse.ru/$GITVERSE_LOGIN/<repo>.git" HEAD docker exec gitea git --git-dir=/data/git/repositories/estorozhenko/<repo>.git rev-parse HEAD - Принудительная синхронизация:
curl -X POST "$GITEA_API/repos/estorozhenko/<repo>/mirror-sync" \ -H "Authorization: token $GITEA_TOKEN" # → 200
После этого работать как обычно: git commit + git push; mirror подтянет изменения автоматически через ≤12ч.
Питфолы (проверено на практике)
- База gitverse API —
https://api.gitverse.ru, НЕgitverse.ru/api/v1/...(тот путь отдаёт HTML Next.js SPA, не JSON). - Gitea migrate с ssh:// всегда 422 — только
https://oauth2:<PAT>@gitverse.ru/.... Настраивать SSH-протокол в MIGRATIONS_ALLOWED_PROTOCOLS бесполезно (известный баг, не листать заново). auto_init: false— иначе gitverse создаёт свой README, и первый push падает (non-fast-forward).private: true— требование пользователя, не забывать.mirror_interval: "12h"= два раза в сутки; "8h" не подходит по ТЗ.- Токены не хранить в коде/README/коммитах — только в remote URL и переменных сессии.
Связанные навыки
git-forge-management— общие операции с gitverse/gitea, referencesgitea-pull-mirror-gitverse.md,gitverse-api.mdgithub-repo-management— для GitHub (gh CLI)