На мой взгляд, система тегов Hg немного запутана, потому что создание тега меняет историю и требует слияния и фиксации, даже если файл проекта не изменился. Пометка может очень быстро обременять график истории.
Я использовал тегирование SVN, которое было сделано в отдельной ветке, что имеет преимущество в том, что не нужно изменять историю рабочей ветки. Кроме того, тегирование может быть сделано из любой ветви, потому что Hg берет теги из файлов .hgtags на заголовках всех ветвей.
Небольшой скрипт ниже создает ветку "tagging" и помещает в нее теги. Он объединяет текущую ветку с веткой «tagging», поэтому легко увидеть, с какого тега changeset был сделан (особенно это позволяет избежать длительного обновления при переключении ветви).
Вероятно, это можно улучшить, но это соответствует моим потребностям.
Я настоятельно рекомендую сделать клон вашего проекта перед тестированием этого скрипта, если он не работает так, как вы ожидаете!
#!/bin/bash
function echo_red()
{
echo -n -e "\e[01;31m"
echo -n "$1"
echo -e "\e[00m"
}
export -f echo_red
# Display the help and exit
function show_help {
echo "Usage: $0 [hg_tag_options ...]"
echo " tags a version (current if not specified) in the 'tagging' branch."
echo " Options are the 'hg tag' ones, plus"
echo " -?, -h, --help Show (this) help"
exit 1
}
# Parse the command-line arguments
function parse_args {
for arg in "${commandline_args[@]}"
do
case "$arg" in #(
'-?' | -h | --help )
show_help
;;
esac
done
}
commandline_args=("$@")
if [ "$commandline_args" = "" ]
then
show_help
fi
parse_args
VER=`hg id | sed 's#\([0-9a-z]*\).*#\1#g'`
BRANCH=`hg branch`
# Check for clean directory
TEST=`hg st -S -q`
if [ "$TEST" != "" ]
then
echo_red "Directory contains unresolved files !"
exit 1
fi
hg update --check >/dev/null
if [ $? -ne 0 ]
then
echo_red "Directory contains unresolved files !"
exit 1
fi
# Switch to tagging branch
hg update tagging >/dev/null
if [ $? -ne 0 ]
then
echo "Creating new 'tagging' branch."
hg update default >/dev/null
hg branch tagging
fi
# Merge if changes detected
TEST=`hg diff -r $VER -X .hgtags --stat`
if [ "$TEST" != "" ]
then
#take only the 'tagging' version of hgtags
cp .hgtags .hgtags.bak
hg merge -r $VER --tool internal:other >/dev/null
rm .hgtags
mv .hgtags.bak .hgtags
hg commit -m Merged
fi
# Tag and Switch back to original
hg tag -r $VER $@
hg update $BRANCH >/dev/null
hg update $VER >/dev/null
Пример использования:
hg_tag.sh [-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] test_v1_5