2016-10-07 8 views
0

Я конвертирую очень старый и огромный репозиторий CVS в Git, используя cvs2git через Cygwin. Он отлично работает, и я начал тестировать новый репозиторий. Я не обнаружил больших особенностей. Но мне интересно, как определяются временные метки набора фиксации/изменения.Каковы временные метки фиксации, сгенерированные в cvs2git/cvs2svn?

До сих пор я определял, что временные метки между некоторыми версиями CVS отличаются на 1 или 2 часа плюс x, где x - это время от нескольких секунд или минут (в большинстве случаев) до двух 15 минут. Многие временные метки отличаются только целыми часами (x = 0).

Я предполагаю, что это должно что-то сделать с «коррекцией ошибок времени». Я нашел функцию cvs2svn (http://www.mcs.anl.gov/~jacob/cvs2svn/features.html). Возможно, это тоже связано с часовыми поясами.

Результаты моих тестов показывают, что все транзакции с одним файлом в наборе изменений различаются целыми часами. Это поддерживает мою «гипотезу часового пояса». Но это также приводит меня к вопросу о том, как определяется временная метка изменений множеств с несколькими файлами.

Я попытался пройти через код и узнал (с помощью Google), что в config.py cvs2svn_lib есть «COMMIT_THRESHOLD». Думаю, он используется для разбиения файлов на основе CVS вместе. Несмотря на то, что код выглядит хорошо, мой недостаток технического понимания хранилищ CVS, SVN и Git не позволяет мне понять.

Поэтому я был бы признателен, если кто-то может ответить на следующие вопросы:

  • Как cvs2svn/cvs2git определяет фиксацию метки времени наборов изменений с несколькими файлами?
  • Как работает «коррекция ошибок времени» cvs2svn/cvs2git? (Для меня функциональный фон является более важным, чем технический.)

Сердечные приветы

Edit:

Как кто-то рассматривал этот вопрос, как «слишком широка», я боюсь, что я не сделал моя точка достаточно ясна. Поэтому я хотел бы привести конкретный (пока вымышленный) пример:

cvs2git нашел 3 изменения файла для одного набора изменений. Они совершили в тот же день (скажем, 30 февраля 2016 года). Но их время отличается:

  • Файл 1: 12:34:56
  • Файл 2: 12:35:38
  • Файл 3: 12:36:09

Если бы это было только файл 1, я думаю, что cvs2git использует 2016-02-30T12: 34: 56 как временную метку для Git commit. Но какая временная метка выбрана, когда коммиты для всех 3 файлов принадлежат одному набору изменений?

В связи с этим, когда мой репозиторий конвертируется, время, похоже, настраивается ровно на 1 или 2 часа. Это также происходит, когда в наборе изменений есть только один файл. Наверное, это какая-то настройка часового пояса. Поэтому я хотел бы знать, почему «коррекция ошибок времени» изменила мои временные метки, чтобы проверить, принимаю ли я эти изменения или нет. Я сделал некоторые статистические данные о преобразованном репозитории Git, и время фиксации кажется мне в порядке; но этого недостаточно для меня.

+0

Я вижу, что кто-то проголосовал, чтобы закрыть это как «слишком широкий» (что, вероятно, так). Я не знаю подробностей внутренних функций cvs2 (git/svn) и не могу ответить, но стоит упомянуть, что CVS представляет собой файлоориентированную систему централизованного сервера, в то время как SVN и Git ориентированы на фиксацию (и централизуются и распределены соответственно). Ориентация файла означает, что выполнение хорошей работы по преобразованию требует сопоставления отдельных ревизий файлов (экземпляров cvs ci) в одном единственном коммитах, и для этого потребуется некоторая гибкость timestamp. – torek

+0

Благодарим за комментирование. Я добавил пример, чтобы понять, что я имею в виду. Кстати: я знаю об основных отличиях CVS и Git, особенно о файле и принципах фиксации. Вот почему я хотел бы переключиться на Git. Хотя, я не знаю, как функции реализованы в CVS или Git или cvs2git. Для меня это разница между функциональным и техническим пониманием. Может быть, это немного похоже на то, что я не понимаю, как работают CVS и Git, потому что английский это не мой первый язык. – nemo

+0

I _think_ CVS хранит временные метки в UTC. Когда вы говорите, что временная метка git составляет 1-2 часа, это также в UTC, поэтому ошибка является абсолютной или git отображает время в часовом поясе? (Ваш вопрос кажется хорошо сформулированным и исследованным, поэтому я не хочу оскорблять/раздражать вас здесь, но я просто хотел проверить.) Что касается того, какая из трех временных меток была выбрана, когда git commit изготовлен из нескольких записей cvs : это имеет значение? Я знаю, я знаю, я тоже точно инженер, и я хочу знать, как это работает, но если это не влияет на что-то, возможно, проще всего просто знать, что он делает, это reasonab – Mort

ответ

2

Вы задаете два вопроса:

  1. Как временные метки, генерируемые фиксаций прикасаясь несколько файлов?

    Для коммитов, которые изменяют файлы, cvs2svn/cvs2git берет самую новую метку времени среди коммитов уровня файла, которые содержат фиксацию. Однако, если эта временная метка выше метки времени предыдущей фиксации или более чем на один день после времени преобразования, вместо этого она выбирает временную метку за одну секунду после предыдущей фиксации.

    Для коммитов, которые связаны с разветвлением или тегами (для которых CVS не записывает временные метки вообще), отметка времени устанавливается равной одной секунде после отметки времени предыдущей фиксации.

  2. Почему временные метки иногда отключены целым числом часов?

    CVS записывает временные метки в UTC без записи часового пояса, а cvs2svn/cvs2git использует эти временные метки как есть, не пытаясь угадать часовой пояс. Поэтому отметки времени должны быть правильными, но выражены в UTC.

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

Файл doc/design-notes.txt проект cvs2svn документы алгоритмы, используемые cvs2svn/cvs2git достаточно подробно.

+0

Спасибо за ваш ответ; и 1up для документации, которую я не нашел. Для последующих поколений: найдите главу «ТопологическийСортПасс». – nemo

+0

Я только что узнал, что сейчас я не могу повышать; Прости. Кстати: все часовые разницы вызваны часовыми поясами: +1 час для обычного времени и +2 часа для летнего времени.Когда я использую 'git log', отображается правильная (UTC) временная метка. – nemo