Как метки времени фиксации генерируются в cvs2git/cvs2svn?

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

До сих пор я определил, что временные метки между определенными ревизиями CVS отличаются на 1 или 2 часа плюс x, где x - это время от нескольких секунд или минут (в большинстве случаев) до двух 15 минут. Многие временные метки отличаются только целыми часами (х =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? (Для меня функциональный фон важнее технического.)

С уважением

Редактировать:

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

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

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

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

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

1 ответ

Решение

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

  1. Как создаются временные метки для коммитов, затрагивающих несколько файлов?

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

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

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

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

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

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

Другие вопросы по тегам