#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: О, полностью — это мой голос. Просто пытаюсь указать, что проблема с несколькими клонами не так уж и страшна, и это определенно хорошая идея, даже если вы делаете и другие вещи, чтобы помочь.