git-stash: add new 'drop' subcommand

This allows a single stash entry to be deleted. It takes an
optional argument which is a stash reflog entry. If no
arguments are supplied, it drops the most recent stash entry.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Brandon Casey 2008-02-22 13:04:54 -06:00 committed by Junio C Hamano
parent 55f1056537
commit e25d5f9c82
2 changed files with 33 additions and 2 deletions

View file

@ -8,7 +8,7 @@ git-stash - Stash the changes in a dirty working directory away
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git-stash' (list | show [<stash>] | apply [<stash>] | clear) 'git-stash' (list | show [<stash>] | apply [<stash>] | clear | drop [<stash>])
'git-stash' [save [<message>]] 'git-stash' [save [<message>]]
DESCRIPTION DESCRIPTION
@ -85,6 +85,11 @@ clear::
Remove all the stashed states. Note that those states will then Remove all the stashed states. Note that those states will then
be subject to pruning, and may be difficult or impossible to recover. be subject to pruning, and may be difficult or impossible to recover.
drop [<stash>]::
Remove a single stashed state from the stash list. When no `<stash>`
is given, it removes the latest one. i.e. `stash@\{0}`
DISCUSSION DISCUSSION
---------- ----------

View file

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# Copyright (c) 2007, Nanako Shiraishi # Copyright (c) 2007, Nanako Shiraishi
USAGE='[ | save | list | show | apply | clear | create ]' USAGE='[ | save | list | show | apply | clear | drop | create ]'
SUBDIRECTORY_OK=Yes SUBDIRECTORY_OK=Yes
OPTIONS_SPEC= OPTIONS_SPEC=
@ -196,6 +196,28 @@ apply_stash () {
fi fi
} }
drop_stash () {
have_stash || die 'No stash entries to drop'
if test $# = 0
then
set x "$ref_stash@{0}"
shift
fi
# Verify supplied argument looks like a stash entry
s=$(git rev-parse --revs-only --no-flags "$@") &&
git rev-parse --verify "$s:" > /dev/null 2>&1 &&
git rev-parse --verify "$s^1:" > /dev/null 2>&1 &&
git rev-parse --verify "$s^2:" > /dev/null 2>&1 ||
die "$*: not a valid stashed state"
git reflog delete --updateref --rewrite "$@" &&
echo "Dropped $* ($s)" || die "$*: Could not drop stash entry"
# clear_stash if we just dropped the last stash entry
git rev-parse --verify "$ref_stash@{0}" > /dev/null 2>&1 || clear_stash
}
# Main command set # Main command set
case "$1" in case "$1" in
list) list)
@ -230,6 +252,10 @@ create)
fi fi
create_stash "$*" && echo "$w_commit" create_stash "$*" && echo "$w_commit"
;; ;;
drop)
shift
drop_stash "$@"
;;
*) *)
if test $# -eq 0 if test $# -eq 0
then then