On Tue, Dec 06, 2016 at 03:11:30PM -0500, Jeff King wrote: > > Yeah, it looks like "add -u" to me, too. Perhaps the script was old > > enough that it didn't exist back then? I dunno. > > Hmm, nope. It _was_ "git add -u" at one point and switched. See > 7aa5d43cc (stash: Don't overwrite files that have gone from the index, > 2010-04-18). > > I think you are right that diff-index could work, though. I always > forget that without "--cached", diff-index looks at the working tree > files. Here it is in patch form. Perhaps I am missing some subtle case that diff-index would not handle, but it does pass the test suite. And looking over the original thread, I don't see any particular reason to prefer git-diff. +cc Charles just in case he remembers anything. -- >8 -- Subject: [PATCH] stash: prefer plumbing over git-diff When creating a stash, we need to look at the diff between the working tree and HEAD, and do so using the git-diff porcelain. Because git-diff enables porcelain config like renames by default, this causes at least one problem. The --name-only format will not mention the source side of a rename, meaning we will fail to stash a deletion that is part of a rename. We could fix that case by passing --no-renames, but this is a symptom of a larger problem. We should be using the diff-index plumbing here, which does not have renames enabled by default, and also does not respect any potentially confusing config options. Reported-by: Matthew Patey <matthew.patey2167@xxxxxxxxx> Signed-off-by: Jeff King <peff@xxxxxxxx> --- git-stash.sh | 2 +- t/t3903-stash.sh | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/git-stash.sh b/git-stash.sh index 4546abaae..10c284d1a 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -115,7 +115,7 @@ create_stash () { git read-tree --index-output="$TMPindex" -m $i_tree && GIT_INDEX_FILE="$TMPindex" && export GIT_INDEX_FILE && - git diff --name-only -z HEAD -- >"$TMP-stagenames" && + git diff-index --name-only -z HEAD -- >"$TMP-stagenames" && git update-index -z --add --remove --stdin <"$TMP-stagenames" && git write-tree && rm -f "$TMPindex" diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index e1a6ccc00..2de3e18ce 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -766,4 +766,13 @@ test_expect_success 'stash list --cc shows combined diff' ' test_cmp expect actual ' +test_expect_success 'stash is not confused by partial renames' ' + mv file renamed && + git add renamed && + git stash && + git stash apply && + test_path_is_file renamed && + test_path_is_missing file +' + test_done -- 2.11.0.191.gdb26c57