Настройка Git для Битрикс
В битрикс большинство страниц хранятся как физические файлы на сервере - это дает нам возможность отслеживать их через гит.
Кроме страниц, хочется в гит иметь шаблон и папку php_interface
. Они могут храниться в папках bitrix
и local
. Если всю папку local
мы можем добавить в гит, то с bitrix
сложнее. В папке /bitrix/php_interface/
есть файл с доступами к базе данных, который не желательно хранить в гит.
В корне сайта из гит убираем .htaccess
и robots.txt
, в них часто прописывается хост сайта.
В корне сайта еще бывают файлы IDE разработчиков, xml
карты сайта, некоторые любят дампы базы данных держать в кроне сайта, не пускаем всё это в гит.
Выкладываю оптимальный .gitignore
для Bitrix, который максимально отслеживает всё файлы и не видит ядро:
.gitignore# исключаем папку /bitrix кроме некоторых подпапок
!/bitrix
/bitrix/*
# оставляем печатные формы интернет-магазина
!/bitrix/admin/
/bitrix/admin/*
!/bitrix/admin/reports/
# оставляем нестандартные компоненты
!/bitrix/components/
/bitrix/components/bitrix/
# сохраняем весь php_interface за редкими исключениями
!/bitrix/php_interface/
/bitrix/php_interface/dbconn.ph*
/bitrix/php_interface/after_connect*
/bitrix/php_interface/logs/
# сохраняем шаблоны сайта
!/bitrix/templates/
# исключаем логи
/local/php_interface/logs/
/local/logs/
# исключаем загружаемые файлы
/upload/
# различные системные папки и файлы хостингов и операционных систем
/cgi-bin/
/awstats/
/webstat/
.DS_Store
.Spotlight-V100
.Trashes
Thumbs.db
ehthumbs.db
# исключаем все текстовые и подобные ресурсы
*.xml
*.html
*.txt
*.log
*.css.map
# архивы, включая многотомные
*.zip
*.zip*
*.tar
*.tar*
*.enc
*.enc*
*.gz
*.gz*
*.tgz
*.tgz*
*.sql
*.rar
.hg
.ftpconfig
*.doc
*.docx
*.pdf
*.rtf
*.xls
*.xlsx
*.ppt
*.pptx
*.psd
*.psb
*.sketch
core.*
# храним robots.txt
!/robots.txt
- Исключаем из гита .html, .xml, .txt-файлы. Хотя в ряде случаев они могут быть важны, но такие случаи достаточно редки. Если подобный файл нужно внести в гит, добавляем его в исключения
- Исключаем стандартные компоненты Битрикса, однако оставляем все остальные компоненты в том числе компоненты маркетплейса. Это продиктовано практикой: пользы от этого оказалось больше, чем вреда
Создание Git для 1 сайта
Проще всего создавать гит, когда у вас только 1 сайт, а тестовые делать когда система управления версиями готова.
Когда у нас только один сайт, достаточно: в папке сайта инициализировать гит, установить гитигнор, добавить все файлы в гит, закоммитить.
- Установить гитигнор
- В корне сайта инициализировать гит
- Добавить все файлы в гит
- Закоммитить
Создание Git для 2 сайтов
Когда сайта два, появляется проблема с тем, что они не всегда идентичны. Какие-то правки могут быть на одном сайте и не быть на другом. Создавая два отдельных гита на двух сайтах - их не получается просто слить вместе, потому что нет общей точки в истории коммитов.
Чтобы решить данные проблемы, поступим так: возьмем первый сайт за актуальный, в случае конфликта, не будем сливать, а возьмем файл отсюда. При первом слиянии разрешим слияние отдельных репозиториев, коммит слияния будет первой общей точкой. Первый сайт с актуальными файлами буду называть продакшн
, второй сайт буду называть тестовый
.
Подготовка
- На продакшине создаем гит аналогично инструкции для одного сайта, отправляем (пушим) в удаленный репозиторий
- На тестовом создаем гит, добавляем удаленный репозиторий (git remote add), но не отправляем (пушим)
После подготовки, работаем на тестовом, выполняем поочередно все команды.
Получаем данные, которые мы отправили с прода, с помощью git:
git fetch origin
Почти то же самое, что и git pull, только не происходит слияния:
push. git fetch
Получается сейчас у нас две отдельных истории коммитов в гит. Переключаем файлы на версию, как на проде:
git checkout origin/master
Из текущего состояния создаем ветку, чтобы можно было проводить слияния:
git checkout -b tmp
Тут самая магия, мы сливаем два отдельных гита в один. При конфликтах будет использоваться стратегия ours (наше), файлы будут как на проде, так как мы переключены на ветку с прода. --allow-unrelated-histories
разрешает сливать гиты, у которых нет общей точки. Без этого вы получите ошибку refusing to merge unrelated histories
.
git merge master --strategy=ours --allow-unrelated-histories
Обратно переключаемся в состояние тестового сайта:
git checkout master
Сливаемся с веткой tmp
, в которой уже есть общий коммит с историей тестового и продакшен, при этом конфликтов нет:
git merge tmp
Всё отправляем обратно в удаленный репозиторий, дальше на продакшен. На продакшине никаких изменений не произойдет, потому что мы брали версию продакшина при слиянии:
git push
Полный набор команд:
git fetch origin
git checkout origin/master
git checkout -b tmp
git merge master --strategy=ours --allow-unrelated-histories
git checkout master
git merge tmp
git push