Git.alt/Справочник

Материал из ALT Linux Wiki

Эта страница документирует команды git.alt, но не является кратким руководством или учебником по нему.

Как воспользоваться git.alt?

git.alt предоставляет несколько видов доступа:

  • SSH-доступ. Предоставляет несколько команд: для поиска репозиториев, их клонирования, создания, удаления, а также служебных.
  • ssh, git, rsync, http — доступ для непосредственной работы с репозиториями. git, rsync и http-адреса предоставляют r/o доступ, ssh — r/w.
  • Web-интерфейс. Находится по адресу http://git.altlinux.org/, предоставляет навигацию по списку репозиториев и gitweb для индивидуальных репозиториев.

SSH-доступ к git.alt выдаётся после принятия в ALT Linux Team.

SSH-доступ

git.alt доступен по SSH по адресу git.altlinux.org:222. Аккаунт для доступа — git_$USERNAME, где USERNAME — имя, присвоенное в процессе принятия в Team, с символами «-» заменёнными на «_».

Пример ~/.ssh/config:

Host git.alt
  HostName git.altlinux.org
  Port 222
  User git_USERNAME

Для работы из-за прокси и в других сложных условиях SSH также доступен по адресу git.altlinux.org:443.

Для работы с git.alt необходимо настроить свой git — параметры user.name, user.email, user.signingkey:

$ git-config --global user.signingkey "<ID ключа GPG для подписи тэгов>"
$ git-config --global user.email "<ваш email, как мантейнера>"
$ git-config --global user.name "FirstName LastName"

Например,

$ git-config --global user.signingkey 0xA26F54C8
$ git-config --global user.email dottedmag@altlinux.org
$ git-config --global user.name "Mikhail Gusarov"

Список команд выдаётся при ssh-логине без команды или с командой help:

$ ssh git.alt help
Available commands:
help
git-receive-pack <directory>
git-upload-pack <directory>
charset <path to git repository> [<charset>]
clone <path to git repository> [<path to directory>]
find-package <pattern>
init-db <path to directory>
ls [<path to directory>]
mv-db <path to source directory> <path to destination directory>
quota
rm-db <path to git repository>
task {list|new|show|drop|add|run} ...
build <path to gear repository> <tag name> [<binary package repository name>] [<project name>]
acl {--help|<binary package repository name> ...}
$

Во всех командах суффикс директорий репозиториев .git опционален и может быть опущен. В выводе команд .git присутствует всегда.

Управление git-репозиториями

ls

$ ssh git.alt ls [<directory>]

Эта команда позволяет посмотреть содержимое различных директорий на git.alt:

$ ssh git.alt ls /people/dottedmag/public
total 24
drwxr-sr-x 5 4096 Jun 13 10:22 bugzilla-repo-sync.git
...
drwxr-sr-x 5 4096 Jul  7 18:03 wackoconvert.git
$

Без параметров — показывает содержимое /people/$USERNAME:

$ ssh git.alt ls
total 16
drwxr-s---  5 4096 May 30 21:27 etc
drwxr-sr-x 14 4096 Aug 13 23:53 packages
drwxr-s--x  2 4096 Feb 13  2007 private
drwxr-sr-x  8 4096 Aug 13 23:57 public
$

От этой же директории отсчитываются относительные пути:

$ ssh git.alt ls public
total 24
drwxr-sr-x 5 4096 Jun 13 10:22 bugzilla-repo-sync.git
...
drwxr-sr-x 5 4096 Jul  7 18:03 wackoconvert.git
$

find-package

$ ssh git.alt find-package <pattern>

Эта команда позволяет искать репозитории по переданному шаблону. Единственный метасимвол, допустимый в шаблоне — *. Репозитории ищутся в директории packages каждого пользователя, поскольку предполагается, что gear-репозитории располагаются именно там.

$ ssh git.alt find-package glibc*
/people/avm/packages/glibc.git	1216320095
...
/people/peet/packages/glibc-kernheaders.git	1177084354
/people/mike/packages/glibc-kvercheck.git	1160664813
$ ssh git.alt find-package glibc
/people/avm/packages/glibc.git	1216320095
...
/people/peet/packages/glibc.git	1177084600
$

Вторая колонка в выводе find-package — unixtime времени последнего обновления репозитория.

clone

$ ssh git.alt clone <path to git repository> [<destination directory>]

Эта команда позволяет «склонировать», то есть создать в своей директории копию репозитория для начала работы над ним.

Без второго аргумента — клонирует в директорию packages:

$ ssh git.alt clone /people/ldv/glibc.git
Initialized empty Git repository in /people/dottedmag/packages/glibc.git/
$

Вторым аргументом можно указать как директорию, в которую нужно поместить клон репозитория, так и название репозитория:

$ ssh git.alt clone /people/ldv/glibc.git public
Initialized empty Git repository in /people/dottedmag/public/glibc.git/
$ ssh git.alt clone /people/ldv/glibc.git public/test
Initialized empty Git repository in /people/dottedmag/public/test.git/
$

Можно также склонировать репозиторий, находящийся вне git.alt:

$ ssh git.alt clone http://github.com/dottedmag/madshelf.git public
Initialized empty Git repository in /people/dottedmag/packages/public.git/
Getting alternates list for http://github.com/dottedmag/madshelf.git
...
walk 03d18e21d85fa30fc3ac8d921eb391e2a7bb242a
$

init-db

$ ssh git.alt init-db <path to directory>

Позволяет создать новый git-репозиторий. По умолчанию репозиторий создаётся в директории packages:

$ ssh git.alt init-db test
Initialized empty Git repository in ./
girar-init-db:	/people/dottedmag/packages/test.git

При указании пути создаёт репозиторий по указанному пути:

$ ssh git.alt init-db public/test
Initialized empty Git repository in ./
girar-init-db:	/people/dottedmag/public/test.git

mv-db

$ ssh git.alt mv-db <path to source directory> <path to destination directory>

Позволяет перемещать и переименовывать свои репозитории. При указании только имени репозитория подразумевается директория packages.

Перемещение packages/test.git в public/newname.git:

$ ssh git.alt mv-db test public/newname
$

Перемещение public/newname.git в packages/test.git:

$ ssh git.alt mv-db public/newname test
$

Переименовывание packages/test.git в packages/megatest.git:

$ ssh git.alt mv-db test megatest
$

rm-db

$ ssh git.alt rm-db <path to git repository>

Позволяет удалять свои репозитории. При указании только имени репозитория подразумевается директория packages:

$ ssh git.alt rm-db megatest # удаляет packages/megatest.git
$ ssh git.alt rm-db public/test

Управление ACL пакетов

Смотри ACL для общей информации об ACL пакетов в Sisyphus.

Команда acl требует указания репозитория, над которым производится работа. На данный момент существует только репозиторий Sisyphus с меткой sisyphus.

Если в командной строке указан только репозиторий, но не указана подкоманда, то список команд читается со стандартного ввода, по одной команде на строку, и выполняется тразакционно: ошибка в выполнении хотя бы одной команды отменяет действие всего набора команд:

$ ssh git.alt acl sisyphus keyjnote
girar-acl: Go ahead and type your commands
keyjnote add peet
keyjnote add raorn
^D
girar-acl: 2 command(s) queued
$

Все команды, меняющие состав группы или ACL пакета, могут производиться только лидером — первым в списке ACL пакета или в составе группы. Все такие операции выполняются асинхронно и результат их выполнения сообщается по email.

acl show

$ ssh git.alt acl <binary repository> <package> show

Показывает ACL указанного пакета

$ ssh git.alt acl sisyphus bugzilla show
bugzilla       @nobody
$ ssh git.alt acl <binary repository> @<group> show

Показывает состав указанной группы майнтайнеров.

$ ssh git.alt acl sisyhpus @python show
@python        ns ldv george akhavr bga lav swi at hiddenman sin mithraen kas

acl add/del

$ ssh git.alt acl <binary repository> <package> add|del <login>|@<group> ...

Добавляет/удаляет указанных пользователей и группы в/из ACL указанного пакета.

$ ssh git.alt acl sisyphus keyjnote add damir
girar-acl: 1 command(s) queued
$ ssh git.alt acl sisyphus keyjnote del damir
girar-acl: 1 command(s) queued
$ ssh git.alt acl <binary repository> @<group> add|del <login>|@<group> ...

Добавляет/удаляет указанных пользователей и группы в/из указанной группы.

$ ssh git.alt acl sisyphus keyjnote add @python
girar-acl: 1 command(s) queued
$ ssh git.alt acl sisyphus keyjnote del @python
girar-acl: 1 command(s) queued

acl replace

$ ssh git.alt acl <binary repository> <package>|@<group> replace <login>|@<group> <login>|@<group>

Заменяет укзаанную запись в ACL пакета или составе группы на вторую указанную.

$ ssh git.alt acl sisyphus keyjnote replace dottedmag @python

Заменяет в ACL пакета keyjnote запись dottedmag на @python.

acl leader

$ ssh git.alt acl <binary repository> <package> leader <login>|@<group>

Устанавливает лидера пакета — указанного пользователя, или лидера указанной группы. Пользователь или группа, устанавливаемые лидерами, не обязаны присутствовать в списке ACL пакета до выполнения этой команды.

$ ssh git.alt acl sisyphus keyjnote leader @python
$ ssh git.alt acl <binary repository> @<group> leader <login>|@<group>

Устанавливает лидера группы — указанного пользователя, или лидера указанной группы. Пользователь или группа, устанавливаемые лидерами, не обязаны присутствовать в списке членов группы до выполнения этой команды.

$ ssh git.alt acl sisyphus @python leader ns

acl nmu

$ ssh git.alt acl <binary repository> <package> nmu add|del [<login> [<start date> [<end date>]]]

Выдаёт/снимает разрешение на проведение NMU указанного пакета.

Параметры:

  • login — аккаунт, которому даётся разрешение на NMU. * или отсутствие параметра означает «кому угодно»
  • start date — дата начала действия NMU, в формате unixtime. Отсутствие параметра означает «немедленно»
  • end date — дата окончания действия NMU, в формате unixtmie. Отсутствие параметра означает «никогда».

Удаление разрешения происходит по точному соответствию имени аккаунта, так что del * не приведёт к отмене всех NMU, выданных на пакет. С другой стороны, del user приведёт к отмене всех NMU, выданных данному пользователю.

$ ssh git.alt acl <binary repository> <package> nmu show

Выдаёт список NMU для указанного пакета, в формате

<package> <login> <start date> <end date>

0 в поле end date означает «без ограничения».

Сборка пакетов из gear

Для сборки пакетов используется механизм задач — пользователь указывает, какие gear-репозитории необходимо собрать одной транзакцией, создавая задачу, после чего запускает её на выполнение. Задачи выполняются асинхронно. После завершения задачи пользователю приходит отчёт по e-mail.

task

$ ssh git.alt task list

Показывает текущий набор ещё не запущенных задач пользователя.

$ ssh git.alt task new [<binary repository>]

Создаёт новую задачу для сборки пакетов в указанный репозиторий (по умолчанию - Sisyphus). Данная команда выдаёт идентификатор задачи на stdout.

$ ssh git.alt task show <id>

Показывает содержимое указанной задачи.

$ ssh git.alt task drop <id>

Удаляет указанную задачу.

$ ssh git.alt task add [<id>] <gear repo path> <tag name> [<project name>]

Добавляет в задачу (указанную аргументом или последнюю созданную) пакет, который необходимо собрать. Пакет указывается путём к gear-репозиторию и именем git-тэга.

Пример:

$ ssh git.alt task list
$ ssh git.alt task new
1227033465
$ ssh git.alt task list
1227033465
$ ssh git.alt task show 1227033465
user dottedmag
repo sisyphus
$ ssh git.alt task add keyjnote 0.10.2-alt2
girar-check-perms: allowed: project leader
$ ssh git.alt task show 1227033465
user dottedmag                                                                      
repo sisyphus
package keyjnote /people/dottedmag/packages/keyjnote.git 0.10.2-alt2 628b5199c0c0d7640181f2bf7c2e65d4bb3bfa2d sisyphus
$ ssh git.alt task run 1227033465
Queued #1227033465
$

Необязательный параметр project name используется для указания имени создаваемого src.rpm-файла, в том случае, если оно не совпадает с именем директории gear-репозитория.

build

$ ssh git.alt build <gear repo path> <tag name> [<binary repository>] [<project name>]

Эта команда создаёт задачу по сборке указанного пакета и запускает её на выполнение. Параметры binary repository и project name имеют тот же смысл, что и в командах task new и task add соответственно.

Вспомогательные команды

charset

$ ssh git.alt charset <path to git repository> [<charset>]

Позволяет узнать или установить кодировку, используемую почтовым клиентом при отправке уведомлений, содержащих цитаты изменений файлов указанного git-репозитория:

$ ssh git.alt charset packages/glibc
utf-8
$ ssh git.alt charset packages/glibc cp1252
$ ssh git.alt charset packages/glibc
cp1252
$

quota

$ ssh git.alt quota

Позволяет узнать квоту и занимаемое пользователем дисковое пространство.

$ ssh git.alt quota
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/simfs   16932    977M   1465M             555    100k    150k        
$

git-receive-pack, git-upload-pack

Эти команды используются утилитами git-push, git-pull и подобными и не предназначены для вызова пользователем.

Клонирование и работа с репозиториями

Работа с git-репозиториями, расположенными на git.alt, ничем не отличается от работы с другими git-репозиториями.

URL-ы репозиториев на git.alt:

git (r/o)
git://git.altlinux.org/people/$USER/(packages%7Cpublic)/$PACKAGE.git
rsync (r/o)
git.altlinux.org::people/$USER/(packages|public)/$PACKAGE.git
http (r/o)
http://git.altlinux.org/people/$USER/(packages|public)/$PACKAGE.git
ssh (r/w)
ssh://git.altlinux.org/people/$USER/(etc%7Cpackages%7Cpublic%7Cprivate)/$PACKAGE.git

HTTP- и git-URL-ы репозиториев можно в любой момент узнать в web-интерфейсе git.alt.

Web-интерфейс

Располагается по адресу http://git.altlinux.org/

Предоставляет навигацию по публичным репозиториям пользователей (директории /people/$USERNAME/{packages,public}) и gitweb-интерфейс к этим репозиториям.

Кроме этого, в web-интерфейсе представлены репозитории /archive, списки /acl и файл people-packages-list, содержащий все репозитории из директорий /people/$USERNAME/packages и даты их последнего изменения (в unixtime).

Структура репозиториев

git.alt содержит два дерева репозиториев:

  • репозитории /people/$USERNAME для каждого зарегистрированного пользователя
  • репозитории /archive для пакетов Sisyphus

/people

Каждому зарегистрированному на git.alt разработчику предоставляется место для git-репозиториев, начинающееся с /people/$USERNAME. Доступ на запись в эти директории даётся только владельцу. Структура для хранения репозиториев жёстко определена:

/people/$USERNAME/etc

Содержит репозитории packages.git, private.git, public.git, с помощью которых можно управлять почтовой подпиской. Эти репозитории доступны на чтение только владельцу.

/people/$USERNAME/packages

Директория предназначена для хранения gear-репозиториев для пакетов Сизифа. Публично доступна.

git-репозитории в этой директории будут искаться при выполнении команды find-package, и эта директория будет использоваться по умолчанию в командах init-db, clone, build.

/people/$USERNAME/private

Директория предназначена для хранения приватных репозиториев, о существовании и содержании которых должно быть известно только самому разработчику.

Для удобства работают прямые http-ссылки на файлы репозиториев, размещённых в этой директории.

/people/$USERNAME/public

Директория предназначен для хранения публичных git-репозиториев, не являющихся gear-репозиториями для пакетов Сизифа.

/archive

В этой директории размещаются gear-репозитории пакетов Sisyphus.

Репозиторий для каждого пакета создаётся с помощью утилиты gear-srpmimport на основе прошедших incoming src.rpm-пакетов, а не на основе gear-репозитория, из которых были собраны src.rpm, поэтому репозиторий /archive следует использовать для разработки только в том случае, когда gear-репозиторий для пакета отсутствует.

Почтовая подписка

На git.alt реализовано два вида почтовой подписки на события:

  • Пользователь подписывается на события, происходящие в репозиториях public и packages.
  • Пользователь подписывает кого-то на события, происходящие в его репозиториях public, packages и private.

Для подписки используются репозитории из директории etc: packages.git, public.git, private.git. Схема работы с подписками напоминает работу с CVSROOT из CVS: пользователь клонирует нужный репозиторий, коммитит изменения в него и push-ит обратно на сервер, после чего изменения вступают в силу.

В каждом из трёх репозиториев находится два файла: email-subscription и email-distribution (точнее, в private.git - только email-distribution). git.alt использует бранч master и не обращает внимания на остальные бранчи в этих репозиториях.

email-subscription

Этот файл позволяет подписаться на события в публичных репозиториях git.alt. Формат файла - последовательность строк следующего вида:

$USER $PACKAGE $REFTYPE $REFNAME

где

  • $USER - имя пользователя git.alt,
  • $PACKAGE - имя пакета,
  • $REFTYPE - вид изменения: head - новые/удалённые коммиты, tag - новые/удалённые тэги (техническая подробность: второй компонент из изменяемой ссылки refs/*/*)
  • $REFNAME - имя изменения: имя бранча для коммитов, имя тэга для тэгов (техническая подробность: третий и последующие компоненты из изменяемой ссылки refs/*/*).

Каждое из полей может быть полным именем или вайлдкардом *. Для имён пакетов также разрешён вайлдкард в конце имени (например, docs-*).

Примеры

Подписка на все события во всех репозиториях:

* * * *

Подписка на новые/удалённые тэги в репозитории /people/ldv/packages/glibc.git:

ldv glibc tag *

email-distribution

Этот файл позволяет подписать других пользователей git.alt на события в ваших репозиториях. Формат файла - последовтельность строк вида:

$PACKAGE $REFTYPE $REFNAME $MAILTO

где

  • $PACKAGE, $REFTYPE, $REFNAME аналогичны параметрам из файла email-subscription
  • $MAILTO - разделённый запятыми список имён пользователей git.alt - получателей оповещения.

Вайлдкарды в первых трёх полях допустимы так же, как и в email-subscription. Вайлдкарды в $MAILTO не допускаются.