Почему в git-cvsimport отсутствует один основной набор патчей? - PullRequest
5 голосов
/ 01 апреля 2009

Это продолжение моего предыдущего вопроса .

Я могу просмотреть вывод cvsps (сохраненный в моей директории ~ / .cvsps) и увидеть набор патчей для сложного коммита. Но этот коммит не появляется, когда я делаю cvsimport для обновления моего существующего git-репозитория. Я знаю, что git-cvsimport будет игнорировать наборы обновлений, которые новее 10 минут, чтобы избежать импорта неполного коммита CVS. Я думаю, что я также слышал, что он пропустит наборы патчей, для которых не может быть идентифицирована связанная ветвь. Какие еще причины могут быть причиной того, что git-cvsimport игнорирует мой коммит? Как я могу отладить это?

Вот немного вывода cvsps:

patchset: 50064
date: 1238445635
author: skiphoppy
tag: 
tag_flags: 0
branch: HEAD 
branch_add: 1
descr:
My log message

-=-END CVSPS DESCR-=-
members:
file:ordinaryChangedFile; pre_rev:1.44; post_rev:1.45; dead:0; branch_point:0
file:newFileRenamedAndModifiedFromOldFile; pre_rev:INITIAL; post_rev:1.1; dead:0; branch_point:0
file:deletedFileGoneBecauseRenamed; pre_rev:1.2; post_rev:1.3; dead:1; branch_point:0
...

Имеет ли эта строка branch_add: 1 какое-либо отношение к этому? В хранилище всего 9 таких коммитов; остальные 50090 коммитов говорят: branch_add: 0. Кроме этого, я не знаю, в чем отличие с точки зрения cvsps или git-cvsimport. Фиксация была сложной, включая переименование нескольких файлов и внесение изменений в контент. Определенно сложно для CVS справиться. Конечно, не так-то просто с Git, но с Git трудно справиться, когда реальный бэкэнд - CVS.

Мне нужно выполнить один и тот же тип сложного коммита еще три раза, и я не могу позволить себе тратить по 4,5 часа каждый раз, чтобы заново импортировать новый git-репозиторий из CVS из-за невозможности cvsimport смотри мой коммит.

Что еще более важно, меня пугает тот факт, что мои ежедневные запуски git-cvsimport (которые я собирался добавлять в cron или даже писать демон для запуска каждые пять минут или около того) могут miss совершает в будущем! Я не нашел способа использовать существующий репозиторий для получения этих коммитов; Я могу запустить git-cvsimport только в новом репозитории и ждать вечно, теряя использование многих других моих веток, пока я на нем.

Ответы [ 4 ]

7 голосов
/ 02 апреля 2009

Ну, это может быть проблемой. Мои строки git-cvsimport выглядят так:

git cvsimport -p x ...

Предполагается, что -p x передает параметр -x команде cvsps, чтобы он игнорировал кэшированный вывод, который он оставил после предыдущих запусков. Я подумал, что основной причиной этого было то, что последние несколько наборов патчей, которые могут быть неполными, будут выброшены и завершены при следующем запуске. Оказывается, это может быть больше проблем, которые он исправляет, и это может быть одним из них.

Я научился запускать git cvsimport таким образом из этой записи в блоге , которая в настоящее время является одним из самых популярных в Google для "git cvs". Только в описанном выше процессе, когда я пытался запустить git-cvsimport через отладчик Perl при выводе из cvsps, я должен был проверить и посмотреть, какие аргументы действительно приводили к cvsps. Я узнал, что cvsps запускается так:

cvsps --norc x --cvs-direct ...

Вместо:

cvsps --norc -x --cvs-direct ...

И я экспериментально проверил, что я получаю другой вывод из cvsps, с отсутствующими некоторыми наборами патчей (я понятия не имею, что это за паттерн), когда передается x вместо -x. Благодаря закону Мерфи, cvsps, похоже, не сообщает, что это было проблемой, и git-cvsimport никогда не видит ее.

Так или иначе, git cvsimport должен запускаться так:

git cvsimport -p -x ...

Мои предыдущие версии этого хранилища полностью закрыты на этом этапе, но я смог заставить последние из проблемных коммитов в них (хотя некоторые из более ранних коммитов отсутствуют). Итак, я еще раз прошёл четырехчасовой процесс импорта и надеюсь, что так оно и будет!

Последний совет: git-cvsimport в Windows, похоже, не работает вообще. Я получил менее 10% от числа коммитов, хотя у меня получилось дерево, которое напоминает текущее состояние нашего проекта. Кажется, ему не хватает почти всей истории ...

3 голосов
/ 17 марта 2010

Спасибо большое! У меня была такая же проблема, и я смог исправить ее с вашей помощью!

Я даже нашел способ избежать повторного запуска cvsimport с нуля. Простая установка веток 'master' и 'origin' для старых git коммитов заставила cvsimport повторно импортировать патчи, в том числе и отсутствующие:

найти идентификатор коммита старше, чем отсутствующие коммиты:

git log

сделать указание 'origin' на этот коммит

ветка git -f origin

переключиться на источник (так, чтобы 'master' не был текущим HEAD)

git checkout origin

теперь делает 'master' point старшим коммитом.

git branch -f master origin

переключиться обратно на мастер

мастер проверки git

теперь время полностью откатилось, и вы можете снова выполнить cvsimport, на этот раз правильно

git cvsimport ...

1 голос
/ 01 апреля 2009

Я недавно столкнулся с такой вещью - в CVS был коммит, который не появлялся в git после git cvsimport; позже коммиты сделали (это укусило меня сильно, потому что потом я выпустил неработающие патчи.

Однако, исправление было простым и глупым - я просто сбросил ветку cvs / master перед отсутствующим коммитом, перезапустил git cvsimport, и там это было.

0 голосов
/ 01 апреля 2009

Хм, хорошая новость заключается в том, что git-cvsimport, кажется, написан на Perl, и я оказался программистом на Perl, так что, возможно, я могу хотя бы пройтись по этому пути с помощью отладчика Perl, чтобы выяснить, что происходит во время этого коммита .

Для тех, кто хочет попробовать это, вам нужно найти полный путь к git-cvsimport и передать его в perl (интерпретатор Perl) с ключом -d:

perl -d /usr/local/libexec/git-core/git-cvsimport

Я не разработал все другие опции, чтобы сделать это, пока ... Мне нужно напрямую передать git-cvsimport вывод cvsps, я думаю ...

...