Рабочий процесс Git — изменение ветви и медленная перекомпиляция

#git #scala #branch #recompile #git-worktree

#git #scala #ветка #перекомпилируйте #git-worktree

Вопрос:

Я работаю над большим проектом Scala, где мы используем Git для контроля версий. Мой рабочий процесс заключается в работе над новыми функциями в моей собственной ветке и переключении при необходимости. Различные версии кода находятся в своих собственных ветвях. Все очень стандартно.

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

Проблема в том, что, хотя git мгновенно переключается на другую ветку, как только я там оказываюсь, мне приходится перекомпилировать код. Это занимает несколько минут. Затем исправьте ошибку, переключитесь обратно на мою собственную ветку и выполните другую перекомпиляцию, которая займет еще несколько минут. Кажется, это сводит на нет цель того, чтобы Git был таким быстрым.

Кто-нибудь еще сталкивался с этим? Есть ли способы обойти это. Я уверен, что это не специфичная проблема Scala (хотя Scala невероятно медленно компилируется).

обновление более чем через 3 года

Я использую ответ @djs (git-new-workdir) в течение последних нескольких лет. У меня это сработало очень хорошо. У меня есть главный каталог и несколько других каталогов (например, production, next-release и т.д.), К которым я переключаюсь, когда мне нужно выполнить там работу. Накладных расходов очень мало, и это означает, что вы можете быстро переключиться, скажем, на производство, чтобы что-то протестировать, а затем вернуться к тому, над чем вы работали.

обновление более 7 лет спустя

Похоже, что git-worktree является заменой git-new-workdir. Для использования:

 cd ~/git/my-repo
git worktree add ~/git/my-linked-repo
  

Ответ №1:

Предполагая, что вы не хотите изменять свой процесс сборки (на основе хэша вместо временных меток), вы можете захотеть взглянуть на скрипт git-new-workdir в каталоге contrib исходного кода git. Как и в случае с предложением о клонировании, вы получите несколько рабочих копий, но вместо двух независимых репозиториев вы получите одно с несколькими рабочими копиями. Итак, никаких перемещений между локальными репозиториями.

Это сценарий командной строки, который выполняется только в unix-подобных системах, но концепция может быть воспроизведена в современных версиях Windows.

Комментарии:

1. Я использую это уже несколько дней, и это работает действительно хорошо. Спасибо.

2. Кстати, существует также порт git-new-workdir для Windows: github.com/joero74/git-new-workdir

Ответ №2:

Предполагая, что ваша система сборки не переусердствует с зависимостями (возможно, она думает, что ей нужно перестроить, когда на самом деле это не так), основной способ обойти это — клонировать ваш репозиторий:

 git clone my-repo my-repo2
  

Затем вы можете поработать со своим дополнительным клоном и перейти от него обратно к основному. (Вы должны нажимать только на ветви, которые не проверены, но в этом весь смысл здесь. Вы также могли бы вытащить или даже извлечь и сбросить или разветвлять -f, если хотите.)

И это на самом деле тоже не займет много места; Git жестко связывает объекты в репозитории для локальных клонов, так что дополнительным пространством будет просто дополнительная извлеченная копия.

Комментарии:

1. Есть ли жесткая ссылка и в Windows?

2. @Daniel: Я верю, что они делают, но я никогда не пробовал. Я уверен, что здесь есть ответ или комментарий на какой-то другой вопрос, в котором упоминается это…

Ответ №3:

Вы могли бы попробовать использовать разные целевые каталоги для разных ветвей, переопределив outputDirectoryName. Возможно, выбираем название ветки git и устанавливаем для выходного каталога значение target- <branch> ; хотя это означало бы, что каждая новая ветка начинается с нуля.

Комментарии:

1. Мне очень нравится эта идея. Я попробую это с sbt и intellij idea и посмотрю, подходят ли они.

Ответ №4:

Вы можете значительно сократить время компиляции scala с помощью [sbt] [1] или «быстрого компилятора scala». Оба позволяют сохранить компилятор в памяти, что значительно улучшает время компиляции.

Использование одного каталога на ветку позволяет избежать такого количества перекомпиляций. Но этот рабочий процесс лучше поддерживается mercurial.

Комментарии:

1. На самом деле вам не нужен каталог для каждой ветки. Обычно достаточно двух; один предназначен для вашей основной работы, а другой — для переключения повсюду.

2. Кроме того, даже если вы сможете ускорить компилятор, это все равно может легко стать проблемой в больших проектах, где параллельная сборка с использованием всего процессора на быстродействующей машине все еще занимает несколько минут.

3. @Jefromi: Действительно, да. Я склонен использовать между двумя и n каталогами, где n — количество ветвей.

4. @Jefromi: Что касается компилятора: Опять же, да. Тем не менее, я думаю, что оба пункта моего ответа верны и полезны. И я бы использовал оба одновременно.

5. @jmg: О, полностью — это мой голос. Просто пытаюсь указать, что проблема с несколькими клонами не так уж и страшна, и это определенно хорошая идея, даже если вы делаете и другие вещи, чтобы помочь.