mirror of
https://github.com/git/git.git
synced 2024-11-17 14:34:49 +01:00
bc162e40ea
The current "git tag -s" thing always uses the tagger name as the signing user key, which is very irritating, since my key is under my email address, but the tagger key obviously contains the actual machine name too. Now, I could just use "GIT_COMMITTER_EMAIL" and force it to be my real email, but I actually think that it's nice to see which machine I use for my work. So rather than force my tagger ID to have to match the gpg key name, just support the "-u" flag to "git tag" instead. It implicitly enables signing, since it doesn't make any sense without it. Thus: git tag -u <gpg-key-name> <tag-name> [<tagged-object>] will use the named gpg key for signing. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
92 lines
1.6 KiB
Bash
Executable file
92 lines
1.6 KiB
Bash
Executable file
#!/bin/sh
|
|
# Copyright (c) 2005 Linus Torvalds
|
|
|
|
. git-sh-setup || die "Not a git archive"
|
|
|
|
usage () {
|
|
echo >&2 "Usage: git-tag [-a | -s | -u <key-id>] [-f] [-m <msg>] <tagname>"
|
|
exit 1
|
|
}
|
|
|
|
annotate=
|
|
signed=
|
|
force=
|
|
message=
|
|
username=
|
|
while case "$#" in 0) break ;; esac
|
|
do
|
|
case "$1" in
|
|
-a)
|
|
annotate=1
|
|
;;
|
|
-s)
|
|
annotate=1
|
|
signed=1
|
|
;;
|
|
-f)
|
|
force=1
|
|
;;
|
|
-m)
|
|
annotate=1
|
|
shift
|
|
message="$1"
|
|
;;
|
|
-u)
|
|
annotate=1
|
|
signed=1
|
|
shift
|
|
username="$1"
|
|
;;
|
|
-*)
|
|
usage
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
name="$1"
|
|
[ "$name" ] || usage
|
|
if [ -e "$GIT_DIR/refs/tags/$name" -a -z "$force" ]; then
|
|
die "tag '$name' already exists"
|
|
fi
|
|
shift
|
|
|
|
object=$(git-rev-parse --verify --default HEAD "$@") || exit 1
|
|
type=$(git-cat-file -t $object) || exit 1
|
|
tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1
|
|
: ${username:=$(expr "$tagger" : '\(.*>\)')}
|
|
|
|
trap 'rm -f .tmp-tag* .tagmsg .editmsg' 0
|
|
|
|
if [ "$annotate" ]; then
|
|
if [ -z "$message" ]; then
|
|
( echo "#"
|
|
echo "# Write a tag message"
|
|
echo "#" ) > .editmsg
|
|
${VISUAL:-${EDITOR:-vi}} .editmsg || exit
|
|
else
|
|
echo "$message" > .editmsg
|
|
fi
|
|
|
|
grep -v '^#' < .editmsg | git-stripspace > .tagmsg
|
|
|
|
[ -s .tagmsg ] || {
|
|
echo >&2 "No tag message?"
|
|
exit 1
|
|
}
|
|
|
|
( echo -e "object $object\ntype $type\ntag $name\ntagger $tagger\n"; cat .tagmsg ) > .tmp-tag
|
|
rm -f .tmp-tag.asc .tagmsg
|
|
if [ "$signed" ]; then
|
|
gpg -bsa -u "$username" .tmp-tag &&
|
|
cat .tmp-tag.asc >>.tmp-tag ||
|
|
die "failed to sign the tag with GPG."
|
|
fi
|
|
object=$(git-mktag < .tmp-tag)
|
|
fi
|
|
|
|
mkdir -p "$GIT_DIR/refs/tags"
|
|
echo $object > "$GIT_DIR/refs/tags/$name"
|