Можно ли импортировать репозиторий MKS Integrity в git?
Мне нужно только исходное дерево и его историю. Я не забочусь о требованиях / проблемах на данный момент. Я немного поиграл с командной строкой, чтобы выяснить, смогу ли я получить список пакетов изменений для транка и некоторых путей разработки. Я подумал, что должна быть возможность извлечь diff для каждого пакета изменений и использовать его для воспроизведения всех изменений с момента первого коммита в git. Что-то вроде этого:
- получить первый коммит и добавить его в git
- получить следующий CP
- получить разницу для CP
- применить diff к git working dir
- добавлять и фиксировать изменения в git
- повторите с (2.) до последнего CP
Вы также можете заменить пакет изменений контрольной точкой (для меня это будет достаточно).
Более простым способом было бы просто извлечь CP и добавить / зафиксировать в git. Но тогда вы потеряли бы отслеживание операций добавления, удаления, перемещения и переименования.
Кто-нибудь знает, как получить унифицированный diff из "si diff"? Это уже очень помогло бы.
Есть идеи?
Edit2:
Добавил ответ, который показывает, как я на самом деле сделал миграцию...
5 ответов
Проблема с MKS Integrity заключается в их уникальном хранилище, в котором все находится:
- требования,
- планы испытаний,
- контрольные примеры,
- функции,
- задачи разработчика,
- запросы на развертывание
Поскольку эти данные могут эволюционировать независимо друг от друга, в своем собственном темпе импортировать их все в одном репозитории Git было бы плохой идеей: вы можете клонировать только все содержимое репозитория Git (даже если вы можете ограничить глубину этого клона).).
Это означает, что вы получите все документы, даже если вы просто заинтересованы в коде.
Экспорт MKS Integrity подразумевал бы определение первых множества Git-репозиториев, которые будут действовать как подмодули.
Мне нужно только исходное дерево и его историю.
Как обычно, я бы порекомендовал только импортировать:
- основные лейблы (для чего-либо старше года или любого периода, который вам удобнее, экзамен не понадобится полностью, потому что он настолько старый)
- все лейблы (мажорные и минорные) за последние годы.
И я не стал бы импортировать все в одном репозитории Git, если вы не уверены, что все ваши источники представляют собой одну систему, разработанную как все (а не несколько "модулей", разработанных независимо)
Более простым способом было бы просто извлечь CP и добавить / зафиксировать в git.
Это был бы способ продолжить.
Но тогда вы потеряли бы отслеживание операций добавления, удаления, перемещения и переименования.
Нет! Ты бы не! Git выведет эти операции.
Это преимущество того, что файл VCS является файлом.
Я не могу опубликовать программу, которую я написал, потому что я не делал это в свое время. Тем не менее, я могу опубликовать, как я это сделал. Это должно быть легко повторить с любым языком сценариев. Инструмент, который я написал, переносил только одну ветку за раз. Я бы сказал ему, какую ветку я хочу (например, 1.21.1), а также начальную и конечную ревизию в ветви (например, 4 и 78 перенесут все ревизии, начиная с 1.21.1.4 до 1.21.1.78). Чтобы иметь все филиалы в одном репо, я бы предоставил каталог.git, который будет использоваться для импорта в.
- начальный цикл от начальной ревизии до конечной ревизии
- CURRENTREV=BRANCH.loopcounter
- создать каталог репо
- переместить.git dir в каталог репо
- переместить файл.gitignore в каталог репо
- chdir в каталог репо
- создать песочницу mks внутри директории репозитория через "si createandbox -P MKS_PROJECT_PATH --yes --projectRevision=CURRENTREV
- получить описание ревизии через "si viewprojecthistory --rfilter=range:CURRENTREV-CURRENTREV", захватить вывод!
- извлечь пользователя, дату, метку (и), комментарии из предыдущего вывода
- "мерзавец добавить."
- передать извлеченную информацию сверху в "git commit -qF -" (нельзя сделать -m, если вы хотите несколько строк, например комментарий контрольной точки)
- удалить песочницу через "si dropsandbox --yes index.pj"
- переместить.git и.gitignore в место сохранения (для следующей итерации)
- удалить все оставшиеся файлы в каталоге с песочницей
- перейти к родительскому каталогу (..)
- удалить каталог песочницы / репо
- создать окончательный Git DIR
- переместить.git и.gitignore в финальный каталог git
- "git reset --hard HEAD"
Готово.
MKS использует своего рода кодировку ASCII для своей строки, а git обычно использует UTF-8, поэтому следите за проблемами при импорте метаданных в git (имена пользователей, комментарии, теги и т. Д.).
Для большего количества веток сделайте это:
- в каталоге git извлеките ревизию, с которой должна начинаться ветка, и создайте ветку ("git checkout -b NEWBRANCHNAME")
- Теперь переместите.git и.gitignore в место сохранения и удалите весь каталог.
- Теперь сделайте то же самое, что и выше
Еще одна вещь: "Си" является инструментом командной строки MKS. Поэтому вам нужно либо указать полный путь, либо указать путь в пути поиска.
К сожалению, в настоящее время si diff не поддерживает унифицированный diff. Существует запрос на изменение, чтобы он это сделал, но пока еще не было слишком много клиентов, запрашивающих эту функцию.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я работаю на PTC (который приобрел MKS).
Это работает для контрольно-пропускных пунктов...
https://gist.github.com/2369049
К сожалению, контрольные точки являются, по-видимому, единственной вещью, которая действительно имеет какой-то смысл из MKS -> GIT, поскольку контрольная точка действительно ближе всего к "снимку", который GIT вызывает коммит.
MKS имеет так много несовместимых понятий (для отслеживания версий файлов, веток, которые не имеют ничего общего с ветвями GIT, контрольными точками и т. Д.), Которые могут развиваться независимо друг от друга, и очень трудно сказать, как перенести разумную историю в GIT. Вероятно, есть много способов сделать это, и ни один из них не является более "правильным", чем следующий.
Тем не менее, я хотел бы услышать некоторые хорошие идеи.:)
Я хотел бы видеть решение, которое разумно фиксирует версии для каждого файла. В некоторых обсуждениях мы обсуждали идею о попытке выстроить версии MKS для каждого файла по времени коммита или что-то в этом роде. Таким образом, мы можем сформулировать концепцию "репо", развивающуюся через фиксацию, которая содержит изменения в нескольких файлах.
Я использую этот инструмент для импорта пакетов изменений из MKS в Mercurial, импорт в git должен быть очень похожим; или вы можете сначала импортировать в Mercurial, а затем использовать инструмент git для импорта Mercurial.
https://github.com/arsane/py-mks2hg.git
Он попытается выяснить все пакеты изменений, которые находятся в указанном проекте, и зафиксировать в новом хранилище Mercurial по порядку.