В течение жизни проекта размер 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.