Уменьшите хранилище мерзавцев с помощью bfg
Столкнувшись с анархическим добавлением двоичных файлов программистом, как уменьшить размер git-репозитория не только удаляя проблемные файлы, но и их историю в дереве.
Я попытался использовать bfg, но, поскольку он работает с зеркальным голым репозиторием, я столкнулся с трудностями в получении всего рабочего процесса, из-за необходимости собирать ответы из разных мест в сети.
1 ответ
Что для меня, наконец, сработало, так это перемещаться между зеркальными открытыми репозиториями и обычными репозиториями. Это может показаться длинным, но у него действительно есть все шаги от огромного представителя до маленького, и это действительно быстро (10-минутная работа).
Сначала получите локальный зеркальный репозиторий для последней версии со всеми путаницами (это может занять много времени в Интернете. Это единственный шаг, который потенциально может занять много времени):
git clone --mirror http://myservice.org/myrepo
Затем скопируйте результат в целях резервного копирования (я не шучу, мы будем использовать его в конце):
cp -r myrepo.git myrepo.git.bak
Затем создайте обычную версию из чистой версии, чтобы вы могли очистить:
mkdir myrepo.small
cd myrepo.small
mkdir .git
cd .git
cp -r ../../myrepo.git/* .
cd ..
git config --local --bool core.bare false
И при условии, что очистка должна быть сделана в основной ветке:
git checkout master
Чтобы очистить, найдите большие репертуары с:
du -sh *
И удалите их (даже если вы хотите сохранить их не версионными, мы вернем их позже) с помощью:
git rm bigThings
Если вы хотите сохранить только некоторые файлы, но удалить их из истории git, вы можете использовать git rm --cached bigFile
но я обнаружил, что легче все удалить, очистить историю и затем вернуть их обратно.
Так часто, как вы хотите, и, по крайней мере, когда вы закончите уборку:
git commit -m "big clean up"
Вы могли бы попытаться отправить результат в зеркальное хранилище, но мне было проще создать новое (из родительской папки хранилища):
rm -rf myrepo.git
git clone --mirror myrepo.small
Наконец, скачайте bfg (вам нужно установить Java) и запустите зеркальный клон. Я хотел удалить историю для всего выше 5М, и моя загруженная версия bfg была на ~/Downloads/bfg-1.12.5.jar
поэтому я использовал:
java -jar ~/Downloads/bfg-1.12.5.jar --strip-blobs-bigger-than 5M myrepo.git
Подтвердите очистку (с проверкой размера до и после):
cd myrepo.small.git
du -sh
git reflog expire --expire=now --all && git gc --prune=now --aggressive
du -sh
Это должно быть легче. На данный момент я нашел:
git push ../myrepo
не работать, поэтому я просто создал его снова из чистого зеркала:
rm -rf myrepo.small
mkdir myrepo
cd myrepo
mkdir .git
cd .git
cp -r ../../myrepo.small.git/* .
cd ..
git config --local --bool core.bare false
git checkout master
Я также обнаружил, что проще удалить мой репозиторий (на bitbucket) и создать его пустым. Когда все в порядке, установите правильный репо в.git/config и git push
Чтобы положить обратно в папку нарушителей, я использовал унисон в обычной версии репозитория, для которого вначале выполнялось резервное копирование.
Сначала сделайте нормальную версию бэкапа
mkdir myrepo.bak
cd myrepo.bak
mkdir .git
cd .git
cp ../../myrepo.git/* .
git config --local --bool core.bare false
git checkout master
cd ..
затем запустить унисон на двух
unison myrepo myrepo.bak
И положи обратно то, что мне было нужно. Почтовый индекс этого на filesender или другой замене usb- флешки, чтобы отправить всем участникам, и мы снова в работе.