[devel] gear -- создание тарбола из другого branch
Sergey Vlasov
=?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Вт Сен 26 15:49:04 MSD 2006
On Tue, Sep 26, 2006 at 02:14:25PM +0400, Alex V. Myltsev wrote:
> У меня есть такое представление о том, как должен работать gear-release:
>
> * Читает .gear-tags, в котором написано:
> branch1 path1
> branch2 path2
branch1 - это имя, которое gear-release в момент запуска преобразует в
sha1? В таком случае, даже если .gear-tags лежит в репозитории, это само
по себе ничего не значит, так как неизвестно, на что указывала ссылка с
указанным именем в момент запуска gear-release, следовательно, действия
мантейнера невозможно повторить (разве что попытаться найти, куда
показывала ссылка, по совпадению tree id, но в этом случае однозначный
результат не гарантируется)...
> ...
> * Из каждого бранча извлекает tree id посредством git-rev-parse и
> git-cat-file.
> * Создаёт новое дерево следующим путём:
> {
> git-ls-tree HEAD
> for (tree, path) in .gear-tags:
> echo "040000 tree $tree $path"
> } >git-mktree
> То есть пришивает к текущему дереву деревья из нужных бранчей под
> нужными именами.
... Разве что модифицировать .gear-tags в этом дереве, добавив туда
реально использованные sha1 пришитых бранчей.
> * Создаёт новый коммит1, который ссылается на новосозданное дерево, а
> родителем числит прошлый release commit. Создаёт новый коммит2,
> который ссылается на новосозданное дерево, но не имеет родителей.
Откуда берётся прошлый release commit? Придётся заводить для таких
коммитов какую-то специальную ветку.
У коммит1, если уж делать его в таком виде, нужно вторым родителем ставить
текущий коммит, иначе у того, что будет собираться, не будет никакой связи
с реальной историей разработки. Впрочем, в gitk это всё равно будет
выглядеть отвратительно - либо мегапатч, либо мега-merge.
> * Создаёт и подписывает два тэга: release-$version с коммитом1 и
> release-$version-bare с коммитом2.
>
> Теперь
> - на новосозданные тэги можно применять gear в неизменённом виде.
> - если .gear-tags пуст, то gear можно применять и на HEAD; если
> .gear-tags непуст, то gear не найдёт в нём path* и отвалится.
> Это напоминание сборщику, что HEAD требует применения gear-release.
Это неудобно - как минимум, нужен wrapper, позволяющий вызвать gear одной
командой (либо поддержка в самом gear).
Вообще предполагалось, что gear-release используется при направлении
окончательного релиза на сборку в Сизиф; в данном случае инструмент для
сшивания деревьев придётся применять существенно чаще - вероятно, это
должен быть не gear-release, а что-то другое.
> - наследственность тэгов вида release-$version по-прежнему можно
> проверять при входе в Сизиф, если считать, что майнтейнеры честны,
> хотя, может быть, забывчивы. (Если майнтейнеры нечестны, то проверка
> наследственности не помогает в любом случае.)
> - тэги release-*-bare можно использовать, если нужно скачать все
> исходники какой-то версии, и только их. Специальной поддержки со
> стороны git не требуется. Соответствие $release и $release-bare
> проверяется тривиально.
От такого release-*-bare пользы примерно столько же, сколько и от
git-archive --remote=... - при отсутствии связей между коммитами все
объекты всегда передаются полностью (точнее, только с gzip-сжатием каждого
объекта отдельно - количеством дельт между объектами одного дерева можно
пренебречь).
Экспериментальная проверка работы git с несвязанными коммитами на
репозитории linux-2.6 показала следующее:
- Размер pack-файла bare/v2.6.17 - 58M.
- Размер pack-файла bare/v2.6.18 - 59M. Именно столько придётся вытянуть
при получении bare/v2.6.18, не связанного с другими коммитами, даже при
наличии в локальном репозитории bare/v2.6.17.
- Размер pack-файла bare/v2.6.18, из которого исключены объекты, общие с
деревом bare/v2.6.17 - 38M. Такой pack-файл придётся получить при
выполнении git-fetch -k ... tag bare/v2.6.18-linked (этот тег указывает
на коммит с деревом v2.6.18^{tree}, для которого в качестве
единственного родительского коммита записан bare/v2.6.17^{commit}).
При отсутствии связей между коммитами не удаётся получить даже такой
результат.
- Размер pack-файла bare/v2.6.18-linked, который сформирован с ключом
--thin в предположении о наличии у клиента bare/v2.6.17 - 5,3M. Такой
pack передаётся при выполнении git-fetch ... tag bare/v2.6.18-linked
без опции -k. Вот так должен работать нормальный fetch с
использованием родных протоколов git.
Учитывая то, что на основе release-*-bare нельзя продолжать нормальную
разработку (разве что чуть подпатчить spec - патчи для остальных
компонентов уже не будут накладываться на исходный вариант из-за изменения
путей), такой вариант даёт довольно мало преимуществ. Кроме того, имея
подобный коммит, никак не связанный с остальной историей, невозможно
получить изменения исходников относительно оригинальной версии (разве что
в дерево для этого коммита будут помещаться оригинальные исходники и
автоматически сформированные патчи).
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20060926/8967ecdf/attachment-0001.bin>
Подробная информация о списке рассылки Devel