Я не использую Mercurial, но я хотел бы начать, поэтому я читаю об этом. Единственная система SCM, которую я широко использовал - это CVS. Большая часть того, что я читал о Mercurial, имеет смысл и звучит хорошо. Но я поочередно шокирован и озадачен тем, как он делает теги.
Тег - это просто псевдоним для набора изменений (и под «набором изменений» мы на самом деле подразумеваем состояние, являющееся результатом набора изменений). Здорово. Сопоставление тегов с идентификаторами наборов изменений сохраняется в файле .hgtags
. Тоже круто. Файл .hgtags
имеет версию.
Что?
Это имеет много противоречивых последствий. Например, если я фиксирую набор изменений, который я затем хочу пометить (скажем, код, который будет формировать выпуск 1.0), мне придется снова зафиксировать после тегирования, чтобы поместить обновленный файл тега в хранилище. И если потом я обновлю этот набор изменений с тегами позднее, рабочая копия не будет содержать никаких сведений об этом теге. Если я сделаю некоторую работу, основав, таким образом, новую ветвь (скажем, для исправлений, направляющуюся к 1.1), эта ветвь не будет иметь никакого знания о теге, из которого она выросла. Если я не скопирую это вручную, то есть.
И так как разработка продолжается как для исходной ствола, так и для моей новой ветви, с созданием тегов, помечающих важные наборы изменений (выпуск 2.0 в стволе, выпуски исправлений 1.1 и 1.2 в ветви), обе ветви будут идти в неведении. из тегов другой ветви. Итак, если я закончу работать над одной веткой и захочу переключиться на какую-то конкретную ревизию в другой (скажем, я заканчиваю релиз 1.2 с исправлением ошибок, но теперь мне нужно начинать с исправления 2.1, основанного на 2.0), я уже напичкан. Моя текущая ревизия не знает о 2.0!
Что я могу сделать?
- Я могу попросить кого-нибудь, кто работает над веткой 2.x, прочитать фактический ID набора изменений для 2.0 и использовать его явно, но это ужасно.
- Я мог бы назвать свои ветви, а также использовать теги, чтобы я мог перейти к началу ветви 2.x, таким образом узнав о новых тегах, а затем вернуться к тегу 2.0. Предполагая, что ветви, в отличие от тегов, видны повсеместно - так ли это? Даже если это так, это кажется неуклюжим.
- Я мог бы поддерживать один глобальный
hgtags
файл вне репозитория и использовать пару хуков, чтобы получить копию обновления, перезаписать локальную копию и скопировать любые изменения в коммите. Я не уверен, как это будет работать в многопользовательской среде, где разработчики вносят изменения в общий репозиторий; мне может понадобиться отдельный репозиторий только для файла hgtags
.
- Я мог бы использовать локальные теги, которые стоят вне механизма управления версиями, и таким образом избежать всей проблемы. Как и в случае с общими глобальными тегами, мне нужно было бы создать механизм для синхронизации файла
localtags
между разработчиками.
Ни одно из этих решений не кажется абсолютно великолепным. Что мне делать?
Здесь предполагается, что я управляю ветвями, используя именованные ветки в одном репозитории, а не репозиторий на ветку. Будет ли ситуация лучше, если я сделаю последнее?