Как экспортировать историю изменений из mercurial или git в cvs?
Я буду работать с другими людьми над кодом из проекта, который использует cvs. Мы хотим использовать распределенный vcs, чтобы сделать нашу работу, и когда мы закончим или, может быть, время от времени мы хотим передать наш код и всю нашу историю ревизий в cvs. У нас нет доступа на запись к РЕПО cvs проекта, поэтому мы не можем совершать очень часто. Какой инструмент мы можем использовать для экспорта нашей истории изменений в cvs? В настоящее время мы думали об использовании git или mercurial, но мы могли бы использовать другой распределенный VCS если это может облегчить экспорт.
3 ответов:
к счастью для тех из нас, кто все еще вынужден использовать CVS, git предоставляет довольно хорошие инструменты, чтобы делать именно то, что вы хотите сделать. Мои предложения (и то, что мы делаем здесь на $работа):
создание исходного клона
использовать
git cvsimportчтобы клонировать историю версий CVS в репозиторий git. Я использую следующий вызов:% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \ -A /path/to/authors/file cvs_module_to_checkoutThe
-Aопция необязательна, но она помогает сделать историю изменений, импортированную из CVS, похожей более git-like (см.man git-cvsimportдля получения дополнительной информации о том, как это настроить).в зависимости от размера и истории репозитория CVS, этот первый импорт займет очень много времени. Вы можете добавить a-v к приведенной выше команде, если хотите спокойствия, что что-то на самом деле происходит.
как только этот процесс будет завершен, у вас будет
masterветка, которая должна отражать голову CVS (за исключением того, чтоgit cvsimportпо умолчанию игнорирует последние 10 минутное количество коммитов, чтобы не поймать коммит, который наполовину завершен). Затем вы можете использоватьgit logи друзья, чтобы изучить всю историю репозитория так же, как если бы он использовал git с самого начала.Настройки Настроек
есть несколько настроек конфигурации, которые сделают инкрементный импорт из CVS (а также экспорт) проще в будущем. Они не задокументированы на
git cvsimportman page поэтому я полагаю, что они могут измениться без предварительного уведомления но, FWIW:% git config cvsimport.module cvs_module_to_checkout % git config cvsimport.r cvs % git config cvsimport.d $CVSROOTвсе эти параметры можно указать в командной строке, чтобы вы могли безопасно пропустить этот шаг.
Добавочные Импорт
в последующем
git cvsimportдолжна быть намного быстрее, чем первый вызов. Однако он делаетcvs rlogв каждом каталоге (даже те, которые имеют только файлы вAttic) так он все еще может занять несколько минут. Если вы указали предложенные конфигурации выше, все, что вам нужно сделать, это выполнить:% git cvsimportесли вы не настроили свои конфигурации для указания значений по умолчанию, вам нужно будет указать их в командной строке:
% git cvsimport -r cvs -d $CVSROOT cvs_module_to_checkoutв любом случае, две вещи, чтобы иметь в виду:
- убедитесь, что вы находитесь в корневом каталоге репозитория Git. Если вы находитесь в другом месте, он будет пытаться сделать свежий
cvsimportэто снова займет вечность.- убедитесь, что вы находитесь на своем
masterфилиала, так что изменения могут быть объединены (или rebased) в ваши локальные/тематические ветви.Внесение Локальных Изменений
на практике я рекомендую всегда вносить изменения в ветви и только сливаться с
masterкогда вы будете готовы экспортировать эти изменения обратно в репозиторий CVS. Вы можете использовать любой рабочий процесс, который вам нравится в ваших ветвях (слияние, перебазирование, сжатие и т. д.), Но, конечно же, применяются стандартные правила перебазирования: не перебазируйте, если кто-то еще основывал свои изменения на вашем отделение.экспорт изменений в CVS
The
git cvsexportcommitкоманда позволяет экспортировать одну фиксацию на сервер CVS. Вы можете указать один идентификатор фиксации (или все, что описывает конкретную фиксацию, как определено вman git-rev-parse). Затем создается diff, применяется к проверке CVS, а затем (необязательно) фиксируется на CVS с использованием фактическогоcvsклиент. Вы можете экспортировать каждую микро-фиксацию в своих тематических ветвях, но обычно мне нравится создавать слияние фиксации на актуальномmasterи экспортируйте эту единственную фиксацию слияния в CVS. Когда вы экспортируете фиксацию слияния, вы должны сказать git, какой фиксатор родителя использовать для создания diff. Кроме того, это не будет работать, если ваше слияние было перемоткой вперед (см. раздел "как работает слияние"man git-mergeдля описания быстрого слияния), поэтому вы должны использовать--no-ffопция при выполнении слияния. Вот пример:# on master % git merge --no-ff --log -m "Optional commit message here" topic/branch/name % git cvsexportcommit -w /path/to/cvs/checkout -u -p -c ORIG_HEAD HEADвы можете увидеть, что каждый из этих варианты означают на man page for git-cvsexportcommit. У вас есть возможность установить
-wопция в вашей конфигурации git:% git config cvsexportcommit.cvsdir /path/to/cvs/checkoutесли патч не работает по какой-либо причине, мой опыт заключается в том, что вам (к сожалению), вероятно, будет лучше скопировать измененные файлы вручную и зафиксировать с помощью клиента cvs. Однако этого не должно произойти, если вы убедитесь
masterвверх-к-дата с ССС до слияния вашей теме ветки в.если фиксация не выполняется по какой-либо причине (проблемы с сетью/разрешениями и т. д.), Вы можете взять команду, напечатанную на вашем терминале в конце вывода ошибок, и выполнить ее в своем рабочем каталоге CVS. Обычно это выглядит примерно так:
% cvs commit -F .msg file1 file2 file3 etcв следующий раз вы делаете
git cvsimport(ожидание не менее 10 минут) вы должны увидеть патч экспортированной фиксации, повторно импортированный в локальный репозиторий. Они будут иметь разные идентификаторы фиксации, так как CVS фиксация будет иметь другую временную метку и, возможно, другое имя фиксатора (в зависимости от того, настроили ли вы файл authors в своем начальномcvsimportвыше).клонирование вашего клона CVS
если у вас есть более одного человека, нужно делать
cvsimport, было бы более эффективно иметь один репозиторий git, который выполняет cvsimport и имеет все другие репозитории, созданные как клон. Это прекрасно работает, и клонированный репозиторий может выполнять cvsexportcommits так же, как описано выше. Однако есть один нюанс. Из-за того, что коммиты CVS возвращаются с разными идентификаторами фиксации (как описано выше), вы не хотите, чтобы ваша клонированная ветвь отслеживала центральный репозиторий git. По умолчанию, это какgit cloneнастраивает ваш репозиторий, но это легко исправить:% git clone [CENTRAL_REPO_HERE] % cd [NEW_GIT_REPO_DIR_HERE] % git config --unset branch.master.remote % git config --unset branch.master.mergeпосле того, как вы удалили эти конфигурации, вам нужно будет явно сказать, где и что нужно вытащить, когда вы хотите вытащить новые коммиты из центральный репозиторий:
% git pull origin master
в целом, я нашел этот рабочий поток вполне управляемым, и "следующая лучшая вещь" при переходе полностью на git не практична.
вы не должны доверять cvsimport вслепую и проверьте, соответствует ли импортированное дерево тому, что находится в репо CVS. Я сделал это, поделившись новым проектом с помощью плагина eclipse CVS и обнаружил, что есть несоответствия..
две фиксации, которые были сделаны менее чем за минуту с одним и тем же сообщением фиксации (чтобы вернуть ошибочно удаленный файл), были сгруппированы в одну большую фиксацию, что привело к отсутствию файла из дерева..
мне удалось решите эту проблему, изменив параметр 'fuzz' менее чем на минуту.
пример:
% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \ -A /path/to/authors/file cvs_module_to_checkout -z 15итог: Проверьте свое дерево после импорта
в дополнение к Брайану Филлипсу ответ: есть также git-cvsserver который работает как сервер CVS, но на самом деле доступ к репозиторию git... но у него есть некоторые ограничения.
Comments