💡 Идея: Упрощаем жизнь с гитом, или изобретаем колесо?

 Публичный пост

Так повелось, что знакомство с гитом у меня началось с Sourcetree, а в последние годы я пересел на Sublime Merge, так что в батле я за графическую оболочку — привык к визуализации.

Но мне очень не хватает возможности добавить свою кнопку. Конечно, руки чесались написать что-то своё, но вот в тот же Sublime Merge вложено столько сил, что сколько времени мне придётся потратить, чтобы получить продукт схожего качества, пусть и с ограниченным под себя функционалом?

В SM есть возможность запуска своей команды, но только через поиск по имени, что, в общем-то, то же самое, что и в терминале — дольше, чем нажать на кнопку.

И тут я наткнулся в настройках на пункт Git Binary, куда можно передать любой бинарник. Так у меня родилась идея написать обёртку над гитом, которая, в дополнение к командам, передаваемым из SM, будет ещё и мои хотелки исполнять.

Работает это просто: консольное приложение получает все аргументы, которые переданы гиту. Парсим, делаем наши дела и вызываем уже гит с оригинальной командой.

Вот список фичей, которые у меня за несколько лет сформировались:

  1. Кнопка fetch, если вызвана на мастере, должна удалять локальные ветки, которые уже были замержены в мастер. Но есть исключение — если в ветке есть коммит, который не был запушен по забывчивости, — хорошо узнать об этом после мержа.
  2. Я работаю над разными платформами, и мне нравится указывать её в сообщении коммита, например, "[iOS] feature". Но каждый раз писать этот тег утомляет, тем более что в случае нашей монорепы определить его очень просто — по имени папки, в которой лежат изменённые файлы. Пишу только "feature", а тег добавляется автоматически. Эта же фича проверяет, нет ли в чекауте по ошибке изменений с другой платформы - тег должен быть один для всех файлов.
  3. Когда я только начинаю работать над фичей в новой ветке, люблю перед пушем сделать rebase master вместо мержа, чтобы не было лишних коммитов. Но нужно сначала перейти в мастер, сделать пулл и вернуться в текущую ветку. Всё это выполняется автоматически перед rebase master.
  4. Если PR для фичи уже прошёл ревью, делать rebase некрасиво — сломается обычный pull у других разработчиков. Но перед мержем мастера автоматически подтянем его изменения.
  5. Специфично для iOS-разработки. У нас есть файл swiftpm/Package.resolved, содержащий финальные версии пакетов. При смене ветки Xcode часто изменяет этот файл не по делу — считает версию до чекаута верной и откатывает пакеты до неё. Очень раздражает, когда переключаешься на ветку, идёшь дальше по своим делам, а этот файл изменён, и чекаут невозможен. Делаю ему git reset перед каждой операцией, где он может помешать. Когда нужно его запушить, эта логика не помешает.

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

Есть идея сделать для этого какой-нибудь интерфейс — фильтр команды, список действий перед её исполнением, список после. Чтобы всё можно было настроить под себя, зная гитовые команды, без необходимости программировать, или использовать готовые шаблоны. Что-то вроде того, как устроены Workflow в Alfred.

Не могу отделаться от мысли, что изобретаю колесо — то ли похожее решение уже существует, то ли все более сложные вещи всё же делают через консоль?

Связанные посты
23 комментария 👇
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
  1. git fetch --prune - удалит все локальные ветки, которых нету в ремоуте. Замердженная ветка в обычном флоу удаляется.

  2. Можно сделать или хуком или еще как-то. Логика звучит слишком кастомной для проекта. "Проверь файлы из коммита и скажи, что они относятся к одному набору relative путей и в зависимости от подставь свой commit.template". Причем основной проблемой будет написать правило, какие пути относятся к какой платформе - это в любом случае придется руками делать.

  3. git fetch <remote> <sourceBranch>:<destinationBranch> позволит загрузить другую ветку без ее выкачки. Дальше просто ребейзишься.

  4. Я не понял у тебя несколько человек продолжают работать в ветке над фичей, после того как пуллреквест апрувнули? Им в любом случае или придется ребейзить ветку или отводить ее заново и продолжать работать в неотребейженной версии, просто отложив проблему, или можно мерджиться локально сделав локальный ребейз. В целом звучит как странное использование пулл реквестов - с закрытием пулл реквеста должна закрываться ветка.

Выглядит так, что правильным решением в твоих условиях будет: есть main (куда хотим замерджится) и есть devfeature (ветка разработки фичи, над которой работают несколько человек). Если необходимо залить кусок изменений из devfeature в main без полного мерджа, то необходимо отвести от devfeature ветку devfeature_to_be_merged и отправлять на pr уже ее. Тогда ее можно будет свободно ребейзить и не мешать другим. Но возможно это сделает будущий окончательный ребейз devfeature очень больным.

  1. Забить алиас safeswitch=!git checkout -- "swiftpm/Package.resolved && git switch", но в целом это проблема не гита, а xcode. Я не настоящий сварщик, но правильно же, что это служебный файл "я выкачал такие-то пакеты пакадж менеджером", а не "у проекта зависимости таких-то версий". Если это так, то почему бы не пихнуть его в .gitignore и дело с концом?
  Развернуть 1 комментарий

В целом очень многое из твоих кейсов решается написанием алиаса на несколько команд

  Развернуть 1 комментарий

@redwan_fox, 2 - Согласен, что сделать универсальное решение будет сложно.

4 - Возможно, я что-то не совсем чётко описал. У меня схема такая: после создания пул-реквеста, в него могут замержить мастер (кнопкой на GitHub или вручную), либо просто добавить изменения. В этом случае некорректно ребейзить ветку относительно мастера, как я привык делать до создания PR, тут нужен именно мерж - иначе пулл зафейлится. Понятно, что если кто-то запушил, а у тебя есть локальный коммит, то сделаешь локальный ребейз.

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

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

  Развернуть 1 комментарий

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

У всех разные графические интерфейсы гита. У нас на проекте их минимум 4 штуки используется (git extensions, visual studio, rider, sublime merge), может больше. Ты или делаешь что-то, что будет еще одним вариантом или вставляешь кнопку в уже существующие. Ты написал в посте, что подменяешь бинарь гита, делая враппер вокруг него. Но как показывает практика большинство из этого можно сделать без такого враппера стандартными инструментами и потом все равно надо вставлять куда-то кнопку. Встает вопрос "зачем тогда обертка?" *

Если ты с помощью обертки захочешь поменять поведение стандартных команд гита, чтобы использовать существующие кнопки Sublime Merge, тебя ждет неприятный сюрприз в виде взрыва при попытке что-то закоммитить в другой проект через SM (бинарь-то там один выбирается на все приложение, если я правильно понимаю).

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

  • При этом как упражнение такая обертка хорошо и круто. позволяет глубже разобраться в гите. Посмотри еще в сторону smudge и clean фильтров. Там можно всякое красивое делать.
  Развернуть 1 комментарий

Если ты с помощью обертки захочешь поменять поведение стандартных команд гита, чтобы использовать существующие кнопки Sublime Merge, тебя ждет неприятный сюрприз в виде взрыва при попытке что-то закоммитить в другой проект через SM (бинарь-то там один выбирается на все приложение, если я правильно понимаю).

У меня это решается тем, что вся эта логика работает только для одного рабочего проекта 😀 в других случаях обертка просто выполняет команду, без дополнительной логики

Понимаю, что может выглядеть как много работы для сомнительного результата, но когда все корнер кейсы проработал сижу и кайфую от того, как оно выполняет все, чего я хочу, за одно нажатие ☺️

Посмотри еще в сторону smudge и clean фильтров. Там можно всякое красивое делать.

Спасибо, ознакомлюсь!

  Развернуть 1 комментарий

А я чет купил "вилку" после "Сорстри" и вроде как всего хватает...

  Развернуть 1 комментарий

@Creating_bugs, не слышал, выглядит неплохо, хороший маковский стиль!

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

В настройках нашел custom commands, но, похоже, работают они так же, как в Source Tree - поиском текстом в Quick Launch, как добавить свою кнопку в интерфейс не разобрался.

  Развернуть 1 комментарий
Anton Lebedevich Data Engineer | Machine Learning Engineer | AB-testing 30 сентября в 18:07

в пункте 3 не надо переходить в мастер, делаешь git fetch, потом git rebase origin/master и он делает rebase сразу на remote branch

  Развернуть 1 комментарий

@mabrek, согласен, но это все еще два действия вместо одного, плюс локальный мастер останется не обновленным - иконка с количеством новых комитов будет отвлекать 😄

  Развернуть 1 комментарий

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

Все же два-три действия это не заменить какой-то сложный бизнес флоу.
Но получится снести с него ответственность и понимание что он делает.

Если разработчик хочет автоматизации, он сам себе может алиас сделать, типа move_commit_to branch.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

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

Вот в каком еще клиенте можно такое сделать за одну секунду?

  1. Ты сидишь пилишь таску в ветке feature/jira-123
  2. Приходят и говорят, надо релизную на прод
  3. Берешь мышкой и тащишь production на hotfix/12.3.4
  4. Нажимаешь пуш production

И дальше работаешь в своей ветке.

Никаких тебе стешей, шелвов, чекаутов и прочей херни. Где ещё такое можно сделать?

Я знаю только SmartGit, поэтому и рекомендую.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

@StipJey, у нас в Гитхаб заходишь в аctions и нажимаешь "release prod", ставишь тэг и все.

  Развернуть 1 комментарий

@fatboa, ого, прямо любую ветку можно?

  Развернуть 1 комментарий

@StipJey, @StipJey, да выбираешь ветку и с нее можно задеплоить на QA или на PROD если сильно надо. К если тэг типа v1.2.3 не навешан, то можно имя образа указать (его можно создать сбилдив ветку). Обычно они билдятся автоматом когда делаем PR.

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб