2010-09-20 4 views
2

Я только что преобразовал репозиторий 10G CVS (около 120 модулей) в одном реестре git с использованием cvs2git без каких-либо ошибок на машине RHEL5. Я хотел бы разделить один подкаталог + историю с репозиторием и создать новый. (как: How can I move a single directory from a git repository to a new repository whilst maintaining the history?)git filter-branches - нет прогресса на конце

Я пробовал:

git filter-branch --subdirectory-filter xxx.model -- --all 

, который прекрасно работает, пока последний элемент не будет обработан - тогда он висит с использованием процессора без какого-либо прогресса. Используя strace, это выглядит примерно так: [неработающая ссылка]. strace - все вилки заканчиваются на выходе> 2.5G - я не знаю, растет ли оно; Я остановил его.

Что вызывает странное поведение? Есть ли другой способ создания нового репозитория с подкаталогом + история существующего репозитория?

+0

Сделав такое преобразование самостоятельно, я согласен с комментарием @ mhagger о том, чтобы сделать преобразование кусочно. Однако то, что вы испытываете, похоже на ошибку в git filter-branch. Вероятно, вы должны написать запись с такой же информацией, как вы можете, в список рассылки Git, и спросить там. – Novelocrat

ответ

2

Операция завершена успешно после нескольких часов работы. Единственная проблема заключалась в том, что нам казалось, что прогресса нет, но это неверно. Просто нет выхода.

Установите GIT_TRACE = 1 и повторите команду, и на дисплее появится вид и прогресс.

Возможно, что большое количество тегов заставило операцию замедлить работу.

+0

Действительно, с тех пор я обнаружил, что «git filter-branch» мучительно медленна, если ему приходится переписывать множество ветвей/тегов. Я только что представил исправления, чтобы исправить эту проблему. – mhagger

+0

Наш проект имеет массу тегов. След показывает, что они стекаются. –

0

Что бы вы ни делали, потребуется переписать существующий репозиторий git. Таким образом, вы можете просто запустить преобразование снова, разбив проекты сначала, а затем преобразовывая проекты отдельно.

Если два проекта уже находятся в отдельных подкаталогах репозитория CVS, вы можете просто указать cvs2git в одном подкаталоге, а затем на другом.

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

+0

Спасибо - это было бы одним из возможных решений для текущей ситуации (новый репозиторий преобразован/создан). Но проблема более общая, если мы захотим снова реорганизовать хранилище. – usr200910

0

Разговор с людьми в freenode/# git Я нашел другой способ сделать то же самое, удалив (git rm) все, кроме каталога, который я хочу сохранить.

git filter-branch --prune-empty --index-filter "git ls-files --exclude-standard |grep -v '^foobar'|xargs git rm -r -f --cached --ignore-unmatch" HEAD 

Эта операция выполняется медленно, но работает (предположим так). Я не смотрел на результат из-за абортов.

BTW: Кто-то из #git сказал мне, что эта операция часто может занимать дни, чтобы закончить, поэтому вполне вероятно, что если бы я подождал (хотя похоже, что прогресс/«он висит») не закончился.

Смежные вопросы