Git Submodule. Использовать или не использовать.

Написана 2 Августа, 2013 в 15:34. Автор: borN_free   |   Теги: git, submodule, vcs Комментарии 1

Git

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









Для начала, прочитайте почему не стоит использовать сабмодули:

Если вы все-таки решились, тогда приступим.

Идея простая - вместо обычной папки с картинками и стилями, мы подключаем сабмодуль - отдельний Git репозиторий.

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

Пусть необходимые стили должны лежать в папке /web/assets. В корне репозитория делаем

  • git submodule add git@bitbucket.org:blablabla/tra-tata.git web/assets

Инициализируем и клонируем:

  • git submodule init
  • git submodule update

Отлично, все хорошо. Но только если у вас до этого не было папки web/assets, где лежали ваши стили и картинки. А скорее всего она была :). Итак, проблема номер 1 уже есть. Решение в конце статьи тут, дублировать здесь нет смысла.

Ну, допустим вы все-таки подключили сабмодуль. Теперь нам надо переключиться на другую ветку, в которой естественно пока этих обновлений нет, а папка web/assets есть. И тут проблема номер 2. Git вам сообщит о том, что все файлы в web/assets будут перезаписаны. Решение опять таки тут.

Хорошо, в нашей ветке пробуем делать git submodule init, git submodule update. Проблема номер 3 - вообще отказывается работать. Проверено несколько раз на нескольких репозиториях у нескольких людей. Помогает только полное удаление репозитория, и работа с ним заново (переклонировать). Данные вы, конечно, никакие не потеряете, если предварительно все закомитите и запушите в удаленный репозиторий.

Теперь время закомитить наш сабмодуль, чтобы его использовали другие. Комитим. Пушим.

Ваш коллега удачно обновляется в надежде сделать инициализацию и клонирование сабмодуля, но.. Проблема номер 4, такая же как и 3. В одной ветке все проходит удачно, в других - пустой ответ всех команд git submodule *. Решение абсолютно такое же, заново клонируем исходный основной репозиторий.

Теперь несколько случаев, с которыми придется столкнуться во время разработки, и детальные команды для их выполнения.

Как забрать все изменения из удаленного главного репозитория и обновить рабочую копию?

  • git pull
  • git submodule update

Как забрать все изменения из сабмодуля и сохранить состояние главного репозитория?

  • мы в корне главного репозитория
  • cd web/assets
  • git fetch
  • git checkout master
  • git merge origin/master
  • cd ../..
  • git add .
  • git commit -m "updated submodule (or smth else)"
  • git push origin develop

Так, и только так. Что тут произошло? Мы перешли в сабмодуль, сделали fetch, вмерджили все новые изменения, что сделал верстальщик, в мастер себе, вернулись в корень главного репозитория, сохранили ссылку на последнюю ревизию сабмодуля, и запушили. Это очень важный момент. В главном репозитории надо всегда сохранять ссылку на ревизию сабмодуля, иначе будет беда.

Как сделать изменения разработчику в CSS и запушить в сабмодуле в его репозиторий?

  • мы в корне главного репозитория
  • cd web/assets
  • git checkout master # (!) вы обязаны сделать этот шаг, иначе беда номер 2
  • ... ваши изменения ...
  • git add .
  • git commit -m "%message%"
  • git push origin master
  • cd ../..
  • git add .
  • git commit -m "added changes to submodule"
  • git push origin develop

Что тут произошло? Мы перешли в сабмодуль, переключились на master. Сделали правки в CSS, закомитили, запушили в удаленный репозиторий. Вернулись в корень главного репозитория и сохранили ссылку на последнюю ревизию сабмодуля, и запушили.

One comment

ответить
August 21, 2017 at 02:58 am

Rolex's Sunday watch is a symbol of replica fake watches unparalleled dignity. The oyster shell waterproof to fake uk a depth of 100 meters, the 36 mm case with 18ct Gold material to build, to represent truly respected status. The unique middle case is made of swiss watches solid metal.

Оставьте свой комментарий:

Поля с * обязательны.