"git stash" without argument originally created an unnamed stash, but some people felt this can be confusing to new users. This introduces per-user config variable stash.quick to control this behavior. The variable can take one of three values: true, false, ask. When set to "true", the command allows to create a quick stash without any user interaction. When set to "false", the command shows the list of stash instead. When set to "ask", the command asks the user. For the first time users, when the variable is not set, the command helps the user to set it interactively. Signed-off-by: Nanako Shiraishi <nanako3@xxxxxxxxxxxxxx> --- Documentation/git-stash.txt | 17 +++++++++- git-stash.sh | 72 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt index c0147b9..5d39da2 100644 --- a/Documentation/git-stash.txt +++ b/Documentation/git-stash.txt @@ -22,11 +22,24 @@ and reverts the working directory to match the `HEAD` commit. The modifications stashed away by this command can be listed with `git-stash list`, inspected with `git-stash show`, and restored (potentially on top of a different commit) with `git-stash apply`. -Calling git-stash without any arguments is equivalent to `git-stash -save`. A stash is by default listed as "WIP on 'branchname' ...", but +A stash is by default listed as "WIP on 'branchname' ...", but you can give a more descriptive message on the command line when you create one. +Calling git-stash without any arguments is equivalent to `git-stash +save` when the command is run non-interactively. When running +interactively, the value of the `stash.quick` configuration +variable in `$HOME/.gitconfig` determines what happens. + + - If `stash.quick` is set to `true`, a stash without message is + created. + + - If `stash.quick` is set to `false`, it shows the list of + stash, without creating a new one. + + - If `stash.quick` is set to `ask`, the user is asked which + behavior is desired. + The latest stash you created is stored in `$GIT_DIR/refs/stash`; older stashes are found in the reflog of this reference and can be named using the usual reflog syntax (e.g. `stash@\{0}` is the most recently diff --git a/git-stash.sh b/git-stash.sh index f16fd9c..b6223bd 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -192,6 +192,69 @@ apply_stash () { fi } +allow_quick_stash () { + + quick=$(git config --global stash.quick) + if test $? != 0 + then + if ! test -t 0 || ! test -t 1 + then + return 0 + fi + + echo ' +*** First time users *** + +"git stash" can create an unnamed stash entry without user interaction. +This is a quick way to save away your work in progress. Some people +find this behaviour confusing or dangerous to new users. You can +configure the command to list the existing stash entries instead.' + + while : + do + echo ' +Do you want the command without argument to always... + +1. Ask for confirmation +2. Create an unnamed stash +3. List existing stash entries +' + printf 'Which one? [1/2/3] ' + read reply + quick= + case "$reply" in + 1|A*) quick=ask ;; + 2|C*) quick=true ;; + 3|L*) quick=false ;; + *) continue ;; + esac + break + done + git config --global stash.quick $quick + echo ' +You can reconfigure this by editing your $HOME/.gitconfig file' + + fi + + case "$quick" in + true) return 0 ;; + false) return 1 ;; + ask) : do not return ;; + esac + + if ! test -t 0 || ! test -t 1 + then + return 0 + fi + + printf 'Do you want to create an unnamed stash? [Y/n] ' + read reply + case "$reply" in + [nN]*) return 1 ;; + *) return 0 ;; + esac +} + # Main command set case "$1" in list) @@ -226,11 +289,16 @@ create) create_stash "$*" && echo "$w_commit" ;; *) - if test $# -eq 0 + if test $# -ne 0 + then + usage + fi + if allow_quick_stash then save_stash && git-reset --hard else - usage + echo "*** Stash List ***" + list_stash fi ;; esac -- 1.5.3.7 -- Nanako Shiraishi http://ivory.ap.teacup.com/nanako3/ ---------------------------------------------------------------------- Free pop3 email with a spam filter. http://www.bluebottle.com/tag/5 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html