Действительно хорошее решение timhc22 Единственное, что она занимает последнюю метку (независимо от ветви) Если вы работаете над проектом с несколькими филиалами вы могли бы иметь проблему , Я предложил только улучшение с вашей базой.
#!/bin/sh
# retrieve branch name
BRANCH_NAME=$(git branch | sed -n '/\* /s///p')
# remove prefix release
REGEXP_RELEASE="release\/"
VERSION_BRANCH=$(echo "$BRANCH_NAME" | sed "s/$REGEXP_RELEASE//")
echo "Current version branch is $VERSION_BRANCH"
# retrieve the last commit on the branch
VERSION=$(git describe --tags --match=$VERSION_BRANCH* --abbrev=0)
# split into array
VERSION_BITS=(${VERSION//./ })
#get number parts and increase last one by 1
VNUM1=${VERSION_BITS[0]}
VNUM2=${VERSION_BITS[1]}
VNUM3=${VERSION_BITS[2]}
VNUM3=$((VNUM3+1))
#create new tag
NEW_TAG="$VNUM1.$VNUM2.$VNUM3"
echo "Updating $VERSION to $NEW_TAG"
#get current hash and see if it already has a tag
GIT_COMMIT=`git rev-parse HEAD`
NEEDS_TAG=`git describe --contains $GIT_COMMIT`
#only tag if no tag already (would be better if the git describe command above could have a silent option)
if [ -z "$NEEDS_TAG" ]; then
echo "Tagged with $NEW_TAG (Ignoring fatal:cannot describe - this means commit is untagged) "
git tag $NEW_TAG
git push --tags
else
echo "Already a tag on this commit"
fi
Это работает, например, если у вас есть:
- мастер филиала: будет создавать мастер-XYZ
- релиз/XY: создаст XYZ
В любом случае Большое спасибо, это мне очень помогло.
Это вызвано крючком git (если да, то какой?), или вы запускаете это вручную вместо 'git push'? – Gady
Это просто файл .sh, который я запускаю вручную (но файл .sh также запускается автоматически как часть сборки Jenkins, в которой проекту всегда требуется обновление до номера версии). Вероятно, это могло бы быть добавлено к крюку (я действительно мало знаю о git-крючках, чтобы быть честным, поэтому не могу помочь там, я боюсь!) – timhc22
Добавить '2>/dev/null' в конце' git описать - содержит $ GIT_COMMIT', чтобы удалить «фатальное» предупреждение. Спасибо за скрипт – koxon