🏠 Главная › user guide › github github repo management
{/ Эта страница автоматически активируется из файлов функций SKILL.md с помощью сайта/scripts/generate-skill-docs.py. Редактируйте исходный SKILL.md, а не эту страницу. /}
Управление репозиторием GitHub
Клонирование/создание/форк репозиториев; управление удаленными репозиториями, релизами.
Ниже приведено полное описание навыка, который загружает Гермес при активации этого навыка. Это то, что агент видит в качестве инструкций, когда навыки активны.
Управление репозиториями GitHub
Создание, клонирование, форк, настройка и управление репозиториями GitHub. В каждом разделе показано сначала команда «gh», а затем альтернатива «git» + «curl».
Предварительные требования
Аутентификация на GitHub (см. навыки github-auth)
Настройка
ifcommand-vgh&>/dev/null&&ghauthstatus&>/dev/null;thenAUTH="gh"elseAUTH="git"if[-z"$GITHUB_TOKEN"];thenif[-f~/.hermes/.env]&&grep-q"^GITHUB_TOKEN="~/.hermes/.env;thenGITHUB_TOKEN=$(grep"^GITHUB_TOKEN="~/.hermes/.env|head-1|cut-d=-f2|tr-d'\n\r')elifgrep-q"github.com"~/.git-credentials2>/dev/null;thenGITHUB_TOKEN=$(grep"github.com"~/.git-credentials2>/dev/null|head-1|sed's|https://[^:]*:\([^@]*\)@.*|\1|')fififi# Получить имя пользователя GitHub (требуется для нескольких операций)if["$AUTH"="gh"];thenGH_USER=$(ghapiuser--jq'.login')elseGH_USER=$(curl-s-H"Authorization: token $GITHUB_TOKEN"https://api.github.com/user|python3-c"import sys,json; print(json.load(sys.stdin)['login'])")fi
# Создать публичный репозиторий и клонировать его
ghrepocreatemy-new-project--public--clone
# Приватный, с описанием и лицензией
ghrepocreatemy-new-project--private--description"Полезный инструмент"--licenseMIT--clone
# В организации
ghrepocreatemy-org/my-new-project--public--clone
# Из существующей локальной директорииcd/path/to/existing/project
ghrepocreatemy-project--source.--public--push
С помощью git + curl:
# Создать удалённый репозиторий через API
curl-s-XPOST\-H"Authorization: token $GITHUB_TOKEN"\https://api.github.com/user/repos\-d'{ "name": "my-new-project", "description": "Полезный инструмент", "private": false, "auto_init": true, "license_template": "mit" }'# Клонировать его
gitclonehttps://github.com/$GH_USER/my-new-project.git
cdmy-new-project
# -- ИЛИ -- отправить существующий локальный проект в новый репозиторийcd/path/to/existing/project
gitinit
gitadd.
gitcommit-m"Начальный коммит"
gitremoteaddoriginhttps://github.com/$GH_USER/my-new-project.git
gitpush-uoriginmain
# Создать форк через API
curl-s-XPOST\-H"Authorization: token $GITHUB_TOKEN"\https://api.github.com/repos/owner/repo-name/forks
# Подождать немного, пока GitHub создаст форк, затем клонировать
sleep3
gitclonehttps://github.com/$GH_USER/repo-name.git
cdrepo-name
# Добавить оригинальный репозиторий как удалённый "upstream"
gitremoteaddupstreamhttps://github.com/owner/repo-name.git
Синхронизация вилок
# Чистый git — работает везде
gitfetchupstream
gitcheckoutmain
gitmergeupstream/main
gitpushoriginmain
Секреты требуют шифрования с открытым ключом репозитория — через API, это сложнее:
# Получить публичный ключ репозитория для шифрования секретов
curl-s\-H"Authorization: token $GITHUB_TOKEN"\https://api.github.com/repos/$OWNER/$REPO/actions/secrets/public-key
# Зашифровать и установить (требуется Python с PyNaCl)
python3-c"from base64 import b64encodefrom nacl import encoding, publicimport json, sys# Получить публичный ключkey_id = '<key_id_from_above>'public_key = '<base64_key_from_above>'# Зашифроватьsealed = public.SealedBox( public.PublicKey(public_key.encode('utf-8'), encoding.Base64Encoder)).encrypt('ваше-секретное-значение'.encode('utf-8'))print(json.dumps({ 'encrypted_value': b64encode(sealed).decode('utf-8'), 'key_id': key_id}))"# Затем отправить зашифрованный секрет через PUT
curl-s-XPUT\-H"Authorization: token $GITHUB_TOKEN"\https://api.github.com/repos/$OWNER/$REPO/actions/secrets/API_KEY\-d'<вывод python скрипта выше>'# Список секретов (только имена, значения скрыты)
curl-s\-H"Authorization: token $GITHUB_TOKEN"\https://api.github.com/repos/$OWNER/$REPO/actions/secrets\|python3-c"import sys, jsonfor s in json.load(sys.stdin)['secrets']: print(f\" {s['name']:30} обновлён: {s['updated_at']}\")"
Примечание: Для секретов gh secret set значительно проще. Если требуется установить секреты, а не ступеньку «gh», рекомендую установить «gh», хотя бы для этой операции.
8. Релизы
С помощью gh:
ghreleasecreatev1.0.0--title"v1.0.0"--generate-notes
ghreleasecreatev2.0.0-rc1--draft--prerelease--generate-notes
ghreleasecreatev1.0.0./dist/binary--title"v1.0.0"--notes"Заметки о релизе"
ghreleaselist
ghreleasedownloadv1.0.0--dir./downloads
С помощью Curl:
# Создать релиз
curl-s-XPOST\-H"Authorization: token $GITHUB_TOKEN"\https://api.github.com/repos/$OWNER/$REPO/releases\-d'{ "tag_name": "v1.0.0", "name": "v1.0.0", "body": "## Список изменений\n- Функция A\n- Исправление ошибки B", "draft": false, "prerelease": false, "generate_release_notes": true }'# Список релизов
curl-s\-H"Authorization: token $GITHUB_TOKEN"\https://api.github.com/repos/$OWNER/$REPO/releases\|python3-c"import sys, jsonfor r in json.load(sys.stdin): tag = r.get('tag_name', 'нет тега') print(f\" {tag:15} {r['name']:30} {'черновик' if r['draft'] else 'опубликован'}\")"# Загрузка ассета релиза (бинарного файла)RELEASE_ID=<id_из_ответа_на_создание>
curl-s-XPOST\-H"Authorization: token $GITHUB_TOKEN"\-H"Content-Type: application/octet-stream"\"https://uploads.github.com/repos/$OWNER/$REPO/releases/$RELEASE_ID/assets?name=binary-amd64"\--data-binary@./dist/binary-amd64