Евгений Никитин Евгений Никитин

Русский English

Обслуживаем GIT репозиторий

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

Подготавливаем репозиторий

Для начала скачаем репозиторий:

git clone --mirror git@hosting.com:path/project.git

Этой командой мы создали “зеркало” репозитория. Оно содержит сам репозиторий, то, что обычно хранится в папке .git, без файлов проекта.

Создаем архивную копию репозиторий

Создадим архивную копию репозитория, которую можно будет восстановить, если что-то пойдет не так:

tar czf achive_name.tgz project.git

Очищаем базу от больших файлов

Бывает, что в репозиторий кладут файлы большого размера. Часто это случается по-ошибке, но информация о изменениях в этих файлах уже попала в репозиторий и будем в нем хранится пока мы не удалим её.

Поможет нам в удалении больших файлов BFG Repo-Cleaner.

Скачайте к себе jar файл с сайта. Переименуйте его в bfg.jar и положите в папку где находится папка с вашим репозиторием project.git.

Запустим удаление файлов больше 50 мегабайт:

java -jar bfg.jar --strip-blobs-bigger-than 50M project.git

На MacOSX, возможно, выйдет ошибка

Looks like your version of Java (1.6) is too old to run this program.

Это из-за того, что в консоли используется системная версия Java. Скачайте себе последнюю версию Oracle Java. Если вы уже устанавливали Oracle Java, то обновитесь до последней версии через System Preference -> Java.

Oracle Java устанавливается в /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java

Пропишем алиас для этой версии Java в командной строке:

echo alias java_jre='/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java' >> ~/.profile

Теперь можно вызвать BFG еще раз:

java_jre -jar bfg.jar --strip-blobs-bigger-than 50M project.git

В дальнейшем используйте вызов java_jre вместо java.

Также BFG позволяет удалить файлы по расширению:

java -jar bfg.jar --delete-files *.mp4 project.git

по имени:

java -jar bfg.jar --delete-files id_{dsa,rsa} project.git

или можно удалить папку:

java -jar --delete-folders folder_name --delete-files folder_name  --no-blob-protection  project.git

Очищаем репозиторий от ненужных данных

Теперь нужно почистить репозиторий и удалить в нем ненужные данные.

Удаляем логи:

git reflog expire --expire=now --all

Запускаем сборщик мусора, который удалит ненужные файлы и оптимизирует репозиторий:

git gc --prune=now --aggressive

Завершаем процесс

После того, как репозиторий был обслужен, настало время отправить изменения обратно:

git push

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

Лучшие практики использования GIT.

Чтобы обслуживать репозиторий реже и сохранять размер репозитория в адекватном размере следует придерживаться нескольких правил:

  • В репозиторий, по-возможности, не следует сохранять архивы, медиа файлы, логи, копии баз данных, данные для миграций и прочие файлов с большим размером.
  • Если вы используете менеджер пакетов, например composer, npm или bower, то следует хранить в репозитории только файл с описанием проектов для установки. Добавлять установленные пакеты в репозиторий не нужно.
  • При работе над одной задачей полезно объединять несколько комитов в один, используя git rebase или git merge –squash.