Уменьшите хранилище мерзавцев с помощью 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- флешки, чтобы отправить всем участникам, и мы снова в работе.

Другие вопросы по тегам