Bug 17914

Summary: [FR] поддержка submodules
Product: Sisyphus Reporter: Anton Farygin <rider>
Component: gearAssignee: Dmitry V. Levin <ldv>
Status: ASSIGNED --- QA Contact: qa-sisyphus
Severity: enhancement    
Priority: P2 CC: alexey.tourbin, azol, dd1email, evg, glebfm, ildar, imz, lav, ldv, legion, mike, nbr, neff, obirvalger, placeholder, pv, rider, vedingrot
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on: 32522    
Bug Blocks:    
Attachments:
Description Flags
gear-clone
none
Вариант 1
none
Вариант 2
none
Вариант 3
none
gear-convert-submodule none

Description Anton Farygin 2008-11-17 15:34:13 MSK
Видимо, не я один столкнусь с проблемой включения mainstream'ом submodules.

Предлагается добавить поддержку в gear submodules (а точнее - в gear-command-tar.

Сделать это можно, взяв за основу этот скрипт:
http://github.com/meitar/git-archive-all.sh/tree/master
Comment 1 Dmitry V. Levin 2008-11-17 15:40:14 MSK
Я сам submodules пока ещё не использую, так что ничего сказать не могу.
Comment 2 Artem Zolochevskiy 2009-04-19 23:11:08 MSD
мне тоже вот понадобилось. хорошо бы реализовать.
Comment 3 Alexey Gladkov 2009-04-19 23:52:09 MSD
Чтобы реализовать, хочется понять что нужно.
Можно подробнее о том, где понадобилось ?
Comment 4 Artem Zolochevskiy 2009-04-20 00:09:17 MSD
ммм... ну собственно в git с submodules и понадобилось :-)

если есть git репозиторий с сабмодулями, то хотелось бы не пользоваться объездными путями (как например создание remote branch-ей на примере psi: http://lists.altlinux.org/pipermail/devel/2009-February/166183.html), а просто использовать стандартный .gear/rules

если git имеет такую возможность как submodules а "gear спроектирован для сборки пакетов из произвольно устроенного git-репозитория", то хорошо бы чтоб он поддерживал и submodules.

я тоже хотел бы задействовать эту фичу git-а (submodule), но остановился на невозможности опакетить (получить тарболл из моего git-репозитория).
Comment 5 Alexey Gladkov 2009-04-20 00:17:58 MSD
Дайте ссылку на интересующий вас проект. Нужен тесткейс.
Comment 6 Anton Farygin 2009-04-20 00:40:08 MSD
git://git.psi-im.org/psi.git
Comment 7 Alexey Gladkov 2009-04-20 16:04:46 MSD
Вот попробуйте:

http://git.altlinux.org/people/legion/packages/gear.git?p=gear.git;a=shortlog;h=refs/heads/submodule

Что не протестировал:

1. Не пробовал директиву zip.

2. На приведённом тесткейсе не удобно тестировать опцию -t. Так что она тоже не проверена.
Comment 8 Alexey Gladkov 2009-04-20 17:53:40 MSD
Мне пока не ясно как быть с "git submodule update". Сейчас в реализации найдено несколько проблем, которые нужно осмыслить и исправить.
Comment 9 Alexey Gladkov 2009-04-22 02:32:53 MSD
Протестировал и исправил директиву zip, но для этого в gear предётся пользоваться zipmerge (из пакета libzip).
Comment 10 Alexey Gladkov 2009-04-22 04:35:26 MSD
Прошу проверить текущее состояние бранча. Все вопросы сняты.
Comment 11 Artem Zolochevskiy 2009-04-22 10:04:17 MSD
(В ответ на комментарий №10)
> Прошу проверить текущее состояние бранча. Все вопросы сняты.

* zip работает
* -t работает, правда надо самостоятельно следить за gear submodule update --init на свежесклонированном репоитории. иначе тарболл делается неполный.

спасибо!
Comment 12 Anton Farygin 2009-04-22 10:10:05 MSD
Интересно, а будет ли это работать в сборочнице ?
Comment 13 Alexey Gladkov 2009-04-22 10:28:02 MSD
(В ответ на комментарий №12)
> Интересно, а будет ли это работать в сборочнице ?

Нет. Разве git.alt поддерживает submodules ?
Comment 14 Anton Farygin 2009-04-22 10:30:34 MSD
А какой тогда в этом смысл ?

Впочем, можно повесить багу на сборочницу..
Comment 15 Alexey Gladkov 2009-04-22 10:31:37 MSD
(В ответ на комментарий №11)
> * -t работает, правда надо самостоятельно следить за gear submodule update
> --init на свежесклонированном репоитории. иначе тарболл делается неполный.

Другого способоа я не вижу. Запуск "git submodule update -N -i" из gear приведёт к изменению рабочей копии репозитория и даже потере изменений.
Comment 16 Alexey Gladkov 2009-04-22 10:35:09 MSD
(В ответ на комментарий №14)
> А какой тогда в этом смысл ?


gear != git.alt 

Бага повешена на gear и я реализовал поддержку submodules в нём. Для git.alt пусть кто-нибудь тоже реализуюет поддержку. Я этого сделать не могу.

Но без поддержки в gear нет смысла добавлять что-то в git.alt
Comment 17 Artem Zolochevskiy 2009-04-22 10:51:20 MSD
(В ответ на комментарий №16)

> Но без поддержки в gear нет смысла добавлять что-то в git.alt

совершенно верно. дополнительный бонус -- уже сегодня можно собираться что-то с submodules у себя локально.
Comment 18 Artem Zolochevskiy 2009-04-22 10:52:10 MSD
(В ответ на комментарий №14)
> А какой тогда в этом смысл ?
> 
> Впочем, можно повесить багу на сборочницу..

повесишь?
Comment 19 Alexey Gladkov 2009-04-22 13:00:52 MSD
Интересно, что мантейнер пакета так и не высказался тут.

Дима?
Comment 20 Dmitry V. Levin 2009-04-22 17:11:01 MSD
Насколько я понимаю, submodule в git -- это weak reference, т.е. ссылка на sha1-имя коммита, и ничто не гарантирует наличие этого коммита в репозитории.
Если это так, то для того, чтобы submodules можно было использовать в gear, нужно как-то реализовать эту гарантию, например, обеспечить попадание этого sha1 в историю, наподобие gear-update-tag.
Comment 21 Anton Farygin 2009-04-22 17:23:18 MSD
насколько я понял - это скоре несколько иное - ссылка на SHA1 коммит во внешнем репозитарии, который выкачивается каждый раз, когда говорится git submodule init и git submodule update

Собственно про это сказано тут:
update
Update the registered submodules, i.e. clone missing submodules and checkout the commit specified in the index of the containing repository. This will make the submodules HEAD be detached.

If the submodule is not yet initialized, and you just want to use the setting as stored in .gitmodules, you can automatically initialize the submodule with the --init option.
Comment 22 Alexey Gladkov 2009-04-22 17:26:00 MSD
(В ответ на комментарий №20)
> Насколько я понимаю, submodule в git -- это weak reference, т.е. ссылка на
> sha1-имя коммита, и ничто не гарантирует наличие этого коммита в репозитории.

В подрепозитории ? Да. не гарантирует. Для этого и есть команда "git submodule update", которая если нужно клонирует подрепозиторий и делает checkout.

> Если это так, то для того, чтобы submodules можно было использовать в gear,
> нужно как-то реализовать эту гарантию, например, обеспечить попадание этого
> sha1 в историю, наподобие gear-update-tag.

Не понял о чём ты. git и так сам отслеживает состояние таких ссылок и через "git submodule status" показывает их состояние.

Вот как хранится ссылка:

$ git ls-tree HEAD |grep '^160000 '
160000 commit c9e824912f7c4f7c13fbfdb4e9a583db2938a141	iris
Comment 23 Alexey Gladkov 2009-04-22 17:30:17 MSD
(В ответ на комментарий №20)
> Насколько я понимаю, submodule в git -- это weak reference, т.е. ссылка на
> sha1-имя коммита, и ничто не гарантирует наличие этого коммита в репозитории.

Чтобы гарантировать наличие коммита в репозитории нужно сказать:

git submodule update --init

но это может привести к потери коммитов в подрепозиториях, если ссылка в основном репозитории не была обновлена. Поэтому я не стал это делать.
Comment 24 Dmitry V. Levin 2009-04-22 17:52:30 MSD
Сейчас, без использования submodule, команда вроде
GIT_DIR=/path/to/repo.git gear -t v1.0 out.tar
работает всегда, поскольку все необходимые объекты гарантированно присутствуют в репозитории, в котором есть этот v1.0

Привнесение поддержки submodule не должно сломать эту гарантию.
Comment 25 Alexey Gladkov 2009-04-22 18:18:19 MSD
(В ответ на комментарий №24)
> Сейчас, без использования submodule, команда вроде
> GIT_DIR=/path/to/repo.git gear -t v1.0 out.tar
> работает всегда, поскольку все необходимые объекты гарантированно присутствуют
> в репозитории, в котором есть этот v1.0
> 
> Привнесение поддержки submodule не должно сломать эту гарантию.

Будет ли достаточно, если gear будет оказываться работать при отсутствии объектов?

Я лично думаю, что такое поведение допустимо.
Comment 26 Dmitry V. Levin 2009-04-23 14:51:22 MSD
(In reply to comment #25)
> (В ответ на комментарий №24)
> > Сейчас, без использования submodule, команда вроде
> > GIT_DIR=/path/to/repo.git gear -t v1.0 out.tar
> > работает всегда, поскольку все необходимые объекты гарантированно присутствуют
> > в репозитории, в котором есть этот v1.0
> > 
> > Привнесение поддержки submodule не должно сломать эту гарантию.
> 
> Будет ли достаточно, если gear будет оказываться работать при отсутствии
> объектов?

Сейчас, без submodules, git (и gear вслед за ним) отказывается работать без необхоимых объектов, и это правильно.

Существенное отличие заключается в том, что сейчас, без submodules, нет штатного способа зафетчить или запушить коммит без необходимых для него объектов.
А вот в случае добавления поддержки submodule, наоборот, не будет штатного способа зафетчить и запушить коммит со всеми необходимыми для него объектами.  Это не нарушает принцип необратимости истории коммита, но нарушает принцип достаточности коммита.

Я сейчас вижу только один способ решения этой проблемы: fake merge.
Comment 27 Alexey Gladkov 2009-04-23 15:23:14 MSD
(В ответ на комментарий №26)
> Сейчас, без submodules, git (и gear вслед за ним) отказывается работать без
> необхоимых объектов, и это правильно.

Репозитории используют механизм submodules и нам предётся вслед за git учиться с ним работать, если мы хотим дать возможность пользователям держать апстримный git и использовать gear как надстройку для запаковки (чем сейчас и является gear).
 
> Я сейчас вижу только один способ решения этой проблемы: fake merge.

Ты имеешь ввиду делать из submodules делать subtree ?
Comment 28 Dmitry V. Levin 2009-04-23 15:34:54 MSD
(In reply to comment #27)
> (В ответ на комментарий №26)
> > Сейчас, без submodules, git (и gear вслед за ним) отказывается работать без
> > необхоимых объектов, и это правильно.
> 
> Репозитории используют механизм submodules и нам предётся вслед за git учиться
> с ним работать, если мы хотим дать возможность пользователям держать 
> апстримный git и использовать gear как надстройку для запаковки (чем сейчас и 
> является gear).

Механизм submodules позволяет создавать коммиты, из которых без доступа в интернет в принципе нельзя собрать правильный тарболл.  Если пользователи будут создавать такие коммиты, они не смогут использовать gear для сборки из них.

> > Я сейчас вижу только один способ решения этой проблемы: fake merge.
> 
> Ты имеешь ввиду делать из submodules делать subtree ?

Если из submodules делать subtree, то они перестанут быть submodules.
Вероятно, нужен некий gear-update-submodules, который будет делать git merge -s ours для всех используемых submodules.
Comment 29 Anton Farygin 2009-04-23 15:36:02 MSD
делать из submodules subtree не получится.

Есть ровно один выход, и он применён в git.alt/psi

т.е. submodule в отдельный branch и паковать его в tarball.

Кстати, тут очень бы пригодилось отсутствие проверки merge бранча в HEAD. Опционально. 

Зачем мне iris мержить в HEAD, если в HEAD лежит только спек и патчи (например) ?
Comment 30 Dmitry V. Levin 2009-04-23 15:42:29 MSD
(In reply to comment #29)
> делать из submodules subtree не получится.
> 
> Есть ровно один выход, и он применён в git.alt/psi
> 
> т.е. submodule в отдельный branch и паковать его в tarball.

Это можно сделать, и это даже лучше, но это ведь ручная работа.

> Кстати, тут очень бы пригодилось отсутствие проверки merge бранча в HEAD.
> Опционально. 
> 
> Зачем мне iris мержить в HEAD, если в HEAD лежит только спек и патчи (например)
> ?

Это же очевидно: если соответствующий коммит из iris не окажется в истории HEAD, то не будет гарантии того, что этот коммит вообще будет присутствовать в репозитории.  А если этого коммита не будет в репозитории, то из него не получится собрать тарболл.
Comment 31 Alexey Gladkov 2009-04-23 15:47:42 MSD
(В ответ на комментарий №28)
> Если из submodules делать subtree, то они перестанут быть submodules.

Именно. Тогда гарантия наличия объектов будет.

> Вероятно, нужен некий gear-update-submodules, который будет делать git merge -s
> ours для всех используемых submodules.

Что-то я совсем запутался. git-merge можно делать только между бранчами. Как ты предполагаешь делать merge между разными репозиториями ?
Comment 32 Dmitry V. Levin 2009-04-23 16:06:43 MSD
(In reply to comment #31)
> (В ответ на комментарий №28)
> > Если из submodules делать subtree, то они перестанут быть submodules.
> 
> Именно. Тогда гарантия наличия объектов будет.

Если
160000 commit 6ee41f079a3f3ff0263ab309489cdae0f7b82acb	iris
превратится в
040000 tree какойтоsha1	iris
то это уже не будет submodule.
Т.е. тогда это будет поддержка не submodules?

> > Вероятно, нужен некий gear-update-submodules, который будет делать git merge -s
> > ours для всех используемых submodules.
> 
> Что-то я совсем запутался. git-merge можно делать только между бранчами. Как ты
> предполагаешь делать merge между разными репозиториями ?

submodule представляет собой ссылку на коммит, а на коммит можно сделать merge.  Разве нет?
Comment 33 Anton Farygin 2009-04-23 16:09:03 MSD
(В ответ на комментарий №30)
> (In reply to comment #29)
> > делать из submodules subtree не получится.
> > 
> > Есть ровно один выход, и он применён в git.alt/psi
> > 
> > т.е. submodule в отдельный branch и паковать его в tarball.
> 
> Это можно сделать, и это даже лучше, но это ведь ручная работа.

Никакой ручной работы - всё автоматизируется.

> 
> > Кстати, тут очень бы пригодилось отсутствие проверки merge бранча в HEAD.
> > Опционально. 
> > 
> > Зачем мне iris мержить в HEAD, если в HEAD лежит только спек и патчи (например)
> > ?
> 
> Это же очевидно: если соответствующий коммит из iris не окажется в истории
> HEAD, то не будет гарантии того, что этот коммит вообще будет присутствовать в
> репозитории.  А если этого коммита не будет в репозитории, то из него не
> получится собрать тарболл.

Ну, нормально - если не взял коммит из репозитария, то не получится собрать тарболл. Вполне законно. Это же не получится и локально сделать.

Или ты имеешь в виду ситуацию, когда публикуется только master ? без бранчей ?
Comment 34 Dmitry V. Levin 2009-04-23 16:15:55 MSD
(In reply to comment #33)
> (В ответ на комментарий №30)
> > (In reply to comment #29)
> > > делать из submodules subtree не получится.
> > > 
> > > Есть ровно один выход, и он применён в git.alt/psi
> > > 
> > > т.е. submodule в отдельный branch и паковать его в tarball.
> > 
> > Это можно сделать, и это даже лучше, но это ведь ручная работа.
> 
> Никакой ручной работы - всё автоматизируется.

Автоматизируется только обновления бранча и вызовы git merge с gear-update-tag.
Одноразовая ручная работа по прописыванию правил в .spec и .gear/rules никак не автоматизируется,

> > > Кстати, тут очень бы пригодилось отсутствие проверки merge бранча в HEAD.
> > > Опционально. 
> > > 
> > > Зачем мне iris мержить в HEAD, если в HEAD лежит только спек и патчи 
> > > (например) ?
> > 
> > Это же очевидно: если соответствующий коммит из iris не окажется в истории
> > HEAD, то не будет гарантии того, что этот коммит вообще будет присутствовать > > в репозитории.  А если этого коммита не будет в репозитории, то из него не
> > получится собрать тарболл.
> 
> Ну, нормально - если не взял коммит из репозитария, то не получится собрать
> тарболл. Вполне законно. Это же не получится и локально сделать.
> 
> Или ты имеешь в виду ситуацию, когда публикуется только master ? без бранчей ?

Нарушается принцип достаточности коммита.
Ничто не помешает (и даже не подскажет), какие бранчи нужно запушить, какие бранчи нельзя удалять, и какие бранчи нужно фетчить для того, чтобы собрать из master.
Comment 35 Anton Farygin 2009-04-23 16:21:42 MSD
(В ответ на комментарий №34)
> > Никакой ручной работы - всё автоматизируется.
> 
> Автоматизируется только обновления бранча и вызовы git merge с gear-update-tag.
> Одноразовая ручная работа по прописыванию правил в .spec и .gear/rules никак не
> автоматизируется,
> 

Там всё, как правило, однотипно. Более того - я для submodules не ставлю тэгов, не делаю версий. Мне достаточно, что будет просто iris.tar с текущим моим HEAD от бранча iris. 

Конечно, один раз поправить спек и один раз поправить .gear/rules - придётся. 
В дальнейшем - только git merge -s ours, и gear-update-tag.

В принципе, меня даже merge -s ours не сильно напрягает.. просто не всем удаётся объяснить, зачем это нужно.

> > > > Кстати, тут очень бы пригодилось отсутствие проверки merge бранча в HEAD.
> > > > Опционально. 
> > > > 
> > > > Зачем мне iris мержить в HEAD, если в HEAD лежит только спек и патчи 
> > > > (например) ?
> > > 
> > > Это же очевидно: если соответствующий коммит из iris не окажется в истории
> > > HEAD, то не будет гарантии того, что этот коммит вообще будет присутствовать > > в репозитории.  А если этого коммита не будет в репозитории, то из него не
> > > получится собрать тарболл.
> > 
> > Ну, нормально - если не взял коммит из репозитария, то не получится собрать
> > тарболл. Вполне законно. Это же не получится и локально сделать.
> > 
> > Или ты имеешь в виду ситуацию, когда публикуется только master ? без бранчей ?
> 
> Нарушается принцип достаточности коммита.
> Ничто не помешает (и даже не подскажет), какие бранчи нужно запушить, какие
> бранчи нельзя удалять, и какие бранчи нужно фетчить для того, чтобы собрать из
> master.

gear-push ? нужно пушить всё, что есть .gear/tags
Comment 36 Alexey Gladkov 2009-04-23 16:32:18 MSD
(В ответ на комментарий №32)
> (In reply to comment #31)
> > (В ответ на комментарий №28)
> > > Если из submodules делать subtree, то они перестанут быть submodules.
> > 
> > Именно. Тогда гарантия наличия объектов будет.
> 
> Если
> 160000 commit 6ee41f079a3f3ff0263ab309489cdae0f7b82acb    iris
> превратится в
> 040000 tree какойтоsha1    iris
> то это уже не будет submodule.
> Т.е. тогда это будет поддержка не submodules?


Если это будет происходить с помощью утилиты одной командой, то это объезд проблемы.

> submodule представляет собой ссылку на коммит, а на коммит можно сделать merge.
>  Разве нет?

$ git ls-tree HEAD |grep '^16'
160000 commit c9e824912f7c4f7c13fbfdb4e9a583db2938a141	iris

$ git cat-file -p c9e824912f7c4f7c13fbfdb4e9a583db2938a141
error: unable to find c9e824912f7c4f7c13fbfdb4e9a583db2938a141
fatal: Not a valid object name c9e824912f7c4f7c13fbfdb4e9a583db2938a141

Это ссылка на коммит из другого репозитория. И мердж по нему сделать нельзя т.к. сам объект в другом репозитории.
Comment 37 Alexey Gladkov 2009-04-23 16:40:46 MSD
Мы опять скатились к объезду submodules. Да, при их использовании одного коммита в основной репозиторий мало... чтобы собрать пакет нужно дополнительно получить submodule, содержащий объект на который сделана ссылка (git submodule update).

Но в этом и есть смысл submodules - не хранить всё в одном репозитории. А мы опять сводим всё к этому. Мне кажется мы смотрим не в ту сторону.
Comment 38 Anton Farygin 2009-04-23 16:42:45 MSD
Мне тоже не нравится идея с submodule.

Особенно учитывая то, что submodule может быть и через git+ssh или file.
Comment 39 Dmitry V. Levin 2009-04-23 17:24:44 MSD
(In reply to comment #36)
> $ git ls-tree HEAD |grep '^16'
> 160000 commit c9e824912f7c4f7c13fbfdb4e9a583db2938a141    iris
> 
> $ git cat-file -p c9e824912f7c4f7c13fbfdb4e9a583db2938a141
> error: unable to find c9e824912f7c4f7c13fbfdb4e9a583db2938a141
> fatal: Not a valid object name c9e824912f7c4f7c13fbfdb4e9a583db2938a141
> 
> Это ссылка на коммит из другого репозитория. И мердж по нему сделать нельзя
> т.к. сам объект в другом репозитории.

Тот, кто может выполнить submodule update, может получить этот коммит с смерджить его.
Comment 40 Alexey Gladkov 2009-04-23 17:38:21 MSD
(В ответ на комментарий №39)
> Тот, кто может выполнить submodule update, может получить этот коммит с
> смерджить его.

Этот коммит у меня есть в подмодуле:

$ git --git-dir=iris/.git cat-file -t c9e824912f7c4f7c13fbfdb4e9a583db2938a141
commit

Всё ещё не понимаю, как ты мердж предполагаешь делать.
Comment 41 Alexey Gladkov 2009-04-23 18:29:56 MSD
Created attachment 3480 [details]
gear-clone

Нечто типа этого не может гарантировать наличие всех необходимых объектов?

Состояние основного репозитория однозначно описывает состояния его модулей ... даже если этих объектов нет. Вот так это выглядит в основном репозитории:

$ git log -n1 -p 6eaceaea9a89153855fd951aa0e1861588dc60e7
commit 6eaceaea9a89153855fd951aa0e1861588dc60e7
Author: Justin Karneges <justin@affinix.com>
Date:   Fri Apr 17 13:50:27 2009 -0700

    update to latest iris

diff --git a/iris b/iris
index 0d44dbf..6ee41f0 160000
--- a/iris
+++ b/iris
@@ -1 +1 @@
-Subproject commit 0d44dbfa10fc1f47c1de64c45cde43748dfe44d4
+Subproject commit 6ee41f079a3f3ff0263ab309489cdae0f7b82acb

Наша проблема в том, что при клонировании получаются объекты лишь основного репозитория, но не его модулей. Нам нужно рассмотривать основной репозиторий и его модули как связанное целое.

Или я не прав?
Comment 42 Dmitry V. Levin 2010-01-10 02:04:57 MSK
(In reply to comment #41)
> Created an attachment (id=3480) [details]
> gear-clone
> 
> Нечто типа этого не может гарантировать наличие всех необходимых объектов?

Это может помочь обычному пользователю подготовить репозиторий, содержащий submodules, к сборке gear'ом из HEAD'а.

Инструментам, использующим git fetch, это не поможет.

> Состояние основного репозитория однозначно описывает состояния его модулей ...
> даже если этих объектов нет. Вот так это выглядит в основном репозитории:
> 
> $ git log -n1 -p 6eaceaea9a89153855fd951aa0e1861588dc60e7
> commit 6eaceaea9a89153855fd951aa0e1861588dc60e7
> Author: Justin Karneges <justin@affinix.com>
> Date:   Fri Apr 17 13:50:27 2009 -0700
> 
>     update to latest iris
> 
> diff --git a/iris b/iris
> index 0d44dbf..6ee41f0 160000
> --- a/iris
> +++ b/iris
> @@ -1 +1 @@
> -Subproject commit 0d44dbfa10fc1f47c1de64c45cde43748dfe44d4
> +Subproject commit 6ee41f079a3f3ff0263ab309489cdae0f7b82acb

Да, имена коммитов описывают историю однозначно.

> Наша проблема в том, что при клонировании получаются объекты лишь основного
> репозитория, но не его модулей. Нам нужно рассмотривать основной репозиторий и
> его модули как связанное целое.

Да, при всех операциях передачи коммитов из одного репозитория в другой все эти 
gitlink'и игнорируются, в результате чего репозитории перестают быть самодостаточными.

> Или я не прав?

Ты прав, конечно, но это этого не легче.
Comment 43 Alexey Gladkov 2010-01-10 17:55:49 MSK
(В ответ на комментарий №42)
> (In reply to comment #41)
> > Created an attachment (id=3480) [details] [details]
> > gear-clone
> > 
> > Нечто типа этого не может гарантировать наличие всех необходимых объектов?
> 
> Это может помочь обычному пользователю подготовить репозиторий, содержащий
> submodules, к сборке gear'ом из HEAD'а.
> 
> Инструментам, использующим git fetch, это не поможет.

Репозиторий, использующий submodules, однозначно определяется. Поэтому необходимые модули можно однозначно получить:

git clone git://git.psi-im.org/psi.git

cd psi/

git submodule status
-ffe4a38d3f17b3380b060d1cbaafbeedc572c12a iris
-09a8aa5fe8217ebe6504785479aad059efcda0d8 src/libpsi

git submodule init
git submodule update

git submodule status 
 ffe4a38d3f17b3380b060d1cbaafbeedc572c12a iris (ffe4a38)
 09a8aa5fe8217ebe6504785479aad059efcda0d8 src/libpsi (09a8aa5)

Разумеется, те кто хочет использовать только "git fetch" не смогут получить все объекты, необходимые для сборки проекта. Но техника работы с submodule не ставит себе такую цель. Есть дополнительный инструментарий в git, который обеспечивает корректную работу с модулями.

Я не вижу технических проблем научить инструменты, использующие "git fetch", дополнительно использовать "git submodule".
Comment 44 Dmitry V. Levin 2010-01-10 18:42:38 MSK
(In reply to comment #43)
> Разумеется, те кто хочет использовать только "git fetch" не смогут получить все
> объекты, необходимые для сборки проекта. Но техника работы с submodule не
> ставит себе такую цель. Есть дополнительный инструментарий в git, который
> обеспечивает корректную работу с модулями.
> 
> Я не вижу технических проблем научить инструменты, использующие "git fetch",
> дополнительно использовать "git submodule".

Сначала мы разрешим незамкнутые репозитории, а потом будем пытаться гарантировать замкнутость во всех случаях, где она нужна?  Нет, это тупик.  Единственный выход, который я вижу -- это принудительный fake merge, который гарантирует замыкание естественным образом.
Comment 45 Alexey Gladkov 2010-01-10 19:16:06 MSK
(В ответ на комментарий №44)
> Сначала мы разрешим незамкнутые репозитории, а потом будем пытаться
> гарантировать замкнутость во всех случаях, где она нужна?  Нет, это тупик. 
> Единственный выход, который я вижу -- это принудительный fake merge, который
> гарантирует замыкание естественным образом.

Это противоречит логике git. Модули придуманы для создания зависимостей между репозиториями, не имеющими общей истории и общих объектов. Объединять такие репозитории в корне неправильно. Такой merge превратит репозиторий в помойку.

Ограничение "клонировать/использовать submodules вместе с родительским репозиторием" мне кажется правильным решением. gear лишь надстройка над git и может гарантировать выполнение такого ограничения.
Comment 46 Dmitry V. Levin 2010-01-10 19:39:03 MSK
(In reply to comment #45)
> (В ответ на комментарий №44)
> > Сначала мы разрешим незамкнутые репозитории, а потом будем пытаться
> > гарантировать замкнутость во всех случаях, где она нужна?  Нет, это тупик. 
> > Единственный выход, который я вижу -- это принудительный fake merge, который
> > гарантирует замыкание естественным образом.
> 
> Это противоречит логике git.

Не вижу противоречия, скорее наоборот.

> Модули придуманы для создания зависимостей между
> репозиториями, не имеющими общей истории и общих объектов.

Да.

> Объединять такие репозитории в корне неправильно.

Однако для сборки их просто необходимо объединить, чтобы добыть всё необходимое.
Этим сборка проекта отличается от остальных этапов сопровождения исходного кода.

> Такой merge превратит репозиторий в помойку.

Почему?  Каким образом?

> Ограничение "клонировать/использовать submodules вместе с родительским
> репозиторием" мне кажется правильным решением. gear лишь надстройка над git и
> может гарантировать выполнение такого ограничения.

gear -- это не надстройка, а инструмент для решения определённой задачи.
git умеет гарантировать замыкание, и надо это свойство git использовать, а не пытаться реализовывать замыкание по всей цепочке в gear своими силами.

Пакеты должны уметь собираться на отдельно взятом изолированном сервере.
Это значит, что на каждом этапе передачи git-репозитория должна быть гарантирована его самодостаточность. Нет более эффективного способа обеспечения этой гарантии, чем использование встроенных в git средств.
Comment 47 Michael Shigorin 2010-01-10 20:46:00 MSK
из ответа в devel@:

> As you see, there is a fundamental problem: GIT submodule breaks
> repository completeness, but gear requires git repositories to be
> self-contained.  I have no idea how to avoid this problem.

Исправить ожидания gear на соответствующие наблюдаемой
действительности, разумеется.

Возможно, обязав заливать используемые для субмодулей репо на
git.alt и указывать соответствие где-нить в .gear/submodules
во избежание тупой автоматической траты времени и трафика.

При этом технический мерж можно делать прямо перед скручиванием
тарбола, как понимаю.  И репо чистые, и Дима доволен.
Comment 48 Dmitry V. Levin 2010-01-10 22:19:36 MSK
(In reply to comment #47)
> из ответа в devel@:
> 
> > As you see, there is a fundamental problem: GIT submodule breaks
> > repository completeness, but gear requires git repositories to be
> > self-contained.  I have no idea how to avoid this problem.
> 
> Исправить ожидания gear на соответствующие наблюдаемой
> действительности, разумеется.
> 
> Возможно, обязав заливать используемые для субмодулей репо на
> git.alt

Это не представляется возможным.

> и указывать соответствие где-нить в .gear/submodules
> во избежание тупой автоматической траты времени и трафика.
> 
> При этом технический мерж можно делать прямо перед скручиванием
> тарбола, как понимаю.  И репо чистые, и Дима доволен.

Сборочный тэг должен указывать на коммит, замыкание которого находится в репозитории целиком и передаётся базовыми операциями (git fetch и git push) без потерь.  Всё остальное -- детали реализации.
Comment 49 Alexey Gladkov 2010-01-10 23:54:00 MSK
Беру таймаут.
Comment 50 Michael Shigorin 2010-01-11 02:03:26 MSK
(In reply to comment #48)
> > Возможно, обязав заливать используемые для субмодулей репо на
> > git.alt
> Это не представляется возможным.
Почему?  Тогда проблема потенциально длительной/сбойной загрузки уходит, остаётся решить, как удобней сделать технический мерж либо переписать .gitmodules сообразно .gear/submodules.

Выдача релевантной диагностики -- в идеале со ссылкой на вики -- будет достаточным напоминанием для того, чтобы майнтейнер спохватился и предпринял требуемое действие.
Comment 51 Alexey Gladkov 2010-01-11 22:04:52 MSK
Я постарался ещё раз осмыслить задачу и понять как её можно решить. Есть данность: существуют репозитории, использующие модули и есть gear, который должен уметь с ними работать.

Нам нужно чтобы при клонировании репозиторий был самодостаточным.

Что происходит с обычным репозиторием: мы делаем "git clone" и происходит копирование всего дерева объектов. Таким образом при клонировании репозитория от пользователя A к пользователю B, от B к C репозиторий оказывается самодостаточным и нет необходимости при клонировании B -> С иметь доступ к пользователю А:

A --> B --> C --> ...

Что происходит с "модульным" репозиторием: клонируется родительский репозиторий, но он не замкнут. В нём есть ссылки на объекты из другого репозитория (ссылка на модуль). Ссылки на модули содержатся в файле .gitmodules, который является частью родительского репозитория. Чтобы получить необходимые модули нам нужно выполнить команду "git submodule update", которая получает репозитории модулей по ссылкам. При этом при следующем клонировании ссылки остаются прежними. Таким образом, чтобы собрать родительский репозиторий и модули нужно иметь доступ к серверу, на который установлена ссылка:

A ----> B --> C --> ...
\-A1 <--------/
\-A2 <--------/

Чтобы использовать такой репозиторий есть несколько путей:

1. Можно использовать "git merge -s subtree". Это поможет при клонировании, но создаст общую историю между всеми репозиториями. Если общая история - не проблема, то это лучший путь.

2. Можно продолжить использовать модули. Для этого нужно исправить особенность формирования ссылок. Мы можем наложить следующее ограничение: модули должны находиться по тому же пути, что и основной репозиторий и на своих местах.

Таким образом, при клонировании родительского репозитория будут клонироваться и модули. В этом случае последующее клонирование будет производиться не из первоначального места, а из того же места, что и родительский.

Проблемным местом для этого подхода осталось клонирование bare репозиториев.

3. Можно разместить модули в бранчах и средствами gear работать с ними. 
Тут всё приходится делать вручную ... обновление и распаковку в нужное место.

Для всех трёх случаев я сделал маленькие наброски.

Вот объяснение апстримом разницы между subtree и submodules:

http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html#_comparing_em_subtree_em_merge_with_submodules
Comment 52 Alexey Gladkov 2010-01-11 22:07:14 MSK
Created attachment 4195 [details]
Вариант 1

Скрипт конвертирует submodule в subtree.
Comment 53 Alexey Gladkov 2010-01-11 22:09:12 MSK
Created attachment 4196 [details]
Вариант 2

Скрипт клонирует репозиторий и конвертирует ссылки на модули.
Comment 54 Anton Farygin 2010-01-11 22:09:50 MSK
(В ответ на комментарий №51)
> 1. Можно использовать "git merge -s subtree". Это поможет при клонировании, но
> создаст общую историю между всеми репозиториями. Если общая история - не
> проблема, то это лучший путь.

git merge -s subtree вступают в неразрешимый конфликт при следующем обновлении upstream'ом ссылки на submodule.

Этот вариант у меня не заработал.
Comment 55 Alexey Gladkov 2010-01-11 22:11:27 MSK
Created attachment 4197 [details]
Вариант 3

Скрипт располагает модули в бранчах родительского репозитория.
Comment 56 Alexey Gladkov 2010-01-11 22:15:44 MSK
(В ответ на комментарий №54)
> git merge -s subtree вступают в неразрешимый конфликт при следующем обновлении
> upstream'ом ссылки на submodule.

Конфликтов быть не должно. Расскажи как ты этого добился ?
Comment 57 Anton Farygin 2010-01-11 22:23:40 MSK
(В ответ на комментарий №56)
> (В ответ на комментарий №54)
> > git merge -s subtree вступают в неразрешимый конфликт при следующем обновлении
> > upstream'ом ссылки на submodule.
> 
> Конфликтов быть не должно. Расскажи как ты этого добился ?

Это было очень давно.

Примерно так:
- делаем как и ты с subtree
- что-то там разрабатываем, дорабатываем, патчим, коммитим... 
- ждём пока upstream передвинет ссылку на новый коммит в submodule
- мержим master с upstream, получаем бяку - submodule в upstream обновился, а у нас вместо него какое-то чудо в этом каталоге.

Может быть, сейчас уже такого нет ?
Comment 58 Alexey Gladkov 2010-01-11 22:40:38 MSK
(В ответ на комментарий №57)
> Может быть, сейчас уже такого нет ?

У меня subtree успешно работает в mozilla.org. Попробуй ещё. Должно работать.
Comment 59 Alexey Gladkov 2010-05-20 01:43:35 MSD
Created attachment 4398 [details]
gear-convert-submodule

Вот более облагороженная утилита. Она позволяет конвертировать репозиторий с подмодулями (git-submodule) в репозиторий с бранчами (git-remote). При этом в конфиг репозитория прописываются соответствующие ремоты. Таким образом, история не смешивается, такую схему легко поддерживать и мерджить.

Всех такой подход устроит ?
Comment 60 Dmitry V. Levin 2010-05-20 02:01:53 MSD
(In reply to comment #59)
> Created an attachment (id=4398) [details]
> gear-convert-submodule
> 
> Вот более облагороженная утилита. Она позволяет конвертировать репозиторий с
> подмодулями (git-submodule) в репозиторий с бранчами (git-remote). При этом в
> конфиг репозитория прописываются соответствующие ремоты. Таким образом, история
> не смешивается, такую схему легко поддерживать и мерджить.
> 
> Всех такой подход устроит ?

Правильно ли я понял, что предполагается применять эту утилиту только к специальному бранчу, на котором выпускаются релизы, а всю остальную работу выполнять в других бранчах?  Как правильно обновлять этот специальный бранч?
Comment 61 Alexey Gladkov 2010-05-20 02:16:38 MSD
(В ответ на комментарий №60)
> Правильно ли я понял, что предполагается применять эту утилиту только к
> специальному бранчу, на котором выпускаются релизы, а всю остальную работу
> выполнять в других бранчах?

Почти. Эта утилита нужна для единоразовой операции по конвертированию. Эта утилита прописывает ремоты на урлы, где расположены модули и втягивает их (репозитории, которые были подмодулями) как subtree.

> Как правильно обновлять этот специальный бранч?

$ git remote update foobar
$ git merge -s subtree foobar/master
Comment 62 Alexey Gladkov 2010-05-20 02:21:24 MSD
Думаю, что утилиту можно улучшить следующим образом:

1. Дать возможность задавать имя "специального бранча" через аргументы.

2. Дать возможность импортировать не только через ремоты, а через обычные бранчи тоже.
Comment 63 Alexey Gladkov 2010-05-23 18:20:48 MSD
http://git.altlinux.org/people/legion/packages/gear.git?p=gear.git;a=shortlog;h=refs/heads/gear-submodule

> 1. Дать возможность задавать имя "специального бранча" через аргументы.

Это не нужно т.к. утилита импортирует в текущий бранч.

> 2. Дать возможность импортировать не только через ремоты, а через обычные
> бранчи тоже.

Это тоже не имеет смысла т.к. не ставится задача разработки модулей в основном бранче.
Comment 64 Dmitry V. Levin 2010-06-01 15:12:05 MSD
(In reply to comment #63)
> http://git.altlinux.org/people/legion/packages/gear.git?p=gear.git;a=shortlog;h=refs/heads/gear-submodule

Не работает:
$ git clone -q git://git.sv.gnu.org/sed
$ cd sed
$ gear-submodule init
gear-submodule: Using 'heads/master' to import submodules
gear-submodule: Converting 'gnulib'
gear-submodule: gnulib: url not found
HEAD is now at 9c56053 fix typo in the manual
Comment 65 Alexey Gladkov 2010-06-01 15:47:55 MSD
(В ответ на комментарий №64)
> Не работает:
> $ git clone -q git://git.sv.gnu.org/sed
> $ cd sed
> $ gear-submodule init
> gear-submodule: Using 'heads/master' to import submodules
> gear-submodule: Converting 'gnulib'
> gear-submodule: gnulib: url not found
> HEAD is now at 9c56053 fix typo in the manual

http://git.altlinux.org/people/legion/packages/gear.git?p=gear.git;a=commitdiff;h=73a11916434ed3ee9b1f17e42b7c4ed4ca898f94

Забыл инициализацию модулей.
Comment 66 Dmitry V. Levin 2010-06-01 16:13:26 MSD
(In reply to comment #65)
> Забыл инициализацию модулей.

submodules можно и не инициализировать, работая с HEAD:.gitmodules напрямую.
Но на практике "git submodule init" раньше или позже всё равно будет вызван в том бранче, где модули остаются модулями.
Comment 67 Alexey Gladkov 2011-03-08 17:42:48 MSK
submodule.<name>.update
 Defines what to do when the submodule is updated by the superproject. If checkout (the default), the new commit specified  in the superproject will be checked out in the submodule on a detached HEAD. If rebase, the current branch of the submodule will be rebased onto the commit specified in the superproject. If merge, the commit specified in the superproject will be merged into the current branch in the submodule. This config option is overridden if git submodule update is given the --merge or --rebase options.
Comment 68 Ivan Zakharyaschev 2015-10-21 18:16:52 MSK
Вот GHC после 7.8 ведёт разработку с submodules -- https://ghc.haskell.org/trac/ghc/wiki/Building/GettingTheSources (а до этого втечеие какого-то периода времени был самодельный аналог, т.е. исходники, нужные для сборки, не все входили непосредственно в дерево коммита -- https://ghc.haskell.org/trac/ghc/wiki/Building/GettingTheSources/Legacy ).

Это к тому, что какой-никакой спрос на поддержку submodules в gear есть для сборки пакетов.

Кажется, предложенная здесь утилита втягивает недостающие исходники из модулей в специальный бранч, который, наверное, может быть совмещён с бранчем, где spec и всё такое. Со стороны сборочницы пользование такой утилитой мейнтейнером не требует специальной поддержки? Т.е. можно пробовать.

Обычно раньше можно было даже исходники не помещать в дерево бранча со спеком (делая git merge -s ours upstream) -- главное, чтобы нужные коммиты были среди предков коммита для сборки. Что, по-моему, было чем-то приятно: не надо смешивать исходники и спек в одном бранче.

С этой утилитой конвертации такой приём уже больше не пройдёт (или потребует ещё одного бранча). По-моему, не очень серьёзная потеря...

А ещё с ней не будет возможности в .gear/rules указать апстримный бранч или тэг как источник исходников, да? Надо будет ссылаться на самодельную ветку. Немного неприятно, потому что читается не так убедительно (раньше: вот, я беру чистые апстримные исходники и с ними работаю, это и записано в .gear/rules. А с конвертаций появляется ещё один уровень indirection и не очевидно, какие исходники берутся.)
Comment 69 Ivan Zakharyaschev 2015-10-21 22:26:37 MSK
Я немного подумал над этой проблемой. Если б я реализовывал, я бы склонялся к тому, чтобы научить gear рекурсивно вытаскивать поддеревья из модулей при сборке дерева -- при этом обычное требование из принципов gear: коммиты модулей должны быть доступны в том же репо (и как предки текущего коммита, что можно было бы достичь git merge -s ours module-tag в эту служебную ветку).

Т.е. сближение с вариантом 3.

Это потребует поддержки и на стороне сборочницы, если делать чисто. (Хотя можно обойти, нагородив преобразование модулей во много правил tar в .gear/rules + скрипт, который их будет распаковывать куда надо. А может, даже без скрипта можно, если .gear/rules умеет добавлять префикс к путям внутри tar.)
Comment 70 Ivan Zakharyaschev 2015-10-21 22:46:31 MSK
(В ответ на комментарий №69)
> Я немного подумал над этой проблемой. Если б я реализовывал, я бы склонялся к
> тому, чтобы научить gear рекурсивно вытаскивать поддеревья из модулей при
> сборке дерева -- при этом обычное требование из принципов gear: коммиты модулей
> должны быть доступны в том же репо (и как предки текущего коммита, что можно
> было бы достичь git merge -s ours module-tag в эту служебную ветку).
> 
> Т.е. сближение с вариантом 3.
> 
> Это потребует поддержки и на стороне сборочницы, если делать чисто. (Хотя можно
> обойти, нагородив преобразование модулей во много правил tar в .gear/rules +
> скрипт, который их будет распаковывать куда надо. А может, даже без скрипта
> можно, если .gear/rules умеет добавлять префикс к путям внутри tar.)

А, умеет!

		base=base_name
			Add base_name  as a leading  path to all  files in
			the  generated archive.   If  this  option is  not
			specified, by default the archive name without the
			suffix (set by the name option) is used.


Так что можно написать утилиту, которая будет переводить рекурсивно все модули в правила tar в .gear/rules и обновлять соотв.ссылки, а в .src.rpm будет куча архивов, которые надо будет просто друг за другом распаковать.

Наверное, было бы удобно новый вид ссылки в gear ввести: помимо

	    A name  of a tag  listed in  the tag list  specifies the
	    root tree of the commit  pointed to by the specified tag
	    (directly or indirectly through a chain of tag objects).
	    The specified  commit must  be an  ancestor of  the main
	    commit, and all tag objects  in the chain must be stored

ещё и имя модуля внутри какого-то коммита. Достаточно, чтобы gear-store-tags новый вид ссылки понимал, и, кажется, тогда не нужно изменений на стороне сборочницы (тогда можно было бы сразу рекурсивный сбор дерева реализовать) -- я думал, как обойти это, оставаясь совместимым со старым gear.
Comment 71 Michael Shigorin 2015-10-21 22:58:35 MSK
(В ответ на комментарий №70)
> ещё и имя модуля внутри какого-то коммита
Тогда надо фиксировать конкретные коммиты в субмодулях по состоянию на какой-то момент времени (какой именно, если брать его автоматически, а не указывать всё множество коммитов руками?) -- не забываем, что одной из целей gear является воспроизводимость сборки.
Comment 72 Ivan Zakharyaschev 2015-10-21 23:01:42 MSK
(В ответ на комментарий №70)

> Наверное, было бы удобно новый вид ссылки в gear ввести: помимо
> 
>         A name  of a tag  listed in  the tag list  specifies the
>         root tree of the commit  pointed to by the specified tag
>         (directly or indirectly through a chain of tag objects).
>         The specified  commit must  be an  ancestor of  the main
>         commit, and all tag objects  in the chain must be stored
> 
> ещё и имя модуля внутри какого-то коммита. Достаточно, чтобы gear-store-tags
> новый вид ссылки понимал, и, кажется, тогда не нужно изменений на стороне

Подумал над форматом нового вида tree_path. Можно что-то вроде:

upstream:modulepath1:. (в общем виде, upstream:modulepath1:path_in_tree)

как рекурсивное расширение нынешнего подхода на вложенные модули. Здесь upstream:modulepath1 должно восприниматься как имя ссылки, которую сохранит улучшенный gear-store-tags. Но не будет ли двоеточие ломать старый gear, когда он его увидит?..
Comment 73 Ivan Zakharyaschev 2015-10-21 23:07:23 MSK
(В ответ на комментарий №71)
> (В ответ на комментарий №70)
> > ещё и имя модуля внутри какого-то коммита
> Тогда надо фиксировать конкретные коммиты в субмодулях по состоянию на какой-то
> момент времени (какой именно, если брать его автоматически, а не указывать всё
> множество коммитов руками?) -- не забываем, что одной из целей gear является
> воспроизводимость сборки.

Ну да, конечно, аналогично gear-store-tags или как оно сейчас работает для ссылок на бранчи вроде upstream:

tar: upstream:ghc name=@name@-@version@


(Не забываем gear-store-tags перед тем, как отправить на сборку.)
Comment 74 Ivan Zakharyaschev 2015-10-21 23:14:03 MSK
(В ответ на комментарий №73)
> (В ответ на комментарий №71)
> > (В ответ на комментарий №70)
> > > ещё и имя модуля внутри какого-то коммита
> > Тогда надо фиксировать конкретные коммиты в субмодулях по состоянию на какой-то
> > момент времени (какой именно, если брать его автоматически, а не указывать всё

Какой именно коммит субмодуля -- это зафиксировано с помощью git submodule внутри дерева коммита основной ветки. (В этом вроде как и фишка git submodule: воспроизводимость сборки с тем же самым коммитом субмодуля, стандартными средствами git. Тут если подумать, то задачи, решаемые git-submodule и gear пересекаются. Если писать gear с нуля сейчас, можно было бы рассмотреть реализацию на основе git-submodule, потому что возможности по фиксации коммита те же, что у gear-store-tags, и идея та же -- записать id коммита внутрь дерева основной ветки. У нас в файл .gear/tags/list, у них -- в дерево (директорию) в виде объекта особого типа, насколько я понимаю.)

> > множество коммитов руками?) -- не забываем, что одной из целей gear является
> > воспроизводимость сборки.
> 
> Ну да, конечно, аналогично gear-store-tags или как оно сейчас работает для
> ссылок на бранчи вроде upstream:
> 
> tar: upstream:ghc name=@name@-@version@
> 
> 
> (Не забываем gear-store-tags перед тем, как отправить на сборку.)
Comment 75 Alexey Gladkov 2015-10-21 23:34:36 MSK
(В ответ на комментарий №74)
> Какой именно коммит субмодуля -- это зафиксировано с помощью git submodule
> внутри дерева коммита основной ветки. (В этом вроде как и фишка git submodule:

Политика gear требует наличия всех необходимых объектов (не ссылок на объекты как в случае с git submodule) без обращений к внешним источникам. 

См. https://bugzilla.altlinux.org/show_bug.cgi?id=17914#c20
Comment 76 Ivan Zakharyaschev 2015-10-22 00:18:20 MSK
(В ответ на комментарий №75)

> Политика gear требует наличия всех необходимых объектов (не ссылок на объекты
> как в случае с git submodule) без обращений к внешним источникам. 
> 
> См. https://bugzilla.altlinux.org/show_bug.cgi?id=17914#c20

Да, в этом разница. Я имел в виду общее: хранение ссылок на коммиты внутри коммитов, обновление и т.п.
Comment 77 Vitaly Lipatov 2017-03-15 14:52:17 MSK
Для истории: мне показалось, что submodules — это идущее в разрез со сборкой пакетов свойство, и реализовано нормально оно быть не может. Поэтому я добавил описание некоторой автоматизации объезда проблемы для тех апстримов, которые не выпускают тарболы или не умеют сделать их нормальными:
https://www.altlinux.org/Сборка_пакета_с_git_submodule
Comment 78 alexey.tourbin 2017-09-21 06:54:47 MSK
Dear participants masculine,
Have you made any progress on the issue?

I am facing this problem right now: as the zpkglist library is transitioning into its beta stage, I need to attach to the git repo a few modules developed independently.  I would love to use "git submodule", but then apparently I won't be able to build it with gear(1).

I already faced this problem once with pkglist-unmets, and after a little while of biting my lips, I thought that merging in an unrelated history was not too cardinal a sin after all.  https://github.com/svpv/pkglist-unmets/commit/638e3b6c

So what should I do now?  Is there any glimmer of hope?
"Isle of hope, isle of tears" - can hear him sinning.
Comment 79 Dmitry V. Levin 2022-01-12 20:31:55 MSK
Продублирую тут написанное в
https://lore.altlinux.org/devel/20220112165907.GA11057@altlinux.org/T/

Есть вариант решения, который можно посмотреть в
https://git.altlinux.org/people/ldv/packages/?p=gear.git;a=shortlog;h=submodules

Постановка задачи, которая привела к этому варианту решения, была примерно следующая:
- в некотором проекте используются submodules для сравнительно небольших
  внешних подпроектов;
- требуется собирать пакеты из этого проекта в Сизиф;
- требуется не засорять историю этого проекта историями внешних подпроектов;
- пользоваться этим должно быть не сложнее, чем gear-store-tags;
- за всё это удобство можно заплатить увеличением размера git-репозитория
  проекта.

В общих чертах реализация построена та том, что
- есть новый инструмент gear-store-submodules, похожий на gear-store-tags,
  который превращает submodules в бандлы с помощью git-bundle(1),
  а эти бандлы, в свою очередь, добавляются в репозиторий как обычные файлы;
- gear умеет автоматически конвертировать такие бандлы в архивы
  и добавлять такие архивы к основным архивам.

Этот подход работает, но он подойдёт не всем.
Comment 80 Anton Farygin 2022-01-13 08:36:31 MSK
Выглядит неплохо. Надо бы, конечно, пожить с этим в реальном использовании.

А в чём минусы этого подхода с бандлами ?
Comment 81 Alexey Gladkov 2022-01-13 13:47:35 MSK
(Ответ для Anton Farygin на комментарий #80)
> Выглядит неплохо. Надо бы, конечно, пожить с этим в реальном использовании.
> 
> А в чём минусы этого подхода с бандлами ?

Репозиторий вырастает на размер бандлов. Если submodules у проекта много или же submodule сам по себе большой, то рост будет значительный.
Comment 82 Anton Farygin 2022-01-13 14:07:11 MSK
а bundle занимает больше места, чем просто подшитая история с -s ours ?

Мне почему-то казалось что это одно и тоже по объёму
Comment 83 Dmitry V. Levin 2022-01-13 14:33:40 MSK
В каждом бандле сохранена вся история подпроекта до указанного коммита,
поэтому со временем в git-репозитории будет квадратичный рост размера подпроекта.
Comment 84 Alexey Gladkov 2022-01-13 14:35:03 MSK
(Ответ для Anton Farygin на комментарий #82)
> а bundle занимает больше места, чем просто подшитая история с -s ours ?
> 
> Мне почему-то казалось что это одно и тоже по объёму

Насколько я помню ты прав. Но я говорил немного не об этом. bundle это pack с историей, которая занимает место. Это больше чем git-archive.
Comment 85 Anton Farygin 2022-01-13 14:41:05 MSK
Для каждой новой версии делается и подшивается новый бандл, содержащий всю историю проекта за всё время ?
Нет, это конечно будет адски много. Можно подсчитать если интересно, но мне кажется что в каких-то проектах это фактически будет невозможно использовать. Особенно в тех, кто выпускает новую версию по крону один раз в неделю.
Comment 86 Alexey Gladkov 2022-01-13 14:52:21 MSK
(Ответ для Anton Farygin на комментарий #85)
> Для каждой новой версии делается и подшивается новый бандл, содержащий всю
> историю проекта за всё время ?
> Нет, это конечно будет адски много. Можно подсчитать если интересно, но мне
> кажется что в каких-то проектах это фактически будет невозможно
> использовать. Особенно в тех, кто выпускает новую версию по крону один раз в
> неделю.

Данная реализация сохраняет и восстанавливает ровно то же состояние, которое ты получаешь в репозитории после

git submodules --init

Соответственно размер соответствующий.
Comment 87 Anton Farygin 2022-01-13 15:17:55 MSK
Да, но это состояние, в отличии от git submodules init, если я правильно понял Диму, для каждой новой версии сохраняется заново.

Т.е. - если репозиторий содержит 20 submodules, каждый из которых по 100 мегабайт, то при сборке каждой новой версии основной репозиторий будет расти примерно на 2000 мегабайт, т.к. состояние каждого сабмодуля подкладывается большим бинарём.
Comment 88 Alexey Gladkov 2023-08-16 17:59:02 MSK
Антон, мне тут пришла мысль делать bundle c --depth=1. Это может помочь ?

https://git.altlinux.org/people/legion/packages/gear.git?p=gear.git;a=shortlog;h=refs/heads/submodules
Comment 89 Anton Farygin 2023-08-17 08:29:41 MSK
Кстати да, возможно. Надо попробовать.
Comment 90 Alexey Gladkov 2023-08-17 12:19:47 MSK
(In reply to Anton Farygin from comment #89)
> Кстати да, возможно. Надо попробовать.

с --depth=1 у меня bundle получился меньше и остальные операции вроде не жаловались на нехватку объектов. Попробуй бранч по ссылке.
Comment 91 Egor Shestakov 2023-12-21 10:06:54 MSK
Необходимо добавить поддержку bundle в gear. Использую в пакете:
http://git.altlinux.org/people/ved/packages/libmaplibre-native.git

Реализацию взял из этого бранча:
https://git.altlinux.org/people/legion/packages/gear.git?p=gear.git;a=shortlog;h=refs/heads/submodules
Comment 92 Anton Farygin 2023-12-21 10:32:50 MSK
У меня время не дошло попробовать, да и я пока-что больше настроен на другую схему, она мне удобнее, т.к. видно историю каждого сабмодуля.