Интересные обсуждения
темы заинтересовавшие velkin
Подмодули Git
13.05.2024
|
Qulac
|
Нужна помощь
с толкнулся с такой вещью и уже второй раз теряю свои результаты работы с кодом. Вернее результаты ни куда не делись, комит был, только его теперь фиг достанешь в том виде что он был. Короче меня пока не интересуют субмодули и какая от них польза, мне нужно всего лишь их как-то нейтрализовать, что бы они не мешали работать с репозиторием как с единым целым. Так что если кому не лень объясните на пальцах пожалуйста. Вот я склонировал в vs репо, создал новую ветвь от ветки разработки типа task-10, но субмодули при этом остаются в detach состоянии. Что нужно с ними сделать, что бы можно было все закомитить, сделать пуш, а результаты ни куда не делить?
| 13.05.2024 24 комментария |
Q>Нужна помощь
сабмодули — это отдельные репозитории, которые вычекиваются в определенном фиксированном коммите, который фиксируется в коммите главного репа. Надо зайти в каждый, который меняешь, сделать там ветку (возможно от мастера, а не от detached commit), на ней менять, ее коммитить и ее пушить. В главном репе тоже ветка, на ней меняешь код главного репа, а новую ревизию сабмодуля фиксируешь просто добавляя папку сабмодуля (git add). Измненеия в сабмодуле от git add не добавляются. Надо иммено что внутри сделать git add, commit, push. А потом в главном git add submodule-dir.
Есть команды-сокращения для работы с сабами, но сначала надо познать принцип.
У меня похожая ситуация. Каким-то образом сабмодули (но не все, а два из четырех, хз, почему) застряли в состоянии detached, хотя по факту этот коммит и есть последний коммит в мастере. Visual Studio со своим multi-repo support отказывается даже делать Pull. Я просто хочу вернуться в главном репо на мастер, и в сабах тоже на мастер, локальных изменений у меня нет, че делать-то?
Ок, зашел в саб репо, сделал git checkout master, потом git pull, git status показывает, что изменений в сабмодуле НЕТ (nothing to commit, etc). Но теперь в главном репо я вижу: modified: my-sub-repo (new commits). Студия показывает это:
Что это значит, черт побери? Изменений у меня нет, я просто запуллил всё что мог со всех реп. Что он понимает под изменениями и что мне с этим делать? Коммитить? Так зачем, я не собираюсь портить основной мастер ничем. Реверт? Так потом опять выползет.
Пробовал git submodule update --init --recursive, так оно мне потом опять повергает сабрепо в detached.
Наверно, остается один проверенный путь — нахрен удалить весь каталог и выкачать всё заново. Но лень, потом специфические конфиги по папкам раскладывать.
----
И вопрос, скорее, в КСВ — почему так? зачем мне эти сложности? Я не хотел ничего другого, кроме как выкачать репо с сабрепами, создать ветки для фичи, сделать фичу, закоммитить и вернуться на мастер. Почему для этого необходимо изучать всю подноготную гита, всякие рефы, детачед коммиты? Ну я могу понять, возможно, для разработки ядра линукс такой трэш, где есть сеть независимых репозиториев, где разработка ведется peer-to-peer, а потом еще патчи друг другу шлют — это то что доктор прописал. Но зачем это всё обычным разрабам, кто их всех подсадил на это чудовище?
—
_>Но зачем это всё обычным разрабам, кто их всех подсадил на это чудовище?
Я тоже замучался выкачивать qt с подмодулями с помощью git. Потом плюнул и создал один собственный коммит в стиле монорепозитория.
Есть альтернативные способы работы, вроде использования веток. Только вот стиль работы с git выбирают сами разработчики. Если они выбрали подмодули, то для нормальных людей всё становится крайне неудобным.
Проблема не только в выкачивании, какой-нибудь gitweb потом плохо это интерпретирует.
V>Я тоже замучался выкачивать qt с подмодулями с помощью git.
А в чем проблема?
_>У меня похожая ситуация. Каким-то образом сабмодули (но не все, а два из четырех, хз, почему) застряли в состоянии detached, хотя по факту этот коммит и есть последний коммит в мастере. Visual Studio со своим multi-repo support отказывается даже делать Pull. Я просто хочу вернуться в главном репо на мастер, и в сабах тоже на мастер, локальных изменений у меня нет, че делать-то?
Ну смотри, каждый коммит в главном репе ссылается на какой-то конкретный коммит в сабмодуле.
Нет такого, что ссылка идет на ветку мастер сабмодуля, чтобы каждый конкретный коммит главного репа ссылался на определенную версию, а не как повезет.
_>Ок, зашел в саб репо, сделал git checkout master, потом git pull, git status показывает, что изменений в сабмодуле НЕТ (nothing to commit, etc). Но теперь в главном репо я вижу: modified: my-sub-repo (new commits). Студия показывает это:
Да, теперь у тебя сабмодуль в твоей ветке все еще ссылается на старый коммит, а вычекнут другой коммит. Очевидно, ты поменял ссылку. (Есть изменения в главном репе, а не в сабмодуле).
_>Что это значит, черт побери? Изменений у меня нет, я просто запуллил всё что мог со всех реп. Что он понимает под изменениями и что мне с этим делать? Коммитить? Так зачем, я не собираюсь портить основной мастер ничем. Реверт? Так потом опять выползет.
Если хочешь зафиксировать в своей ветке новую версию сабмодуля, то git add submodule-path / git commit. Иначе ну просто игнорь. Ну а что. Если файл меняешь, тебе же тоже изменения покажет.
_>Пробовал git submodule update --init --recursive, так оно мне потом опять повергает сабрепо в detached.
Конечно, он вычекивает конкретный коммит, на который ссылается твоя ветка. И оно оказывается в detached.
_>Наверно, остается один проверенный путь — нахрен удалить весь каталог и выкачать всё заново. Но лень, потом специфические конфиги по папкам раскладывать.
Ничего не поменяется.
_>
_>----
_>И вопрос, скорее, в КСВ — почему так? зачем мне эти сложности? Я не хотел ничего другого, кроме как выкачать репо с сабрепами, создать ветки для фичи, сделать фичу, закоммитить и вернуться на мастер. Почему для этого необходимо изучать всю подноготную гита, всякие рефы, детачед коммиты? Ну я могу понять, возможно, для разработки ядра линукс такой трэш, где есть сеть независимых репозиториев, где разработка ведется peer-to-peer, а потом еще патчи друг другу шлют — это то что доктор прописал. Но зачем это всё обычным разрабам, кто их всех подсадил на это чудовище?
Ну так сделано. Так работают soft-link'и.
AD>сабмодули — это отдельные репозитории, которые вычекиваются в определенном фиксированном коммите, который фиксируется в коммите главного репа. Надо зайти в каждый, который меняешь, сделать там ветку (возможно от мастера, а не от detached commit), на ней менять, ее коммитить и ее пушить. В главном репе тоже ветка, на ней меняешь код главного репа, а новую ревизию сабмодуля фиксируешь просто добавляя папку сабмодуля (git add). Измненеия в сабмодуле от git add не добавляются. Надо иммено что внутри сделать git add, commit, push. А потом в главном git add submodule-dir.
AD>Есть команды-сокращения для работы с сабами, но сначала надо познать принцип.
А можно как-то сделать, чтобы сабмодуль сам устанавливался например в мастер (или на другую какую-то ветку) и при всех обновлениях не менял состояния? А то задолбало, постоянно на оторванную башку натыкаюсь
П>А можно как-то сделать, чтобы сабмодуль сам устанавливался например в мастер (или на другую какую-то ветку) и при всех обновлениях не менял состояния? А то задолбало, постоянно на оторванную башку натыкаюсь
Взаимоисключающие параграфы. Как это стоять на мастере и не менять состояния?
Ну ладно, не важно. Сабмодули всегда ставятся на конкретный коммит, как раз чтобы не менять состояния, поэтому они всегда вычекиваются в detached head.
П>>А можно как-то сделать, чтобы сабмодуль сам устанавливался например в мастер (или на другую какую-то ветку) и при всех обновлениях не менял состояния? А то задолбало, постоянно на оторванную башку натыкаюсь
AD>Взаимоисключающие параграфы. Как это стоять на мастере и не менять состояния?
Да я наверное не очень что-то понимаю. Решил я попробовать с ними пожить. Есть у меня либа, я её в проект присунул как сабмодуль. Либа активно развивается вместе с проектом, я особо не заморачиваюсь с ветками мержреквестами и пр, тупо в мастер добавляю изменения, и пушу в ремоут. Да, при обновлении текущая ветка не меняется, если я уже сделал чекаут, тут я соврал, но в новое место когда клонируешь, надо чекаут на ветку сделать, я пару раз накололся.
Состояние не менять — в том плане, что у меня выбрана ветка мастер, и я хочу иметь там самые последние изменения. Ну то есть да, HEAD будет двигаться.
AD>Ну ладно, не важно. Сабмодули всегда ставятся на конкретный коммит, как раз чтобы не менять состояния, поэтому они всегда вычекиваются в detached head.
Вот тут не очень понятно, а на какой коммит они ставятся? В .gitmodules вроде нет по дефолту информации о коммите, значит, гит сам выбирает какой коммит мне подсунуть? Самый последний?
А если я в подмодуле завёл ветки, сделал ветку develop, куда коммичу даже не собирающиеся сорцы, чтобы потом доделать, оттестить, и смержить в мастер? Получится, что сабмодуль будет указывать на нерабочий коммит? Но когда я использую либу, я вообще-то хочу чтобы у меня собиралось с ней. Вот тут как-то не очень понятно
П>Да я наверное не очень что-то понимаю. Решил я попробовать с ними пожить. Есть у меня либа, я её в проект присунул как сабмодуль. Либа активно развивается вместе с проектом, я особо не заморачиваюсь с ветками мержреквестами и пр, тупо в мастер добавляю изменения, и пушу в ремоут. Да, при обновлении текущая ветка не меняется, если я уже сделал чекаут, тут я соврал, но в новое место когда клонируешь, надо чекаут на ветку сделать, я пару раз накололся.
Не понял...
П>Состояние не менять — в том плане, что у меня выбрана ветка мастер, и я хочу иметь там самые последние изменения. Ну то есть да, HEAD будет двигаться.
Так не получится, двигать надо вручную. А что если захочешь собрать старую версию, а она тебе вычекнет несовместимый новый сабмодуль?
AD>>Ну ладно, не важно. Сабмодули всегда ставятся на конкретный коммит, как раз чтобы не менять состояния, поэтому они всегда вычекиваются в detached head.
П>Вот тут не очень понятно, а на какой коммит они ставятся? В .gitmodules вроде нет по дефолту информации о коммите, значит, гит сам выбирает какой коммит мне подсунуть? Самый последний?
Нет, который был последним закомичен в этой ветке.
А хранит внутри дерева https://stackoverflow.com/questions/5033441/where-does-git-store-the-sha1-of-the-commit-for-a-submodule
Представь, что сабмодуль — это софтлинк, который ссылается на конкретное имя mysuperlib-0.0.3. В разных ветках, в разных коммитах эта ссылка может быть разной. Она автомагически не будет меняться на другие имена.
Чтобы обновить версию сабмодуля в ветке, ты идешь в сабмодуль, вычекиваешь нужную версию (можно и мастер, не важно, азпоминаться бущет именно коммит). Потом идешь обратно в главный реп, делаешь git add submodule-path, git commit. Всё, теперь в твоей ветке новая версия. Мержишь свою ветку в мастер главного репа, и оппа, теперь в мастере новая версия.
П>А если я в подмодуле завёл ветки, сделал ветку develop, куда коммичу даже не собирающиеся сорцы, чтобы потом доделать, оттестить, и смержить в мастер? Получится, что сабмодуль будет указывать на нерабочий коммит? Но когда я использую либу, я вообще-то хочу чтобы у меня собиралось с ней. Вот тут как-то не очень понятно
Делаешь ветку в главном репе, делаешь ветку в сабмодуле (можешь их даже одинаково назвать). В ветку главного репа вычекиваешь в сабмодуле свою ветку сабмодуля, делаешь git add submodule-path, git commit. Можно пушить и делать автобилд. Другие ветки и мастер это не затронет.
П>>Да я наверное не очень что-то понимаю. Решил я попробовать с ними пожить. Есть у меня либа, я её в проект присунул как сабмодуль. Либа активно развивается вместе с проектом, я особо не заморачиваюсь с ветками мержреквестами и пр, тупо в мастер добавляю изменения, и пушу в ремоут. Да, при обновлении текущая ветка не меняется, если я уже сделал чекаут, тут я соврал, но в новое место когда клонируешь, надо чекаут на ветку сделать, я пару раз накололся.
AD>Не понял...
Хм, а что именно я непонятно изложил? Попробую попонятнее, только я пока не пойму, что тебе не понятно
П>>Состояние не менять — в том плане, что у меня выбрана ветка мастер, и я хочу иметь там самые последние изменения. Ну то есть да, HEAD будет двигаться.
AD>Так не получится, двигать надо вручную. А что если захочешь собрать старую версию, а она тебе вычекнет несовместимый новый сабмодуль?
А, кажись я понял. Я после git pull репы делаю
AD>>>Ну ладно, не важно. Сабмодули всегда ставятся на конкретный коммит, как раз чтобы не менять состояния, поэтому они всегда вычекиваются в detached head.
П>>Вот тут не очень понятно, а на какой коммит они ставятся? В .gitmodules вроде нет по дефолту информации о коммите, значит, гит сам выбирает какой коммит мне подсунуть? Самый последний?
AD>Нет, который был последним закомичен в этой ветке.
В какой ветке?
AD>Представь, что сабмодуль — это софтлинк, который ссылается на конкретное имя mysuperlib-0.0.3. В разных ветках, в разных коммитах эта ссылка может быть разной. Она автомагически не будет меняться на другие имена.
AD>Чтобы обновить версию сабмодуля в ветке, ты идешь в сабмодуль, вычекиваешь нужную версию (можно и мастер, не важно, азпоминаться бущет именно коммит). Потом идешь обратно в главный реп, делаешь git add submodule-path, git commit. Всё, теперь в твоей ветке новая версия. Мержишь свою ветку в мастер главного репа, и оппа, теперь в мастере новая версия.
А, вот так чутка попонятнее стало, спасибо
П>>>Да я наверное не очень что-то понимаю. Решил я попробовать с ними пожить. Есть у меня либа, я её в проект присунул как сабмодуль. Либа активно развивается вместе с проектом, я особо не заморачиваюсь с ветками мержреквестами и пр, тупо в мастер добавляю изменения, и пушу в ремоут. Да, при обновлении текущая ветка не меняется, если я уже сделал чекаут, тут я соврал, но в новое место когда клонируешь, надо чекаут на ветку сделать, я пару раз накололся.
AD>>Не понял...
П>Хм, а что именно я непонятно изложил? Попробую попонятнее, только я пока не пойму, что тебе не понятно
Да не понятно, кто на ком стоял. В чей мастер пушатся изменения и чья текущая ветка не меняется.
П>А, кажись я понял. Я после git pull репы делаю
П>
Ага, это тебе вычекнет последний "мастер" твоего сабмодуля (merge тут лишний). Но это будет локально у тебя, мастере твоего главного проекта хер знает что вычекнется если ты периодически не обновляешь ссылку на сабмодуль.
То есть, нормальные люди для нормального чекаута будут делать git submodule update --init и получат фигу.
По сути у тебя нет нормальной истории, потому как нет связей между главным репом и сабмодулем.
П>>>Вот тут не очень понятно, а на какой коммит они ставятся? В .gitmodules вроде нет по дефолту информации о коммите, значит, гит сам выбирает какой коммит мне подсунуть? Самый последний?
AD>>Нет, который был последним закомичен в этой ветке.
П>В какой ветке?
В ветке главного проекта, в любой (мастер — это тоже ветка).
AD>Нет, который был последним закомичен в этой ветке.
Как модифицируется это поведение в зависимости от того, указана ли опция submodule.<name>.branch ?
Из https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt
почему в ситуации из коммента по ссылке ниже получен detached state ?
https://www.reddit.com/r/git/comments/1bjma8/comment/c97lu08/
П>>>Вот тут не очень понятно, а на какой коммит они ставятся? В .gitmodules вроде нет по дефолту информации о коммите, значит, гит сам выбирает какой коммит мне подсунуть? Самый последний?
AD>>Нет, который был последним закомичен в этой ветке.
M>Как модифицируется это поведение в зависимости от того, указана ли опция submodule.<name>.branch ?
Да никак. Она позволяет тебе сделать git submodule update --remote, которая тянет и вычекивает с ремоута ветку submodule.<name>.branch. Это просто для удобства, сути дела не меняет.
То есть, это облегчает обновление на последний master/develop/trunk сабмодуля. Но потом тебе все равно надо сделать git add и git commit в главном репе, чтобы актуализировать новый коммит сабмодуля. И в следующий раз, когда сделаешь git submodule update, всё равно получишь detached head.
M>Из https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt
M>
M>почему в ситуации из коммента по ссылке ниже получен detached state ?
M>https://www.reddit.com/r/git/comments/1bjma8/comment/c97lu08/
Потому что вычекивается всегда конкретный коммит.
M>почему в ситуации из коммента по ссылке ниже получен detached state ?
M>https://www.reddit.com/r/git/comments/1bjma8/comment/c97lu08/
вот здесь чел все хорошо расписал:
https://stackoverflow.com/questions/54962711/specify-branch-for-a-git-submodule
П>Здравствуйте, andrey.desman, Вы писали:
П>>>А можно как-то сделать, чтобы сабмодуль сам устанавливался например в мастер (или на другую какую-то ветку) и при всех обновлениях не менял состояния? А то задолбало, постоянно на оторванную башку натыкаюсь
AD>>Взаимоисключающие параграфы. Как это стоять на мастере и не менять состояния?
П>Да я наверное не очень что-то понимаю. Решил я попробовать с ними пожить. Есть у меня либа, я её в проект присунул как сабмодуль. Либа активно развивается вместе с проектом, я особо не заморачиваюсь с ветками мержреквестами и пр, тупо в мастер добавляю изменения, и пушу в ремоут. Да, при обновлении текущая ветка не меняется, если я уже сделал чекаут, тут я соврал, но в новое место когда клонируешь, надо чекаут на ветку сделать, я пару раз накололся.
Я в подобном случае подключал свою либу как nuget пакет. Мне кажется, что использование средств доставки кода, куда удобней чем использование субмодулей.
Q>Я в подобном случае подключал свою либу как nuget пакет. Мне кажется, что использование средств доставки кода, куда удобней чем использование субмодулей.
nuget вроде чисто виндовое, нет?
Кстати, оказалась, что сабмодули — токсичная штука, прописываетс яв репе, и хрен её оттуда потом выковыряешь.
В интернетах кучи разных рецептов, как правильно их удалять, хз, какому довериться