Skip to content

Commit

Permalink
git-stash: add new 'drop' subcommand
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
drafnel authored and gitster committed Feb 23, 2008
1 parent 55f1056 commit e25d5f9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
7 changes: 6 additions & 1 deletion Documentation/git-stash.txt
Expand Up @@ -8,7 +8,7 @@ git-stash - Stash the changes in a dirty working directory away
SYNOPSIS
--------
[verse]
'git-stash' (list | show [<stash>] | apply [<stash>] | clear)
'git-stash' (list | show [<stash>] | apply [<stash>] | clear | drop [<stash>])
'git-stash' [save [<message>]]

DESCRIPTION
Expand Down Expand Up @@ -85,6 +85,11 @@ clear::
Remove all the stashed states. Note that those states will then
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
----------
Expand Down
28 changes: 27 additions & 1 deletion git-stash.sh
@@ -1,7 +1,7 @@
#!/bin/sh
# Copyright (c) 2007, Nanako Shiraishi

USAGE='[ | save | list | show | apply | clear | create ]'
USAGE='[ | save | list | show | apply | clear | drop | create ]'

SUBDIRECTORY_OK=Yes
OPTIONS_SPEC=
Expand Down Expand Up @@ -196,6 +196,28 @@ apply_stash () {
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
case "$1" in
list)
Expand Down Expand Up @@ -230,6 +252,10 @@ create)
fi
create_stash "$*" && echo "$w_commit"
;;
drop)
shift
drop_stash "$@"
;;
*)
if test $# -eq 0
then
Expand Down

0 comments on commit e25d5f9

Please sign in to comment.