Введение: распространённая проблема медленного git на BitrixVM
Если вы работаете с git на виртуальной машине BitrixVM и замечаете, что даже простые команды вроде git status или git add выполняются по 5–30 секунд — вы не одиноки. Это одна из самых частых жалоб разработчиков, работающих с Битрикс в окружении BitrixVM. Причин несколько, и каждую нужно проверять последовательно.
Прежде всего, замерьте реальную скорость работы git:
|
1 |
time git status |
Если команда выполняется более 2–3 секунд на репозитории среднего размера — проблема есть. Разберём основные причины.
Причина 1: SELinux блокирует операции git
SELinux (Security-Enhanced Linux) — система мандатного контроля доступа, включённая по умолчанию в CentOS/RHEL, на котором базируется BitrixVM. SELinux может значительно замедлять файловые операции git, добавляя проверки безопасности к каждому обращению к файлу.
Проверить статус SELinux:
|
1 |
getenforce |
Если видите Enforcing — SELinux активен и может быть причиной тормозов.
Временно отключить (до перезагрузки):
|
1 |
setenforce 0 |
После этого снова выполните time git status и сравните результат. Если git ускорился — причина подтверждена.
Навсегда отключить SELinux (в файле /etc/selinux/config):
|
1 |
SELINUX=disabled |
После изменения файла требуется перезагрузка сервера. Важно понимать, что отключение SELinux снижает безопасность системы — на production-серверах это решение нужно обдумать.
Причина 2: Права файлов и владелец репозитория
Начиная с Git 2.35.2, git проверяет, совпадает ли владелец текущего каталога с пользователем, запустившим команду. Если вы запускаете git от имени одного пользователя, а файлы принадлежат другому — git выполняет дополнительные проверки или выдаёт ошибку.
Проверить владельца директории проекта:
|
1 |
stat .git |
Решение — выставить владельца проекта на bitrix:
|
1 |
sudo chown -R bitrix:bitrix /home/bitrix/www/your_project |
После этого все git-операции должны запускаться от имени пользователя bitrix, чтобы владелец совпадал.
Причина 3: Настройки core.fsmonitor и core.trustctime
Git может тормозить, если отслеживает изменения файлов по времени модификации (ctime). На BitrixVM файловая система активно работает с метаданными, и это влияет на производительность.
|
1 2 |
git config --global core.trustctime false git config --global core.fsmonitor true |
Рекомендованный набор настроек для ускорения:
|
1 2 3 |
git config --global core.preloadindex true git config --global core.fscache true git config --global core.trustctime false |
Причина 4: Большой репозиторий — много объектов в .git
Со временем в репозитории накапливаются «мусорные» объекты: старые коммиты, unreachable-блобы, временные ссылки. Это замедляет git при каждой операции, требующей обхода объектов.
Оптимизируйте репозиторий командами:
|
1 2 |
git gc --aggressive --prune=now # Удалит мусор, упакует объекты (может занять время, но ускорит потом) git fsck --full # Проверит целостность |
После git gc размер директории .git/objects/ должен заметно уменьшиться, а скорость операций — вырасти.
Настройка git-конфига для работы под пользователем bitrix
Для постоянной оптимизации добавьте следующие настройки в глобальный конфиг git пользователя bitrix. Отредактируйте файл /home/bitrix/.gitconfig или примените через команды:
|
1 2 3 4 5 6 7 |
[core] preloadIndex = true # Предзагрузка индекса untrackedCache = true # Кэш untracked файлов fsmonitor = true # Мониторинг FS (Git 2.31+; ускорит status в 10x) featureManyFiles = true # Для больших репо [pack] threads = 4 # Используйте все ядра VM |
Диагностика: профилирование медленных операций
Если причина торможения неочевидна, используйте встроенные инструменты трассировки git:
|
1 2 |
GIT_TRACE=1 git status # Трассировка Git-операций GIT_TRACE_PERFORMANCE=1 git status # Время на этапы (Git 2.10+) |
Для глубокой системной диагностики:
|
1 2 |
dnf install strace strace -c git status |
Вывод покажет таблицу с системными вызовами и временем их выполнения. Если большая доля времени приходится на вызовы stat или openat — причина в файловой системе или SELinux.
Полезные алиасы git для ускорения работы
Добавьте алиасы в конфиг git для более быстрого ввода часто используемых команд:
|
1 2 3 4 |
git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.lg "log --oneline --graph --decorate --all" |
Для работы с большими репозиториями также полезен Git LFS — перенос тяжёлых файлов (изображения, архивы шаблонов Битрикс) в LFS-хранилище:
|
1 2 3 4 5 |
yum install git-lfs git lfs install git lfs track "*.jpg" "*.zip" # Для медиа Bitrix git add .gitattributes git commit -m "Add LFS" |
После всех перечисленных оптимизаций скорость git status на типичном проекте Битрикс должна снизиться с десятков секунд до долей секунды.
