zoryn gitery¶
zoryn gitery — обёртка над gitery, git-хостингом ALT Linux: просмотр репозиториев, истории коммитов, дерева и содержимого файлов, а также административные операции, для которых раньше приходилось вручную вызывать ssh gitery <verb>.
Два бэкенда¶
Команды чтения (ls, find-package, log, commit, diff, refs, branches, tags, tree, cat) обращаются к HTTP API gitoskop (по умолчанию https://git.altlinux.org/gitoskop/api) — он быстрее, чем SSH. ls и find-package при неудачном запросе к API откатываются на ssh gitery ls / ssh gitery find-package, предварительно выводя предупреждение. Для ls откат срабатывает только для корней, доступных ssh ls (people, gears, srpms); для gitoskop-only корней вроде tasks (и виртуального packages) выводится сама ошибка gitoskop, а не сбивающее с толку сообщение ssh «not in allowed tree».
Все остальные команды (quota, clone, charset, default-branch, init-db, repack, mv-db, rm-db) работают через ssh gitery <verb> — либо потому что им нужен доступ на запись, либо потому что у gitoskop нет соответствующего эндпоинта.
Адресация репозиториев¶
Каждая подкоманда с аргументом REPO (или DIR/SRC/DST) резолвит его одинаково:
- Короткое имя (без
/, напримерdune) разворачивается вpeople/<login>/packages/<name>, где<login>берётся из[gitery] loginв~/.zoryn. Для коротких имён без заданногоloginкоманда завершается ошибкой. - Без
-nаргумент с/внутри воспринимается как полный путь от корня сервера (например,people/iv/packages/dune.gitилиpackages/gears/d/dune). - Ведущий
/всегда означает абсолютный путь от корня: он отбрасывается, а любой-nигнорируется (запасной вариант для полностью заданного пути, например-n packages /people/x/yдаётpeople/x/y). -n/--namespace NSделаетNSродителем для любого относительного аргумента (без ведущего/) — как короткого имени, так и многосегментного подпути:-n gears/dсdune→gears/d/dune.git, а-n packagesсgears/k→packages/gears/k. Он заменяет родителя по умолчаниюpeople/<login>/packagesиloginне требует.
Для команд, работающих с репозиторием, — все подкоманды выше, кроме ls, init-db и mv-db, — резолвер добавляет суффикс .git, если его ещё нет, независимо от того, было ли имя коротким, задано через -n, или указано полным путём с /: dune превращается в people/<login>/packages/dune.git, а /people/x/packages/bar — в people/x/packages/bar.git. Единственное исключение — gear-репозиторий задания tasks/<id>/gears/<n>/git, каталог которого называется просто git: он остаётся как есть, чтобы не превратиться в нерабочий git.git. Команды ls, init-db и mv-db работают с обычными каталогами на сервере и .git никогда не добавляют.
Пейджинг¶
Когда stdout — терминал, форматированный (человекочитаемый) вывод команд чтения (ls, log, commit, diff, refs, branches, tags, tree, find-package) показывается через пейджер ($PAGER, по умолчанию less), как в git. Вывод, помещающийся на экран, печатается сразу и управление возвращается без ожидания; при пайпе или перенаправлении (| cat, > file) вывод идёт напрямую, без пейджера. Тело --json не пейджится и остаётся машиночитаемым. (cat печатает сырое содержимое файла напрямую и не пейджится.)
Вывод в JSON¶
Каждая команда чтения принимает --json — печатает необработанное тело ответа gitoskop API вместо стандартного форматированного вывода. У cat флага --json нет — она всегда печатает сырое содержимое файла.
Отладочный вывод¶
Каждая подкоманда принимает -d/--debug — печатает в stderr каждый отправляемый запрос: URL HTTP-запросов GET для чтения через API и SSH-команды для серверных операций. Помогает увидеть, в какой именно путь разворачивается короткое имя:
$ zoryn gitery log xfsprogs --limit 1 -d
gitery: GET https://git.altlinux.org/gitoskop/api/people/<login>/packages/xfsprogs.git
gitery: GET https://git.altlinux.org/gitoskop/api/people/<login>/packages/xfsprogs.git/log/sisyphus?limit=1
Подтверждение для изменяющих команд¶
init-db, repack, mv-db, rm-db, а также charset/default-branch при задании значения для установки запрашивают подтверждение перед выполнением, если не передан -y/--yes. charset/default-branch без значения (режим чтения) подтверждения не требуют. В неинтерактивной сессии (нет TTY) без --yes команда не выполняется молча со значением по умолчанию "нет", а завершается с предупреждением.
Автодополнение¶
При установленном автодополнении оболочки gitery дополняет данные прямо с сервера:
- аргумент REPO/PATH дополняет короткое имя через поисковый API gitoskop (
zoryn gitery log xfspr<TAB>→people/<login>/packages/xfsprogs.git), а как только введён/или задан namespace через-n— навигирует по дереву сервера посегментно (zoryn gitery ls -n tasks 426<TAB>→426179/,426180/, … затем426180/ge<TAB>→426180/gears/и так далее до репозитория). Подкаталоги дополняются с завершающим/, чтобы следующий сегмент дополнялся без пробела; - аргумент REF (
log,tree,cat,default-branch) дополняется ветками и тегами репозитория, уже указанного в строке; -n/--namespaceдополняется корневыми метками верхнего уровня, запрашиваемыми у API gitoskop на лету (сейчасpackages,people,tasks).
Дополнение работает по возможности и с коротким таймаутом, поэтому не подвешивает оболочку, если API отвечает медленно или недоступен.
Конфигурация¶
Подробности и значения по умолчанию — в конфигурации.
Просмотр репозиториев (API gitoskop)¶
zoryn gitery ls¶
Список каталога (по умолчанию: people/<login>/packages) либо содержимого репозитория, если путь заканчивается на .git.
Для каталога у каждого репозитория выводится размер на диске и дата последнего коммита; подкаталоги показываются с завершающим / без размера и даты:
Для пути на .git показывается дерево файлов репозитория на ветке по умолчанию (тот же вывод, что и zoryn gitery tree <repo> <ветка-по-умолчанию>); чтобы зайти в подкаталог, допишите путь после .git:
$ zoryn gitery ls people/iv/packages/dune.git
drwxr-xr-x - .gear
-rw-r--r-- 258 bytes meson.build
drwxr-xr-x - src
$ zoryn gitery ls people/iv/packages/dune.git/.gear
-rw-r--r-- 9 KB dune.spec
-rw-r--r-- 118 bytes rules
Путь, который оказывается репозиторием даже без суффикса .git (например, gear-репозиторий задания tasks/<id>/gears/<n>/git), тоже распознаётся и показывается деревом, а не ошибкой.
По умолчанию листинг каталога сохраняет порядок сервера. -S/--sort пересортирует его по одному ключу — name, size или date (последний коммит), а -r/--reverse меняет порядок на убывающий:
zoryn gitery ls --sort=size # сначала самые маленькие репозитории
zoryn gitery ls --sort=size --reverse # сначала самые большие
zoryn gitery ls -S date people/iv/packages # сначала самый старый последний коммит
Сортировка действует только на человекочитаемый вывод; --json всегда возвращает порядок API как есть.
zoryn gitery ls
zoryn gitery ls people/iv/packages
zoryn gitery ls people/iv/packages/dune.git
zoryn gitery ls people/iv/packages/dune.git/.gear
zoryn gitery ls --json people/iv/packages
-n,--namespace=NS— родительское пространство имён для коротких имён.-S,--sort=KEY— упорядочить листинг каталога поname,sizeилиdate.-r,--reverse— сортировать по убыванию (сначала самые большие, новые или последние).--json— вывести сырой JSON API.
zoryn gitery find-package¶
Поиск путей репозиториев gitery по шаблону.
zoryn gitery find-package dune
zoryn gitery find-package -n packages dune
zoryn gitery find-package --json dune
-n,--namespace NS— ограничить результаты путями репозиториев подNS/…(например,packages,people,tasks) — те же корни, что и уgitery ls -n.--json— вывести сырой JSON API.
API gitoskop возвращает не более 200 совпадений за один запрос. Для широких шаблонов, под которые подходит больше, zoryn подгружает следующую страницу по мере прокрутки в пейджере — так доступен весь список, без обрезки до 50 на стороне сервера, вплоть до клиентского предела в 10 000 совпадений. Если под шаблон подходит больше, после закрытия пейджера выводится строка showing N of TOTAL matches (capped at 10000). С --json собранные из всех страниц результаты выдаются одним объектом { "results": [...], "total": N }.
-n/--namespace фильтрует на стороне клиента (у API поиска нет параметра пространства имён): zoryn просматривает совпадения и оставляет те, что лежат под выбранным корнем. Если пространство имён задано и просмотр упёрся в клиентский предел, строка примет вид scanned N of TOTAL matches (capped at 10000); M under NS.
zoryn gitery log¶
История коммитов репозитория, достижимых из REF. Если REF не указан, используется ветка по умолчанию (символическую ссылку HEAD API не разрешает). Каждый коммит выводится в стиле git log — полный oid, автор, дата и тема. Ссылки, указывающие на коммит, показываются в скобках после oid, как git log --decorate (HEAD -> master, tag: …):
commit 55fd7f35ca4fbd8d4493dacc90f6d3a716c16ab0 (HEAD -> master, tag: 1.5.2-alt1)
Author: Dmitrii Fomchenkov <sirius@altlinux.org>
Date: 2026-07-21
- new version
С --oneline каждый коммит — одна строка <короткий-oid> <тема>, вместе с декорациями (как git log --oneline --decorate):
55fd7f35ca (HEAD -> master, tag: 1.5.2-alt1) - new version
9e5f096ae5 Merge tag 'v1.5.2' into sisyphus
В терминале история подсвечивается, как git log --decorate: oid — жёлтым, HEAD — голубым, ветки — зелёным, теги — жёлтым, — и показывается через пейджер (см. раздел «Пейджинг» выше). При выводе в канал или файл, а также при установленной переменной NO_COLOR, подсветка отключается.
-n,--namespace=NS— родительское пространство имён для коротких имён.--oneline— одна строка<короткий-oid> <тема>на коммит.--limit=N— максимальное число коммитов.--offset=N— сколько коммитов пропустить.--json— вывести сырой JSON API.
zoryn gitery commit¶
Показать один коммит: заголовок, родителей и diff-stat по файлам.
-n,--namespace=NS— родительское пространство имён для коротких имён.--json— вывести сырой JSON API.
zoryn gitery show¶
Показать один коммит в стиле git show: заголовок и полное сообщение коммита, затем unified diff относительно первого родителя. REV — это oid коммита, тег или ветка; если не указан, берётся ветка репозитория по умолчанию (символическую ссылку HEAD API не разрешает).
commit a6b64c15dede3e7573443442a2a1687b4ff5c915
Author: Anton Farygin <rider@altlinux.org>
Date: 2026-06-27
3.24.0-alt1
- 3.23.1 -> 3.24.0
diff --git a/.gear/dune.spec b/.gear/dune.spec
--- a/.gear/dune.spec
+++ b/.gear/dune.spec
@@ -31,7 +31,7 @@
-Version: 3.23.1
+Version: 3.24.0
В терминале заголовок подсвечивается как git log --decorate, а патч — как git diff, и всё показывается через пейджер (см. раздел «Пейджинг» выше); при выводе в канал или файл, а также при установленной переменной NO_COLOR, подсветка отключается.
-n,--namespace=NS— родительское пространство имён для коротких имён.--json— вывести сырой JSON API.
zoryn gitery diff¶
Показать сводку diff-stat по файлам либо сырой патч для диапазона коммитов.
--patch печатает unified diff вместо сводки diff-stat. В терминале он подсвечивается точно как git diff — meta-строки файла и индекса полужирным, заголовки ханков голубым, добавления зелёным, удаления красным, — и показывается через пейджер (см. раздел «Пейджинг» выше); при выводе в канал или файл, а также при установленной переменной NO_COLOR, подсветка отключается. Если заданы оба флага, --patch имеет приоритет: печатается патч, а --json игнорируется.
-n,--namespace=NS— родительское пространство имён для коротких имён.--patch— показать сырой unified diff вместо сводки по файлам.--json— вывести сырой JSON API.
zoryn gitery refs¶
Список всех ссылок (веток и тэгов) репозитория.
-n,--namespace=NS— родительское пространство имён для коротких имён.--json— вывести сырой JSON API.
zoryn gitery branches¶
Список веток репозитория.
-n,--namespace=NS— родительское пространство имён для коротких имён.--json— вывести сырой JSON API.
zoryn gitery tags¶
Список тэгов репозитория.
-n,--namespace=NS— родительское пространство имён для коротких имён.--json— вывести сырой JSON API.
zoryn gitery tree¶
Элементы дерева по пути внутри ref (путь по умолчанию — корень репозитория). Для каждого элемента показывается режим в стиле ls -l и имя; размеры файлов выводятся как -, поскольку API не сообщает размеры по элементам.
-n,--namespace=NS— родительское пространство имён для коротких имён.--json— вывести сырой JSON API.
zoryn gitery cat¶
Печать сырого содержимого файла. REF необязателен — без него читается ветка репозитория по умолчанию:
zoryn gitery cat dune Makefile # ветка по умолчанию
zoryn gitery cat dune sisyphus Makefile # явный ref
Два позиционных аргумента трактуются как REPO PATH, три — как REPO REF PATH.
-n,--namespace=NS— родительское пространство имён для коротких имён.
Администрирование сервера (SSH)¶
zoryn gitery quota¶
Показать дисковую квоту вызывающего пользователя на gitery.
zoryn gitery clone¶
Клонировать репозиторий на сервере gitery (клонирование на стороне сервера, не локальный git clone).
-n,--namespace=NS— родительское пространство имён для коротких имён.
zoryn gitery charset¶
Без CHARSET — вывести текущую кодировку репозитория. С CHARSET — установить её (запрашивает подтверждение, если не задан --yes).
-n,--namespace=NS— родительское пространство имён для коротких имён.-y,--yes— пропустить подтверждение (актуально только при установке).
zoryn gitery default-branch¶
Без BRANCH — вывести текущую ветку по умолчанию репозитория. С BRANCH — установить её (запрашивает подтверждение, если не задан --yes).
-n,--namespace=NS— родительское пространство имён для коротких имён.-y,--yes— пропустить подтверждение (актуально только при установке).
zoryn gitery init-db¶
Создать новый bare-репозиторий на сервере gitery (запрашивает подтверждение, если не задан --yes).
-n,--namespace=NS— родительское пространство имён для коротких имён.-y,--yes— пропустить подтверждение.
zoryn gitery repack¶
Репак репозитория на сервере gitery, опционально с дополнительным параметром (запрашивает подтверждение, если не задан --yes).
-n,--namespace=NS— родительское пространство имён для коротких имён.-y,--yes— пропустить подтверждение.
zoryn gitery mv-db¶
Переместить/переименовать каталог репозитория на сервере gitery (запрашивает подтверждение, если не задан --yes).
-n,--namespace=NS— родительское пространство имён для коротких имён.-y,--yes— пропустить подтверждение.
zoryn gitery rm-db¶
Безвозвратно удалить репозиторий с сервера gitery (запрашивает подтверждение, если не задан --yes). Отменить это действие невозможно. Автодополнение REPO по TAB предлагает только ваши собственные репозитории из people/<login>/packages — те, которые действительно можно удалить.
-n,--namespace=NS— родительское пространство имён для коротких имён.-y,--yes— пропустить подтверждение.
Интерактивный обозреватель (TUI)¶
zoryn gitery manage¶
Полноэкранный терминальный интерфейс, который объединяет команды чтения и записи: просматривайте свои репозитории, заходите в ветки, теги и ссылки, читайте журнал коммитов, show/дифф коммита, дерево файлов и отдельные файлы, а также выполняйте административные действия (кодировка, ветка по умолчанию, переупаковка, переименование, удаление, URL для клонирования), не покидая интерфейс. Чтение идёт через HTTP-API gitoskop, а запись — через ssh gitery <verb>, ровно так же, как в отдельных подкомандах.
zoryn gitery manage # начать со списка своих репозиториев
zoryn gitery manage mypkg # сразу открыть один из своих репозиториев
zoryn gitery manage people/iv/packages/dune.git # открыть репозиторий по полному пути на сервере
Экспериментально
Управляющий TUI появился недавно; его экраны и сочетания клавиш ещё могут измениться.
Необязательный аргумент REPO принимает короткое имя (открывается в вашем пространстве имён) либо полный путь people/<user>/packages/<name> (открывается в пространстве имён этого пользователя). Обход иерархических корней gears/ и srpms/ не поддерживается — просматривать можно только плоские списки people/<user>/packages — ваши собственные и чужие.
--no-color— отключить цветной вывод (также учитываетсяNO_COLOR).-C DIR— перейти в каталогDIRперед запуском.
Глобальные клавиши¶
↑/↓илиj/k— перемещение по списку.PgUp/PgDn,Home/End— постранично и в начало/конец.Enter— открыть выбранный элемент или зайти в него.EscлибоBackspace/←— на уровень вверх;Escв корневом списке репозиториев сначала снимает активный фильтр поиска и завершает программу, только когда поиск не активен.q— выход из любого места.?илиF1— справка;r— перечитать текущий экран;/— поиск.
Экраны¶
- Список репозиториев — столбцы NAME · SIZE · DEFAULT · LAST-COMMIT, в заголовке — ваша квота и значок
[read-only]при просмотре чужого пространства имён.sциклически меняет ключ сортировки (name → size → date; повторное нажатие меняет порядок на обратный) — активный столбец сортировки помечается жёлтой стрелкой в заголовке (▲по возрастанию,▼по убыванию);/фильтрует по имени пакета;Insertотмечает выбранный репозиторий и переходит к следующему;Deleteмассово удаляет все отмеченные репозитории после одного подтверждения (безвозвратно);aоткрывает меню действий. Зелёная плашкаin gearsсправа от даты отмечает репозитории, содержимое которых уже влито в официальный репозиторий gears (по данным трекинга gitoskop); у репозиториев с невлитыми коммитами и у тех, которые сервер не отслеживает, плашки нет. - Детали репозитория — две панели: Branches / Tags;
Tabпереключает активную панель;Enterоткрывает журнал коммитов для выбранной ссылки;tоткрывает дерево файлов на выделенной ветке;aоткрывает меню действий для выбранной ветки или тега (см. ниже). Имена веток и тегов, уже влитых в gears, выводятся зелёным. - Список коммитов —
Enterоткрывает коммит (show + дифф);/фильтрует;vпереключает однострочный вид на полный, как уgit log(полный oid с декорациями, строкиAuthor:/Date:, тема коммита с отступом), и обратно. - Просмотр коммита — прокрутка стрелками/
PgUp/PgDn/Home/EndилиSpace;/ищет текст,n/Nпереходят к следующему/предыдущему совпадению. - Дерево файлов —
Enterзаходит в каталог или открывает файл;/фильтрует. - Просмотр файла — прокрутка как при просмотре коммита;
/ищет,n/N— следующее/предыдущее совпадение.
Меню действий¶
Меню зависит от контекста.
В списке репозиториев a действует на выбранный репозиторий: Set charset, Set default branch, Repack, Rename, Delete, Clone URL. Разрушительные действия запрашивают подтверждение в окне y/N. Если отмечен хотя бы один репозиторий, Delete работает как клавиша Delete и удаляет все отмеченные; иначе удаляется репозиторий меню.
На экране деталей репозитория a действует на ветку или тег, выбранные в активной панели: View log, View tree, Set as default branch (только для веток) и Delete branch / Delete tag (с подтверждением). Удаление ссылки выполняется пушем пустого refspec по SSH (git push <repo> :refs/heads/<name>) — отдельного верба для этого в протоколе gitery нет, а локальный клон не требуется. Действия над репозиторием целиком доступны только из списка репозиториев.
В пространстве имён только для чтения (любом, кроме вашего собственного) изменяющие действия недоступны; Clone URL, View log и View tree продолжают работать.
Переключение пространства имён¶
Список репозиториев начинается в вашем собственном пространстве имён. Tab переключает между вашим и чужим: из своего он запрашивает логин people/<user>, а из чужого возвращает в своё. p всегда сразу запрашивает логин. Чужое пространство имён доступно только для чтения — просматривать его можно, но отметка, массовое удаление и все действия, кроме Clone URL, недоступны.