Удаление истории старше x на cvs2git Миграция
Мы планируем перенести один из наших последних больших репозиториев CVS в репозиторий Git.
Для миграции мы используем svn2git cvs2git. Поскольку этот репозиторий CVS вырос за ~ 12 лет, он содержит 31 ГБ данных.
Я не мог найти никакого решения, чтобы отбросить всю историю старше указанного периода времени (например, 2 года).
Знаете ли вы какой-либо инструмент / команду / разрешение для одного из этого?:
- Удалить историю из CVS
- Не экспортируйте всю историю с помощью cvs2git
- Не импортируйте всю историю с помощью импорта Git
- Выкинь историю из Git
Спасибо и привет, Андреас
Решение, предложенное Дмитрием Оксенчуком: После редактирования трансплантатов я написал скрипт BASH для очистки испорченных тегов и веток:
#!/bin/bash
NEW_ROOT_REF=$1
git tag --contains $NEW_ROOT_REF | sort > TAGS_TO_KEEP.tmp
echo "Keep Tags:"
cat TAGS_TO_KEEP.tmp | wc -w
git branch --contains $NEW_ROOT_REF | sort > BRANCHES_TO_KEEP.tmp
echo "Keep Branches:"
cat BRANCHES_TO_KEEP.tmp | wc -w
git tag -l | sort > TAGS_ALL.tmp
echo "All Tags:"
cat TAGS_ALL.tmp | wc -w
git branch -l | sort > BRANCHES_ALL.tmp
echo "All Branchess:"
cat BRANCHES_ALL.tmp | wc -w
# Remove tags
COUNTER=0
for drop in `comm TAGS_ALL.tmp TAGS_TO_KEEP.tmp -23`; do
git tag -d $drop
COUNTER=$[$COUNTER +1]
done
echo "Dropped tags: $COUNTER"
# Remove branches
COUNTER=0
for drop in `comm BRANCHES_ALL.tmp BRANCHES_TO_KEEP.tmp -23`; do
git branch -D $drop
COUNTER=$[$COUNTER +1]
done
echo "Dropped branches: $COUNTER"
# Clean up
rm TAGS_ALL.tmp TAGS_TO_KEEP.tmp BRANCHES_ALL.tmp BRANCHES_TO_KEEP.tmp
1 ответ
В правильно сформированном Git-репо глубина истории обычно не проблема. В репозитории Linux более 500 000 коммитов, и все работает отлично. В этом году мы перенесли репозиторий CVS ~ 15 лет (5 ГБ ,v
файлы) Git. Репозиторий Git занимает ~200MB и содержит ~70k коммитов.
Мы столкнулись с двумя основными проблемами: двоичными файлами и количеством тегов.
Двоичные файлы
В CVS все версии двоичных файлов хранятся на сервере, и только текущая версия передается при оформлении заказа. Так что совсем не проблема хранить бинарные файлы в CVS, вам просто нужно достаточно места на сервере. С Git ситуация иная. Когда вы создаете клон репозитория Git, все ревизии бинарных файлов переносятся в ваш локальный клон. Даже если файл не существует в самом последнем коммите, все его исторические ревизии находятся в вашем локальном репо. Нам удалось уменьшить размер репозитория Git с ~700 МБ до ~ 200 МБ, удалив ненужные бинарные файлы из истории. Важным моментом здесь является принятие решения о размере файла в Git, а не в CVS. Git упаковывает объекты, используя сжатие zlib и дельта-сжатие, поэтому история одного и того же файла может занимать совершенно разное дисковое пространство в Git и в CVS. Вы можете использовать плагин "Найти большие файлы" в Git Extensions.
Количество меток
У нас в репозитории CVS более 20 тыс. Тегов сборки. При таком количестве тегов и Git Extensions, и Source Tree работают крайне медленно (особенно когда им нужно загрузить все теги в выпадающий список). git push
с Git 1.9.5 также был очень медленным из-за регрессии производительности, исправленной в Git 2.3.0. В настоящее время в Git мы сохраняем только теги сборки за последние 2 года (теги ~7k), периодически архивируя старые теги.
Отбрасывание старой истории
Если вам все еще это нужно, гораздо проще и безопаснее удалить старую историю в Git, чем в CVS или во время миграции.
- Установите новый корневой коммит в
grafts
файл:echo %commit_hash% >.git/info/grafts
- Удалите все теги и ветви, которые не содержат этот коммит (см.
git tag --contains
а такжеgit branch --contains
) - Перепишите граф коммитов:
git filter-branch --tag-name-filter cat -- --all
Или вы также можете разобрать git-dump.dat
файл (вывод cvs2git в формате git fast-import) и удаляет оттуда старые коммиты, теги и ветви.