Версия TL; DR: можно ли реорганизовать репозиторий Mercurial без нарушения истории Kiln / Fogbuz? Или мне нужно начинать заново?
У меня есть настоящий беспорядок в репозитории, нуждающийся в серьезной очистке, и я пытаюсь понять, как это лучше всего сделать. Цель состоит в том, чтобы полностью удалить несколько файлов - они никогда не должны появляться ни в каких коммитах - переместить несколько каталогов и разделить один каталог в совершенно отдельный репозиторий. Я знаю, знаю - нельзя изменить историю. В этом случае, однако, либо история изменений, либо создание новых репозиториев с нуля.
Рассматриваемый репозиторий управляется в Mercurial, а удаленный репозиторий размещен в Kiln. Проблемы отслеживаются в Fogbugz. Благодаря некоторым правилам обработки ссылок фиксации, любые ссылки в сообщении фиксации на номер проблемы (дела), например Case 123
, преобразуются в ссылки на рассматриваемый случай Fogbugz. В свою очередь, к случаю, который был упомянут, добавлено примечание с сообщением фиксации.
Текущая структура
В настоящее время файловая структура проекта выглядит примерно так:
- /
+- includes/
| +- functions-related-to-abc.php
| +- functions-related-to-xyz.php
| +- class-something.php
| +- classes-several-things.php
| +- random-file.php
| ...
|
+- development/
| +- a-plugin-folder/
| | +- some-file.php
| | +- file-with-sensitive-and-non-sensitive-info.php
| | ...
| |
| +- some-backend-functions-related-to-coding.php
| ...
|
+- index.php
+- test-config-file.php
...
Целевая структура
Структура, которую я хочу, выглядит примерно так:
- /
+- build/
+- doc/
+- src/
| +- functions/
| | +- abc.php // renamed from includes/functions-related-to-abc.php
| | +- xyz.php // renamed from includes/functions-related-to-xyz.php
| | ...
| |
| +- classes/
| | +- something.php // renamed from includes/class-something.php
| | +- several-things.php // renamed from includes/classes-several-things.php
| | ...
| |
| +- view/
| | +- random-file.php // formerly includes/random-file.php
| ...
|
| +- development/
| | +- some-backend-functions-related-to-coding.php
| | ...
| +- index.php
| ...
|
+- test/
...
a-plugin-folder
переместится в свой отдельный репозиторий. test-config-file.php
больше не будет отслеживаться в репозитории. В идеале я также сделаю небольшую обрезку и переименую ветки, пока я нахожусь в этом.
В мире моей мечты file-with-sensitive-and-non-sensitive-info.php
каким-то образом отслеживался бы постоянно, но с конфиденциальной информацией (парой паролей), выдернутой в файл конфигурации, который не находится под контролем версий. Я понимаю, что это, вероятно, принятие желаемого за действительное.
Мое текущее мышление
В настоящее время я считаю, что мой список желаний в принципе невозможен: я могу создавать новые, правильно структурированные репозитории с этого момента, но не могу сохранить свою историю изменений, а также внести радикальные структурные изменения, которые мне нужно внести. В этом представлении я должен взять текущую базу кода, реорганизовать ее так, как я хочу, и зафиксировать ее как набор изменений 1 для двух новых репозиториев (корневой репозиторий и репозиторий плагинов). Тогда я бы просто сохранил копию старого репозитория где-нибудь для справки. Основные недостатки: (1) я теряю всю свою историю и (2) перекрестные ссылки Kiln и Fogbugz для исторических коммитов - это тост.
Мой вопрос
Итак, вот вопрос: есть ли способ сделать то, что я хочу - реструктурировать, вытащить несколько файлов и привести все в порядок, не теряя при этом всю свою историю?
Я рассмотрел возможность использования расширения hg convert
, интенсивно используя параметры filemap
, splicemap
и branchmap
. Проблемы, которые я вижу с этим подходом, включают: (1) нарушение всех предыдущих сборок, (2) полное отсутствие file-with-sensitive-and-non-sensitive-info.php
в предыдущих сборках (или оставление его внутри, что противоречит сути) и (3) рендеринг многих сообщений фиксации дико неверны в той степени, в которой они относятся к именам файлов или структуре репо. Другими словами, я не уверен, что этот вариант принесет мне большую пользу, чем просто запуск чистых, правильно структурированных репозиториев.
Я также рассмотрел крайний вариант: написать своего рода собственный сценарий для создания нового репозитория, просматривая каждую существующую фиксацию, удаляя конфиденциальную информацию из file-with-sensitive-and-non-sensitive-info.php
, переписывая сообщения фиксации в необходимом объеме и фиксируя исправленную версию всего. Теоретически это могло бы решить все мои проблемы, но ценой изобретения велосипеда и, вероятно, занимало бы смехотворное количество времени. Я ищу что-то, что не эквивалентно написанию всего hg
расширения.
РЕДАКТИРОВАТЬ: Я подумываю о создании пустого репозитория, а затем написании сценария, который использует hg export
и hg import
для переноса наборов изменений по одному, внося изменения там, где это необходимо, для удаления конфиденциальной информации, такой как пароли, из файлов. Есть ли причина, по которой это не сработает?