Intereting Posts
C # Как проверить, обновлен ли git-репозиторий Переименование в Git и Mercurial: точность и автоматичность Смена непреднамеренного изменения перераспределения git как использовать github как облачное общение git grep <regex, содержащий новую строку> Нестационарные изменения сразу после клонирования в Eclipse git: Я объединил мастера в разработку, теперь что? Должны ли файлы mvnw быть добавлены в репозиторий? Параметры форматирования кода общего доступа IntelliJ в репозитории git Тег Git из версии AssemblyInfo Как разработать пакеты PHP в команде с использованием композитора? Git, при переключении ветвей я получаю сообщение об ошибке: «Исключение каталога <dirname>» не удался. Должен ли я повторить попытку? »После того, как я установил значок пользовательской папки Как быстро получить запрос на перенос Когда вы отменяете git rebase с reflog, имеет ли значение, какую фиксацию вы выберете? Как добавить функцию оболочки в git alias с помощью pipe

Управление различными версиями Rails в разных ветвях git с помощью RVM

Я работаю над проектом, который работает на Rails ~> 3.0 на master ветке, и ~> 3.1 на другой ветке.

Очевидно, что этим двум ветвям нужны разные гемзеты.

Вы знаете о удобном способе обработки ситуации с использованием RVM?

Я думал о парах вариантов, ни один из них не был оптимальным:

  • используя gemset s, я бы не забыл вручную переключать gemset после каждого git checkout

  • используя bundle package мне пришлось бы отслеживать каталог vendor/bundle

  • сочетание двух подходов даже не возможно, так как .bundle/config не отслеживается

  • Я мог бы написать git post-checkout hook, но это звучит немного взломанно (жестко обозначенные имена ветвей и все такое)

Есть ли лучший способ, о котором я не могу думать?

Вы можете создать файл .rvmrc внутри каталога проекта и добавить его в репозиторий git. Для одного ветви файл .rvmrc будет содержать строку типа

 rvm 1.9.3-head@rails30 --create 

для другой ветви она будет содержать

 rvm 1.9.3-head@rails31 --create 

Таким образом, вы получите два набора драгоценных камней (rails30 и rails31). Также не забудьте активировать автоматическое выполнение файлов .rvmrc в вашем {home} /. Rvmrc (необходимо для последней версии rvm, см. Документацию rvm).

Вам больше не придется это делать, когда вы переходите в каталог проекта. RVM 1.8.1 по умолчанию был повторно включен. (Я добавил документацию, относящуюся к этому сайту, и к заметкам rvm)

Однако, поскольку это изменение в каталоге rvmrc, а изменение в .rvmrc не подхвачено, вы можете заставить его выполнить «перезагрузку rvm». Изменение должно быть подобрано, но если его не повторить, перезагрузите.

Пожалуйста, разместите любые вопросы, которые у вас есть после этого, https://github.com/wayneeseguin/rvm/issues.

Спасибо,

Deryl R. Doucette

ПРИМЕЧАНИЕ. После разговора с Уэйном он передал мне через IRC, что он порекомендует вам что-то сделать в соответствии с этим в вашем .bash_profile, чтобы помочь вам в том, что вы хотите:

  git() { command git "$@" ; [[ -s .rvmrc ]] && . .rvmrc ; } 

Кроме того, вы понимаете, что RVM не работает как демон в какой-либо форме или форме. Итак, что вы хотите, чтобы RVM выполнял большинство, не будет добавлен в RVM. Как сказал Уэйн, это было бы забавным способом пообщаться с чьей-то головой! 🙂

Подумайте об этом так. Хотя это, по общему признанию, надуманное, действие остается тем же. Что делать, если кто-то изменяет rvmrc под вами, пока вы находитесь в середине чего-то (другой дев, работающий в директории и не знаю, что вы есть), или какой-то изгоев Beastie взломал вашу систему и изменил ваш rvmrc на вас, думая, что он может получить некоторые дополнительные привилегии каким-то образом, сделав это. (Это может быть в управляемом группой проекте проекте, где он получает доступ через учетную запись другого пользователя, показывает, что вы находитесь в той же группе, меняет rvmrc под вас на другой ruby ​​+ gemset, который ему удалось настроить с помощью групповых разрешений группа RVM в многопользовательской установке и вызывает выполнение некоторой произвольной команды. Представьте себе, что вы находитесь , скажем, в группе колес, и вы только что закончили выполнение некоторой команды для root, а таймаут еще не завершен для авторизации Поскольку rvmrc действительно не что иное, как сценарий bash, это далеко не фантазия. Поэтому, в конце концов, это делает ОЧЕНЬ опасную среду, не говоря уже о чрезвычайно сложной ситуации для контроля и контроля.

В итоге я использовал следующий скрипт git post-checkout . В master ветке я использовал драгоценные камни, установленные в $GEM_HOME . В других филиалах камни были установлены локально для vendor/cache .

 #!/usr/bin/env bash #set -x git_rev() { ref=$(git symbolic-ref HEAD 2>/dev/null) || return echo ${ref#refs/heads/} } ref=$(git_rev) case $ref in master) echo "removing .bundle/config" mv .bundle/config .bundle/config.no ;; *) if [ -f .bundle/config.no ] ; then echo "using vendor/cache" mv .bundle/config.no .bundle/config fi ;; esac 

Чтобы следить за ответом морглера, если вы проверили свой .rvmrc в своем проекте git, вы можете использовать git-завершение, чтобы добавить имя ветки git в имя grmset .rvmrc, чтобы автоматизировать создание набора gemset для каждой ветви, например:

 PROJECT_NAME="my_app" RUBY_VERSION="ruby-1.9.2-p290" GEMSET_NAME="${PROJECT_NAME}" # if you have bash completion setup the way I do, you get a gemset for each git branch if [ -f /usr/local/etc/bash_completion.d/git-completion.bash ]; then . /usr/local/etc/bash_completion.d/git-completion.bash; GEMSET_NAME="${PROJECT_NAME}-$(__git_ps1 '%s')"; fi rvm --create "${RUBY_VERSION}@${GEMSET_NAME}" 

(Примечание: вам, вероятно, придется это изменить. Это работает для меня в OS X, но я уже использовал git для моей подсказки терминала ).

Затем cd в каталог, и если вы сделаете список gemset rvm, вы увидите, что для этой ветви git был создан gemset. Единственная икота заключается в том, что после создания новой ветви git вам нужно будет вывести cd из каталога, чтобы узнать, как создать gemset в gr.mv (например, rvmrc – тот же файл, он будет вести себя иначе).

Это не идеальное решение, и все участники проекта должны быть на борту. Если вы поместите .rvmrc в один проект, вы должны использовать его для всех из них, иначе просто cd'ing в каталог, рубиновая версия и gemset могут измениться, а затем, если вы вернетесь к другому проекту, t есть .rvmrc, вы можете не заметить, что он изменился и у вас проблемы.

Редактировать: Михал Папис отметил, что:

возможным решением для этого было бы использовать .versions.conf, представленный здесь: https://gist.github.com/1912050#gistcomment-86575 – должно быть легко установить флаг -> ruby-gemset-git-branch который добавит ветку к имени gemset, если другой, чем главный

Используйте rbenv вместо RVM. Тогда вы будете управлять своими драгоценными камнями, используя Bundler.

Измените свой Gemfile так, чтобы одна ветка была для Rails 3, а другая для Rails 3.1.

Затем запустите bundle exec rails server при запуске WEBrick, и bundler будет использовать версию Rails, в которой вы нуждаетесь. Хранит вещи СУХОЙ;)

Прочтите мое короткое введение, чтобы начать работу с rbenv .