2015-10-22 5 views
1

Мы планируем перенести один из наших последних больших хранилищ CVS в репозиторий Git.История папок старше x на cvs2git Миграция

Для миграции мы используем cvs2git svn2git. Поскольку этот репозиторий CVS вырос более чем через 12 лет, он имеет 31 ГБ данных.

Не удалось найти решение проблемы, касающейся истории, предшествующей заданному периоду времени (например, 2 года).

Вы знаете, любой инструмент/команда/разрешение для одного из этого ?: истории

  • отброшенной из CVS
  • Не экспортировать всю историю с cvs2git
  • Не импортировать всю историю с Git импортом
  • истории падения с Git

Спасибо и поздравления, Andreas

Решение по предложению Дмитрия Oksenchuk: После редактирования трансплантатов, я написал 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 
+0

Возможный дубликат [Как удалить старую историю из репозитория git?] (Http://stackoverflow.com/questions/4515580/how-do-remove-the-old-history-from-a -git-repository) – mik01aj

+1

Вы также можете использовать неглубокий клон git. – mik01aj

ответ

2

В глубине репо хорошо сформированным Гит истории обычно не является проблемой. В linux репо есть более 500 тыс. Транзакций, и он отлично работает. В этом году мы перенесли репозиторий CVS продолжительностью ~ 15 лет (5 ГБ файлов ,v) в Git. Git repo занимает ~ 200 МБ и содержит ~ 70 тыс. Комет.

Мы столкнулись с двумя основными проблемами: бинарные файлы и количество тегов.

Бинарные файлы

В CVS все изменения бинарных файлов хранятся на сервере, и только текущий пересмотр trasferred на кассе. Таким образом, это не проблема для хранения двоичных файлов в CVS, вам просто нужно достаточное дисковое пространство на сервере. С Git ситуация другая. Когда вы делаете клон Git repo, все ревизии двоичных файлов переносятся на ваш локальный клон. Даже если файл не существует в последней фиксации, все его исторические изменения находятся в вашем локальном репо. Нам удалось уменьшить размер Git-репо с ~ 700 МБ до ~ 200 МБ, удалив из архива ненужные двоичные файлы. Важным моментом здесь является ваше решение по размеру файла в Git, а не в CVS. Git создает объекты с использованием сжатия zlib и дельта-сжатия, поэтому история одного и того же файла может иметь совершенно другое дисковое пространство в Git и CVS. Вы можете использовать плагин «Найти большие файлы» в Git Extensions.

Количество тегов

Мы имеем более чем 20k сборки теги в CVS репозиторий. С таким количеством тегов, как Git Extensions, так и Source Tree работают чрезвычайно медленно (особенно когда им нужно загружать все теги в раскрывающийся список). git push с Git 1.9.5 также был очень медленным из-за регрессии performace fixed в Git 2.3.0. В настоящее время в Git мы сохраняем только теги сборки за последние 2 года (~ 7k теги), периодически архивируя старые теги.

капают старая история

Если вы все еще нужно, это намного проще и безопаснее бросить старую историю в Git, чем в CVS или во время миграции.

  1. Установите новый корневой фиксации в файле grafts: echo %commit_hash% >.git/info/grafts
  2. Удалить все теги и ветви, которые не содержат этой фиксации (см git tag --contains и git branch --contains)
  3. Rewrite фиксации график: git filter-branch --tag-name-filter cat -- --all

Или вы также можете проанализировать файл git-dump.dat (вывод cvs2git в формате git fast-import) и удалить из него старые коммиты, теги и ветви.