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