Dmitry
Борис не может проверить, что его API корректно работает? Единственное, где я вижу try to fix - это когда CI ломается(и то есть решения, чтобы не пушить для проверки). Если такое нужно для функциональности - возможно у вас что-то не то с тестированием.
Андрей
А как бы это было с мультирепами? Борис бы не пушил коммиты "try to fix error", а амендил бы последний коммит, или что?
Нет, он так же бы пушил эти коммиты. Просто после этого ему ничего бы не мешало их заамендить. А в монорепе он не может это сделать, потому что работает в общей ветке. Ну, либо опять ребейзы.
Lama
Чем сложны ребейзы? Это ультра-простая тема, а особенно когда ты знаешь что ветки не конфликтуют (а тут разные компоненты, конфликтов нет)
Андрей
Они не сложны. Они являются лишним шагом.
Lama
Коммиты можно аммендить и старые
Андрей
Коммиты можно аммендить и старые
Не когда ты работаешь в одной ветке с другим человеком.
Lama
Они не сложны. Они являются лишним шагом.
В мультирепах всё работает точно так же. Только вместо git rebase feature_for_component1 ты делаешь cd component1 git co feature git pull
Андрей
Которая не требует вообще никаких операций в своей директории.
Андрей
Чем она простая-то?
Тем, что, например, не требует стейджить свои изменения перед ребейзом.
Андрей
Ну, для чекаута с пуллом тебе хотя бы думать вообще не надо, что ты делаешь.
Андрей
И при этом непонятно, что делать, в случае, когда фикс не удался.
Lama
Ну, для чекаута с пуллом тебе хотя бы думать вообще не надо, что ты делаешь.
Сомнительный поинт. Для git stash и git rebase я тоже не особо думаю
Lama
И при этом непонятно, что делать, в случае, когда фикс не удался.
Когда ты ребейзнул плохой код? Подождать пока в ветке появится новый код и снова ребейзнуть, лол)
Андрей
Когда ты ребейзнул плохой код? Подождать пока в ветке появится новый код и снова ребейзнуть, лол)
Ага. И ребейзить надо уже с опциями, если не хочешь, чтобы гит тебя не попросил зарезолвить конфликт. Лично я их не всегда помню.
Андрей
К тому же, у разных людей разный уровень.
Андрей
Кому-то и ребейз сложно.
Lama
Ага. И ребейзить надо уже с опциями, если не хочешь, чтобы гит тебя не попросил зарезолвить конфликт. Лично я их не всегда помню.
Какой конфликт? Тут же нет конфликтов, потому что ты пилишь один компонент, а ребейзишь из другого
Андрей
Какой конфликт? Тут же нет конфликтов, потому что ты пилишь один компонент, а ребейзишь из другого
Ага. Только у тебя два коммита, которые меняют потенциально одно и тоже — от Бориса.
Андрей
Первый фикс и второй.
Андрей
Так они же последовательные. Первый и второй
А, т.е. ты пошёл по пути, где у нас просто куча мусорных коммитов "try to fix 1" и "try to fix 2"?
Lama
Если Борис амендит и форспушит фиксы, ему нужно просто обоссать ебло рассказать что так делать неправильно, как минимум потому что это ломает всех кто он него бранчуется или его чекаутит (даже чтобы просто код прочитать)
Lama
Так ветка-то чисто его.
Не-не-не. Аменды это крайний случай, когда нужно именно исправить историю коммитов. Типа, удалить юзернейм, или удалить секреты, удалить большие блобы Аменды для фиксов это ебола
Lama
И та фича, которая делается межкомпонента это точно не его ветка
Андрей
И та фича, которая делается межкомпонента это точно не его ветка
Так в этом и весь поинт, что эта ветка становится неизбежно общей, если у нас монорепа.
Андрей
Зачем амендить для фиксов, расскажи?
Чтобы запушить один коммит с фиксом вместо десятка попыток, например.
Dmitry
Зачем амендить для фиксов, расскажи?
Потому что Борис у Андрея не способен сделать сразу фикс нормальный и будет делать try to fix bug X first attemp try to fix bug X second attemp try to fix bug X third attemp try to fix bug X fourth attemp
Lama
Чтобы запушить один коммит с фиксом вместо десятка попыток, например.
Что плохого в том, что несколько коммитов? Я сразу скажу — совершенно ничего, всем насрать. Коммиты нужны чтобы отслеживать историю измнений. Их полезно сохранять чтобы знать что вообще было испробовано как кандидат для кода Тут проблема гораздо глубже — кто-то не умеет локально запускать тесты из CI. И кто-то амендит коммиты с фиксами
Dmitry
Зачем амендить для фиксов, расскажи?
И захочет потом 3 опечатки свои заребейзить в один коммит.
Lama
И захочет потом 3 опечатки свои заребейзить в один коммит.
А что плохого в нескольких коммитах-то?
Dmitry
А что плохого в нескольких коммитах-то?
В том что большинство производят кучу муссорных коммитов по которым бесполезно хоть что-то востанавливать
Lama
Даже если каждую строчку изменить 10 раз, код всего линукса будет весить примерно 3гб. При всём этом, гит умеет сжимать репозитории в локальных копиях
Андрей
Окей, сквошьте коммиты при мердже/ребейзе в транк. Амендить-то зачем?
А тут мы упираемся в конфликты, если кто-то отпочковался от твоей ветки по пути.
Lama
Андрей
Потому что Борис у Андрея не способен сделать сразу фикс нормальный и будет делать try to fix bug X first attemp try to fix bug X second attemp try to fix bug X third attemp try to fix bug X fourth attemp
Тут дело не в том, что Борис не способен. Просто такой процесс в некоторых кейсах бывает эффективнее.
Dmitry
А что плохого в нескольких коммитах-то?
Если у тебя 20 коммитов будут такими: fix test fix typo fix blabla Ты потом ни в жизни не разберёшь - откуда пришёл баг, всякими bisect-ами не воспользуешься. Но ты всё правильно сказал, Борис - не умеющий протестировать свой фикс - ещё более глубокая проблема.
Андрей
Dmitry
По сути мультирепа - это защита от ленивости и криворукости Борисов. В этом получается смысл.
Lama
Не понял, о чём ты.
Никто же не будет бранчеваться от ветки, которая в разработке
Максим
Хз насчёт ребейза, но вот размеры монореп (обычно весьма немаленькие) приводят к появлению ряда проблем, которых нет в мультирепах или они стоят менее остро. 1. Клонирование жирных монореп может занимать годы. Из-за этого приходится изобретать в CI флаги с разными способами клонирования, чтобы они занимали хоть какое-то разумное время. 2. Нужно придумывать разный набор тестов, который запускается на MR и перед релизом, потому что каждый раз запускать все тесты становится очень накладно. 3. Да и в целом становится сложнее отследить изменения в CI, все эти only: и changed: обычно рассчитаны на изменения только в одном последнем коммите, а если их несколько, то приходится изобретать велосипеды, определяющие правки в твоей текущей ветке относительно основной. И эти велосипеды ещё нужно делать устойчивыми к постоянным ребейзам. 4. В сложной структуре банально сложнее разбираться, дольше вкатываются новички, сложнее запускать часть проекта, если он понадобился отдельно от всего остального. Например, для тестов одного сервиса нужно поднять не мок, а другой сервис, а его сломали в недавнем MR, и вместо основной задачи копаешься с этим багом Не то, чтобы это было специфично только для монорепы, и для отдельных тоже бывает актуально, но как-то заметно реже
Андрей
Никто же не будет бранчеваться от ветки, которая в разработке
А если она условно готовая, но потом в неё вносятся дополнительные изменения?
Lama
Хз насчёт ребейза, но вот размеры монореп (обычно весьма немаленькие) приводят к появлению ряда проблем, которых нет в мультирепах или они стоят менее остро. 1. Клонирование жирных монореп может занимать годы. Из-за этого приходится изобретать в CI флаги с разными способами клонирования, чтобы они занимали хоть какое-то разумное время. 2. Нужно придумывать разный набор тестов, который запускается на MR и перед релизом, потому что каждый раз запускать все тесты становится очень накладно. 3. Да и в целом становится сложнее отследить изменения в CI, все эти only: и changed: обычно рассчитаны на изменения только в одном последнем коммите, а если их несколько, то приходится изобретать велосипеды, определяющие правки в твоей текущей ветке относительно основной. И эти велосипеды ещё нужно делать устойчивыми к постоянным ребейзам. 4. В сложной структуре банально сложнее разбираться, дольше вкатываются новички, сложнее запускать часть проекта, если он понадобился отдельно от всего остального. Например, для тестов одного сервиса нужно поднять не мок, а другой сервис, а его сломали в недавнем MR, и вместо основной задачи копаешься с этим багом Не то, чтобы это было специфично только для монорепы, и для отдельных тоже бывает актуально, но как-то заметно реже
1. Сабрепы, все ими пользуются 2. Конкретно эта проблема с CI присутствует в мультирепах точно так же 3. Согласен, я об этом и писал. Тут помогает качественное кэширование и хэширование (хех) 4. Сложность проекта никак не связана с тем, мультирепа это или монорепа. Это как говорить что микросервисы это всегда низкая связность, а монолит это всегда высокая связность компонентов
Lama
Окей, ребейзи и оставляй оригинал)
Или не ребейзи, а просто мерджи, лол. Если там и правда сквошнутый коммит, то конфлитов там не будет
Dmitry
Обоснуй, чем этот подход плох?
Мультирепа объективно упрощает внесение мультикомпонентных изменений. А проблемы, которые ты описываешь решаются простыми договорённостями и культурой разработки.
Lama
Будет. Ты же на мёрже сквошишь.
Как он будет если оригинал и новая версия не конфликтуют?
Dmitry
Ты вообще ничего не написал про этот кейс сейчас, ты это понимаешь?)
Тебе нужно изменить в компоненте X, Y, С сделать связное изменение. Если оно у тебя раскидано по репам X, Y, C - у тебя будет 3 ветки в 3 разных репозиториях, которые нужно синхронизировать - вместе тестировать. В случае монорепы - у тебя будет одна ветка, где можно сразу всё протестировать и разово замёрджить.
Андрей
Как он будет если оригинал и новая версия не конфликтуют?
С чего они не конфликтуют? Ты сделал ветку, добавил в неё коммит A. Потом кто-то от неё отпочковался и добавил коммит B. Потом ты в первую ветку добавил коммит C. Ты смёржил (со сквошем) ветку с A и C. Теперь тебе надо решать конфликты в ветке с B.
Андрей
Тебе нужно изменить в компоненте X, Y, С сделать связное изменение. Если оно у тебя раскидано по репам X, Y, C - у тебя будет 3 ветки в 3 разных репозиториях, которые нужно синхронизировать - вместе тестировать. В случае монорепы - у тебя будет одна ветка, где можно сразу всё протестировать и разово замёрджить.
Я разобрал отдельный кейс, где монорепа неудобна. Ты только написал про то, что Борис просто ленивый, ничего не написав, почему это плохо. Конкретно этот способ иногда позволяет закрыть проблему куда быстрее.
Lama
Я вообще не понимаю чем так конфликты не нравятся. Это хорошо что нужно их решать, это хорошо что они вообще есть Если бы их не было, то было бы ультрадушно, пришлось бы сидеть и сверять версии в мультирепах
Андрей
Если коммит B конфликтует с A или C, то нужно. Если нет, то в случае с мерджем не нужно
Конфликт B не конфликтует ни с A, ни с C. Но вот у B родителем является A, который засквошился с C (допустим, получился коммит D). Теперь тебе надо, чтобы у B родителем стал D. И D конфликтует с A, этот конфликт тебе надо пофиксить.
Андрей
Я вообще не отрицал, что у мультиреп есть свои недостатки.
Андрей
Вы просто начали тут доказывать, что у монореп их нет, и они вообще всё проще делают.
Андрей
Не важно, есть там мёрж коммит, или нет. Всё равно там будут разные коммиты, которые изменяют один код.
Lama
Вы просто начали тут доказывать, что у монореп их нет, и они вообще всё проще делают.
У монореп есть недостатки, но это лишь подмножество недостатков мультиреп
Lama
Единственная проблема, которая может быть с монорепами, это более душное кэширование в CI Та проблема, которую описываешь ты, связана не с монорепами, а с тем что кто кто-то амендит коммиты при разработке
Андрей
Как скажешь.
Dmitry
Я разобрал отдельный кейс, где монорепа неудобна. Ты только написал про то, что Борис просто ленивый, ничего не написав, почему это плохо. Конкретно этот способ иногда позволяет закрыть проблему куда быстрее.
Разве? В случае с монорепой - ты сделал клон и запускаешь бранч Бориса отдельно как и с мультирепой без ребейзов. А вот сделать мёрдж мультиизменений трансакционный с мультирепой не сделаешь.
Lama
То что с мультирепами можно амендить код не значит совершенно ничего, потому что аменд это крайний случай