2015-12-21 11 views
2

Предположим, у меня есть 50+ ветвей функций в Mercurial. Если я это сделаю:Как теги в Mercurial автоматически распространяются на все ветки?

hg tag some-tag 

В одной из ветвей, кажется, распространяется на все ветви. Независимо от того, в какой ветке я вхожу, hg tags покажет все теги. Все хорошо и хорошо. Но если я hg log, он скажет мне, что ревизия, содержащие изменения .hgtags произошла в конкретной отрасли:

changeset: 4:ea48c727fbcd 
branch:  feat1 
tag:   tip 
user:  Daniel <[email protected]> 
date:  Mon Dec 21 20:15:11 2015 +0100 
files:  .hgtags 
description: 
Added tag feat-1.0 for changeset 3c81a17d4b31 

Как Mercurial держать .hgtags синхронно во всех отраслях? Я читал Mercurial Tag Design, но в нем не упоминается никаких особенностей.

Причина, по которой я спрашиваю, заключается в том, что мы используем Rhodecode для Mercurial на работе, и эта распространенность, по-видимому, значительно отстает от , когда она находится под большой нагрузкой.

Это отставание очень раздражает, так как я могу увидеть последний тег в файле .hgtags, но hg tags не перечисляет последний тег. Выполнение другого тега иногда устраняет проблему (и, возможно, это ошибка в Rhodecode), но я хотел бы знать, как это работает, чтобы лучше понять базовый механизм.

+0

В какой версии вы работаете? Mercurial 3.4 и 3.5 имеют довольно значительные улучшения производительности для кеша тегов (а 3.3 - регрессия производительности). –

+0

Не обращайте внимания на мой предыдущий вопрос, я неправильно понял, что вы имели в виду под «лаг». Если в тегах 'hg 'отсутствует то, что находится в вашем текущем' .hgtags' (и тег не был удален в другой ветке или в другой редакции - так вы иногда можете законно видеть тег в '.hgtags', но а не в 'hg tags'), это будет означать, что есть ошибка. FYI, Mercurial использует кеш, чтобы избежать довольно дорогостоящих вычислений, и обновляет их по мере поступления новых коммитов; если есть ошибка, скорее всего, это будет проблема с кешем тегов. –

ответ

3

Цитируя некоторые documentation:

теги, которые действуют в любой данный момент времени теги, указанные в каждой головке. Возникает сложный случай, если один и тот же тег определяет две разные версии в двух разных головах. Нет общего «правильного» решения этой проблемы.

Если два определения/изменения тегов кажутся несвязанными, выигрывает «самый верхний» (например, номер с более высоким номером цифровой версии).
...
Однако, если тег был определен общим предком обеих головок, но изменился только на одну голову, измененный один победил над неизменным.

также:

Если есть только одна голова только последняя строка, где отображается учитывается тег. Если есть несколько головок, предыдущие определения тега используются для определения того, какая голова содержит самый последний тег .... Если тэг указывает на 00000000000000000000000000000000000000000000, считается, что он удален.

Мое предположение - это отставание, когда у вас есть несколько тегов в нескольких ветвях, требующих разрешения, Mercurial должен искать каждый набор изменений, чтобы определить его ревизию, чтобы определить «tipmost». Только хэши изменения и имя тега находятся в .hgtags.