Git с плохой историей или чистим репу правильно

Работая в команде важно держать свои проекты чистыми, без лишнего мусора. И вот, после очередного git rm, git commit вы понимаете, что ваш проект чист, но все же остается осадочек в виде истории удаленных файлов. Вроде все ненужное вы удалили, а проект меньше весить не стал. Поначалу это не кажется страшным и даже не действует вам на нервы, но со временем, вы понимаете, что так уже нельзя и начинаете поиск этих злосчастных файлов.

Для решения данной проблемы на данный момент существует 2 способа:

  • git filter-branch
  • BFG Repo-Cleaner

Первый способ хорош тем, что все можно решить средствами git, а второй хорош простой и расширенными настройками.
Документацию по filter-branch можно почитать тут. Я же расскажу как для нашей задачи использовать BFG Repo-Cleaner.

 

Итак, идем на офф сайт и скачиваем последнюю версию программы.

Берем jar файл и кидаем в домашний каталог, либо на рабочий стол.

Далее нам нужно скачать наш репозиторий с плохой историей.

Делаем это как обычно, но с ключом —mirror

$ git clone --mirror [email protected]:mydirtyrepo

По сути, мы создаем зеркальную копию репозитория с нашего сервера.

Давайте приступим к «очищению» нашего репозитория.

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

$ java -jar bfg.jar --delete-files filename mydirtyrepo.git

где filename — это название файла, информацию о котором нужно бесследно стереть.

Если же вы хотите избавиться всех файлов, которые когда либо были в вашем проекте и весили, например больше 20мб то сделать это тоже достаточно просто:

$ bfg --strip-blobs-bigger-than 20M  mydirtyrepo.git

Кроме этого, BFG Repo-Cleaner умеет удалять папки, файлы по маске, а также заменять содержимое файлов во всей истории.

После того как все ненужное удалено, пора бы закрепить изменения и запушить все на сервер.
Для этого выполняем всего 3 команды в консоли:

$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git push

На этом все. Ведите вашу историю чистой и воздерживаетесь от случайных побуждений запушить что-то лишнее.
Как говорится, семь раз проверь, один раз commit.

comments powered by Disqus