git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH WIP] git-stash: add new 'drop' subcommand

From
Brandon Casey <casey@nrlssc.navy.mil>
Date
Feb 6, 2008, 16:19 UTC
Message-ID
<47A9DE06.9050307@nrlssc.navy.mil>
In-Reply-To
<alpine.LSU.1.00.0802051401000.8543@racer.site>

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>
---
Johannes Schindelin wrote:
Show 5 quoted lines
> On Tue, 5 Feb 2008, Wincent Colaiuta wrote:
>> I can't remember who/if 
>> has followed up with push/pop/delete patches for "git stash".
>
> The followup was by Brandon (Cc'ed) to add "stash drop":
Here is the same patch rebased on top of next.

This doesn't work perfectly yet. One or both of refs/stash and logs/refs/stash are not being updated correctly.

When the top-most stash is dropped, refs/stash is not updated to contain the commit id of the new stash@{0}. A subsequent drop then produces a warning like:

warning: Log .git/logs/refs/stash unexpectedly ended on Wed, 6 Feb 2008 10:00:20 -0600.
So this is still a work in progress.

Also missing is the ability to drop multiple stash entries at one time. I think reflog delete will have to be modified to accommodate this. What happens is that the deletions are performed in a loop, and each deletion shifts the reflog entries so that they don't necessarily point to the same thing.

    $ git stash list
    stash@{0} My fourth stash
    stash@{1} My third stash
    stash@{2} My second stash
    stash@{3} My first stash
    $ git reflog delete stash@{1} stash@{2}
    $ git stash list
    stash@{0} My fourth stash
    stash@{1} My second stash

"My third stash" and "My second stash" should have been deleted, but "My first stash" was deleted instead.

-brandon
 Documentation/git-stash.txt |    7 ++++++-
 git-stash.sh                |   25 ++++++++++++++++++++++++-
 2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index cd0dc1b..f339a57 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -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
@@ -82,6 +82,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
 ----------
diff --git a/git-stash.sh b/git-stash.sh
index b00f888..d6d77fa 100755
--- a/git-stash.sh
+++ b/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=
@@ -196,6 +196,25 @@ apply_stash () {
 	fi
 }
 
+drop_stash () {
+	have_stash || die 'No stash entries to drop'
+
+	test $# = 0 && set -- "$ref_stash@{0}"
+
+	# 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 "$@" && 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)
@@ -230,6 +249,10 @@ create)
 	fi
 	create_stash "$*" && echo "$w_commit"
 	;;
+drop)
+	shift
+	drop_stash "$@"
+	;;
 *)
 	if test $# -eq 0
 	then
-- 
1.5.4.1135.g75520
Previous: Johannes SchindelinNext: Paolo Bonzini
Message 6 of 9 in “git-stash: alias 'list' to 'ls' and 'clear' to 'rm'”
  1. git-stash: alias 'list' to 'ls' and 'clear' to 'rm'Tim Stoakes, Feb 5, 2008
  2. Wincent ColaiutaFeb 5, 2008
  3. Tim StoakesFeb 5, 2008
  4. Wincent ColaiutaFeb 5, 2008
  5. Johannes SchindelinFeb 5, 2008
  6. git-stash: add new 'drop' subcommandBrandon Casey, Feb 6, 2008
  7. Paolo BonziniFeb 6, 2008
  8. Junio C HamanoFeb 6, 2008
  9. Johannes SchindelinFeb 6, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.