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

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

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, закомитили, запушили в удаленный репозиторий. Вернулись в корень главного репозитория и сохранили ссылку на последнюю ревизию сабмодуля, и запушили.

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

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