LINUX.ORG.RU

git submodules и detached HEAD

 ,


0

2

Может ли кто-то доходчиво объяснить по какой причине сабмодули в Git по умолчанию находтяся в состоянии detached HEAD а не привязаны к какому либо бранчку, как родительский репозиторий? В чём логика такого решения? В Гугле можно найти 100500 вопросов и примерно столько же похожих ответом о том, как с этим бороться, то есть большинство пользователей Git ожидает совершенно другое поведения от Git submodules.

P.S. Я знаю как с этим бороться, мой вопрос лишь о том, почему таково поведение git submodules по умолчанию.


Сабмодули не должны самопроизвольно меняться. Коммит, на который указывает ветка, может меняться. Следовательно, в родительском репозитории надо привязываться именно к коммитам, хоть это и вызывает неудобства при использовании.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Что значит самопроизвольно и почему не должны? Для меня и для тех 100500 вопрошающих сабмодули - это лишь более удобный способ организации проекта, состоящего из нескольких репозиториев. Например репозиториев микросервисного проекта. Как работать с сабмодулями в состоянии detached HEAD? Любой новый коммит в таком сабмодуле не привязывается ни к одному бранчу и может легко потеряться. Общая рекомендация - никогда ничего не коммитить в состоянии detached HEAD, а тут такое непотребство по умолчанию.

Если это сделано для того, чтобы зафиксировать состояние сабмодулей, то почему это поведение нельзя привязать к конфигурации. Кому надо будут работать так, а остальные - с бранчами.

hummer
() автор топика
Ответ на: комментарий от hummer

Если бы они менялись, то дважды склонировав репозиторий можно было бы получить два разных результата. git это не средство управления кучей репозиториев, а система версионирования. Система версионирования, которая даёт невоспроизводимые результаты, не нужна. Тут либо использовать что-то другое, либо привыкнуть делать checkout.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

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

Ну вот с обычным репозиторием всё именно так. Если его дважды, с некоторым промежутком времени, склонировать, можно получить два разных результата.

git это не средство управления кучей репозиториев, а система версионирования. Система версионирования, которая даёт невоспроизводимые результаты, не нужна.

Для этого существуют метки.

У тебя есть какое-то другое объяснение detached HEAD по умолчанию в сабмодулях?

hummer
() автор топика
Ответ на: комментарий от t184256

Потому что кому надо те хотят ненужного и опасного.

Мысль не раскрыта. Что тут ненужного или опасного?

hummer
() автор топика
Ответ на: комментарий от hummer

Использовать git submodules не как способ притянуть конкретный коммит, где конкретное значение коммита версионируется вместе с остальной репой. Хочешь помойку с отдельным версионированием — положи туда checkout без submodules, главное никому не рассказывай.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Использовать git submodules не как способ притянуть конкретный коммит, где конкретное значение коммита версионируется вместе с остальной репой.

Это же можно сказать и о бранчах обычных репозиториев. Притянуть конкретный коммит может понадобиться при сборке и для этого придумали метки. А мне нужно заниматься разработкой и поэтому нужны конкретные бранчи, а не просто коммиты в состоянии detached HEAD. Расскажи, как мне делать новые коммиты в detached HEAD сабмодулях?

Хочешь помойку с отдельным версионированием — положи туда checkout без submodules, главное никому не рассказывай.

Что значит «положи туда checkout без submodules»?

hummer
() автор топика
Ответ на: комментарий от thesis

Git делали дураки, вот почему.

Интересная теория, но я всё таки полагаю, что какая-то логика за всеми такими решениями стоит, просто никто из ораторов ещё не смог внятно её сформулировать.

hummer
() автор топика
Ответ на: комментарий от hummer

Наверняка стоит. И наверняка дурацкая.

thesis ★★★★★
()
Ответ на: комментарий от hummer

А мне нужно заниматься разработкой и поэтому нужны конкретные бранчи, а не просто коммиты в состоянии detached HEAD. Расскажи, как мне делать новые коммиты в detached HEAD сабмодулях?

Никак. Не делай этого. Делай коммиты в отдельных чекаутах, затем адвансь сабмодули.

Что значит «положи туда checkout без submodules»?

git checkout <url> <dumpster-of-a-project>/formerly-a-path-to-submodule

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Никак. Не делай этого. Делай коммиты в отдельных чекаутах, затем адвансь сабмодули.

В смысле клонировать сабмодули отдельно и работать с ними там отдельно? Тогда зачем вообще нужны сабмодули?

git checkout <url> <dumpster-of-a-project>/formerly-a-path-to-submodule

Что это за странная и к тому же неработающая команда? Я знаю, что чекаут можно делать на бранч, метку, коммит, а тут почему-то url.

hummer
() автор топика
Ответ на: комментарий от hummer

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

Не всё. Если сделать git checkout на коммит, то результат будет всегда одинаковый. Если не привязывать коммиты основного репозитория к коммитам сабмодулей, то этого не будет.

Для этого существуют метки.

Метки тоже можно поменять, а хеш коммита нельзя.

У тебя есть какое-то другое объяснение detached HEAD по умолчанию в сабмодулях?

Нет.

xaizek ★★★★★
()
Ответ на: комментарий от hummer

Что это за странная и к тому же неработающая команда?

s/clone/checkout/

В смысле клонировать сабмодули отдельно и работать с ними там отдельно?

Да.

Тогда зачем вообще нужны сабмодули?

Как способ указатели на конкретный коммит, который чекаутить при сборке. Такой вот костыль.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Как способ указатели на конкретный коммит, который чекаутить при сборке. Такой вот костыль.

Какой-то странный костыль. В каком файле сидят эти указатели? Почему их нет в .gitmodules и как их вообще менять на произвольный (а не на последний) коммит?

Похоже @thesis прав и это какой-то дурной дизайн.

hummer
() автор топика
Ответ на: комментарий от xaizek

Метки тоже можно поменять, а хеш коммита нельзя.

Всё можно менять, хотя и не всегда стоит, а иногда это не безопасно. Вот и метки обычно не меняют.

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

В моём случае это и не надо. Я не devops и билды не собираю. Мне эта привязка нахрен не упала. Мно просто нужно одновременно работать с множеством репозиториев одновременно. Есть repo скрипт на Python от Google, но я предпочитаю стандартные решения.

hummer
() автор топика

О каких неудобствах и ожидаемом поведении идёт речь?

EXL ★★★★★
()
Ответ на: комментарий от hummer

Всё можно менять, хотя и не всегда стоит, а иногда это не безопасно. Вот и метки обычно не меняют.

При смене коммита хеш тоже изменится (коллизию игнорируем).

но я предпочитаю стандартные решения.

Стандартное решение не будет разваливаться случайным образом. При этом никто не мешает пойти в сабмодуль и сделать там git checkout на ветку после клонирования родителя и работать дальше. По крайней мере, я не помню с этим проблем.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от hummer

Или картечница Гатлинга для октопуси.

Переведи на русский

Пушка Гатлинга, Octocat.

В переводе: git submodules – надёжный способ отстрелить все ноги не только себе, но и всем вокруг.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от xaizek

При смене коммита хеш тоже изменится

Банальный rebase меняет хеши коммитов.

Стандартное решение не будет разваливаться случайным образом.

Именно.

При этом никто не мешает пойти в сабмодуль и сделать там git checkout на ветку после клонирования родителя и работать дальше. По крайней мере, я не помню с этим проблем.

Во-первых это неудобно. Во-вторых, если в сабмодуле я перейду на другой коммит (например сменив бранч), выполнение git submodule update снова приведёт к detached HEAD. Всё потому, что сабмодуль привязан к коммиту, а не к бранчу. А git submodule update нужно делать после обновления того самого коммита в сабмодуле, на который смотрит родительский репозиторий. Тут легко запутаться.

hummer
() автор топика
Ответ на: комментарий от hummer

Банальный rebase меняет хеши коммитов.

Он сам коммит меняет, так как коммит это не только данные, но ещё и метаданные (сообщение и список родителей, а смена родителей любые данные может поменять).

Тут легко запутаться.

Если их много, то не спорю.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Он сам коммит меняет, так как коммит это не только данные, но ещё и метаданные (сообщение и список родителей, а смена родителей любые данные может поменять).

Ещё коммитер и дата коммита. То есть ты можешь вабрать pick и скорее всего там изменится лишь время коммита, реже ещё и коммитер, если автор предыдущий - не ты.

hummer
() автор топика
Ответ на: комментарий от beastie

git submodules – надёжный способ отстрелить все ноги не только себе, но и всем вокруг.

В нынешнем виде да, но почему ему не добавять функциональность для RnD? Не все же devops.

hummer
() автор топика
Ответ на: комментарий от hummer

но почему ему не добавять функциональность для RnD?

Так есть же настройки (update, branch). Или и с ними что-то не так?

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Так есть же настройки (update, branch). Или и с ними что-то не так?

Пробовал, не помогает. А ты сам попробуй.

hummer
() автор топика

Поэтому мы переехали на монореп.

PPP328 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.