На это уже есть несколько ответов: здесь , например. Я использовал git, встроенный в cvsimport, для нескольких небольших несложных репозиториев, и это прекрасно работает. Но вы должны тщательно проверить (или сделать так, чтобы ваш скрипт). В одном большом репозитории я обнаружил ошибки при конвертации, когда файлы были удалены из CVS, и это не удалось отразить в зеркале git. Также оказалось, что он не может корректно импортировать ветки поставщиков из CVS.
В конце концов я нашел cvs2git более надежным. Однако этот инструмент не поддерживает пошаговые преобразования. Однако вы можете обойти это, выполнив полное преобразование cvs2git, а затем отправив результат в текущее зеркало. Преимуществом этого является то, что ваши пользователи git могут выдвигать рабочие ветки, если это необходимо, если они не совершают коммиты на зеркальные ветви. Это работает хорошо уже около года в довольно большом хранилище (10 лет работы, полмиллиона LOC).