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

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

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

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

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

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

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

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

Похоже, git-worktree - это замена git-new-workdir. Использовать:

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

4 ответа

Решение

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

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

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

git clone my-repo my-repo2

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

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

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

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

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

Другие вопросы по тегам