Skip to content

Instantly share code, notes, and snippets.

@linyows
Created March 22, 2012 06:36
Show Gist options
  • Save linyows/2156669 to your computer and use it in GitHub Desktop.
Save linyows/2156669 to your computer and use it in GitHub Desktop.
増えすぎたgitのtagを削除するスクリプト
#!/bin/zsh
case "$1" in
test)
TYPE=$1
;;
clean)
TYPE=$1
;;
*)
echo "Usage: $0 {clean|test}"
exit 2
esac
note() { echo "\033[1;32m$1\033[0m" } # green
notice() { echo "\033[1;34m$1\033[0m" } # blue
alert() { echo "\033[1;33m$1\033[0m" } # yellow
warn() { echo "\033[1;31m$1\033[0m"; } # red
success_face() { echo "\033[1;32m$1\033[1;33m ;)\033[0m" } # green
warn_face() { echo "\033[1;31m$1\033[1;33m O_o\033[0m" } # red
MAX_MINOR=0
MAX_FIXED=0
OLD_MAX_FIXED=0
OLD_MAX_TAG=""
FIRST=1
note "Begins git tags clean."
notice "git fetch --tags"
git fetch --tags
# set array of tag
TAGS=$(git tag)
TAG=(`echo $TAGS`)
#notice "tags: $TAG"
# set last minor version
# TAG_COUNT=${#TAG[@]}
# LAST_TAG=${TAG[$TAG_COUNT]}
# CONVERTED_LAST_TAG=`echo $LAST_TAG | sed 's/\./ /g'`
# LAST_TAG_ARRAY=(`echo $CONVERTED_LAST_TAG`)
# typeset -i LAST_MINOR=$LAST_TAG_ARRAY[2]
MAXIMUM_MAJOR=0
MAXIMUM_MINOR=0
for i in `seq 1 ${#TAG[@]}`; do
VER=`echo ${TAG[$i]} | sed 's/\./ /g'`
VERS=(`echo $VER`)
typeset -i MAJOR=$VERS[1]
typeset -i MINOR=$VERS[2]
if [ $MAXIMUM_MAJOR -lt $MAJOR ]; then
typeset -i MAXIMUM_MAJOR=$MAJOR
typeset -i MAXIMUM_MINOR=$MINOR
elif [ $MAXIMUM_MINOR -lt $MINOR ]; then
typeset -i MAXIMUM_MINOR=$MINOR
fi
done
#alert $MAXIMUM_MAJOR.$MAXIMUM_MINOR
LATEST_MAJOR=0
LATEST_MINOR=0
for i in `seq 1 ${#TAG[@]}`; do
VER=`echo ${TAG[$i]} | sed 's/\./ /g'`
VERS=(`echo $VER`)
typeset -i MAJOR=$VERS[1]
typeset -i MINOR=$VERS[2]
typeset -i FIXED=$VERS[3]
if [ $LATEST_MAJOR -eq $MAXIMUM_MAJOR -a $LATEST_MINOR -eq $MAXIMUM_MINOR ]; then
continue
fi
if [ $FIRST -eq 1 ]; then
typeset -i LATEST_MAJOR=$VERS[1]
typeset -i LATEST_MINOR=$VERS[2]
typeset -i LATEST_FIXED=$VERS[3]
FIRST=0
# $LATEST_MAJOR < $MAJOR
elif [ $LATEST_MAJOR -lt $MAJOR ]; then
# $LATEST_MINOR < $MAX_MINOR
if [ $LATEST_MINOR -lt $MAX_MINOR ]; then
DELETE_TAGS=(${DELETE_TAGS[@]} ${TAG[$i-1]})
else
#echo ${TAG[$i-1]}
fi
#echo "A) Current: $MAJOR.$MINOR.$FIXED, Latest: $LATEST_MAJOR.$LATEST_MINOR.$LATEST_FIXED"
typeset -i LATEST_MAJOR=$VERS[1]
typeset -i LATEST_MINOR=$VERS[2]
typeset -i LATEST_FIXED=$VERS[3]
MAX_MINOR=0
# $LATEST_MINOR < $MINOR
elif [ $LATEST_MINOR -lt $MINOR ]; then
OLD_MAX_FIXED=0
OLD_MAX_TAG=""
# $LATEST_FIXED < $MAX_FIXED
if [ $LATEST_FIXED -lt $MAX_FIXED ]; then
DELETE_TAGS=(${DELETE_TAGS[@]} ${TAG[$i-1]})
else
#echo ${TAG[$i-1]}
fi
# $MAX_MINOR < $MINOR
if [ $MAX_MINOR -lt $MINOR ]; then
MAX_MINOR=$MINOR
fi
#echo "B) Current: $MAJOR.$MINOR.$FIXED, Latest: $LATEST_MAJOR.$LATEST_MINOR.$LATEST_FIXED"
typeset -i LATEST_MINOR=$VERS[2]
typeset -i LATEST_FIXED=$VERS[3]
MAX_FIXED=0
else
# $LATEST_FIXED < $FIXED
if [ $LATEST_FIXED -lt $FIXED ]; then
DELETE_TAGS=(${DELETE_TAGS[@]} ${TAG[$i-1]})
else
if [ $OLD_MAX_FIXED -eq 0 ]; then
elif [ $OLD_MAX_FIXED -lt $LATEST_FIXED ]; then
#echo DEL: $OLD_MAX_TAG
DELETE_TAGS=(${DELETE_TAGS[@]} ${OLD_MAX_TAG})
fi
#echo ${TAG[$i-1]}
typeset -i OLD_MAX_FIXED=$LATEST_FIXED
OLD_MAX_TAG=${TAG[$i-1]}
fi
# $MAX_FIXED < $FIXED
if [ $MAX_FIXED -lt $FIXED ]; then
MAX_FIXED=$FIXED
fi
#echo "C) Current: $MAJOR.$MINOR.$FIXED, Latest: $LATEST_MAJOR.$LATEST_MINOR.$LATEST_FIXED"
typeset -i LATEST_FIXED=$VERS[3]
fi
# for q in `seq 1 ${#VERS[@]}`; do
# echo ${VERS[$q]}
# done
done
if [ ${#DELETE_TAGS[@]} -ne 0 ]; then
for i in `seq 1 ${#TAG[@]}`; do
SEARCH=`echo $TAG[$i] | sed 's/\./-/g'`
SUBJECT=`echo $DELETE_TAGS | sed 's/\./-/g'`
REPLACED=(`echo $SUBJECT | sed -e "s/.*\($SEARCH\).*$/\1/g"`)
REPLACED=$REPLACED""
if [ $REPLACED = $SEARCH ]; then
warn $TAG[$i]
else
echo $TAG[$i]
fi
done
if [ $TYPE = 'clean' ]; then
notice "\n$ git tag -d $DELETE_TAGS"
git tag -d $DELETE_TAGS
for i in `seq 1 ${#DELETE_TAGS[@]}`; do
DELETE_REMOTE_TAGS=(${DELETE_REMOTE_TAGS[@]} ":refs/tags/${DELETE_TAGS[$i]}")
done
notice "\n$ git push origin $DELETE_REMOTE_TAGS"
git push origin $DELETE_REMOTE_TAGS
success_face "Successfully tag clean!"
else
notice "\n$ git tag -d $DELETE_TAGS"
for i in `seq 1 ${#DELETE_TAGS[@]}`; do
DELETE_REMOTE_TAGS=(${DELETE_REMOTE_TAGS[@]} ":refs/tags/${DELETE_TAGS[$i]}")
done
notice "\n$ git push origin $DELETE_REMOTE_TAGS"
fi
else
success_face "Nothing tag clean!"
fi
@bbq-all-stars
Copy link

このスクリプトだと、git tagコマンドはデフォルトは文字列ソートになるので、
... 1.2.0, 1.3.0, ... 1.20.0, 1.20.1, ...
とタグがあった場合に、1.2.0は1.20.0のマイナーバージョンだと判断されて消してしまうようです。

git tagコマンドを以下のように修正すれば、バージョン番号順でソートされるので、1.2.0が消えてしまうことはなさそうです。

--- a/git_tag
+++ b/git_tag
@@ -30,7 +30,7 @@ notice "git fetch --tags"
 git fetch --tags

 # set array of tag
-TAGS=$(git tag)
+TAGS=$(git tag -l --sort=version:refname "*")
 TAG=(`echo $TAGS`)
 #notice "tags: $TAG"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment