* "fatal: git-write-tree: error building trees" from `git stash`
@ 2012-12-27 18:07 Alex Vandiver
2012-12-27 18:51 ` Junio C Hamano
0 siblings, 1 reply; 6+ messages in thread
From: Alex Vandiver @ 2012-12-27 18:07 UTC (permalink / raw)
To: git discussion list
Heya,
I just ran into the following with `git stash`. The set-up:
git init
echo "Initial" > foo
git add .
git commit -m 'Initial commit'
echo "Rewrite" > foo
git commit -am 'Second commit, rewrites content'
echo "Stashed changes" >> foo
git stash
git co HEAD~
$ git stash pop
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Recorded preimage for 'foo'
$ git stash
foo: needs merge
foo: needs merge
foo: unmerged (aeaa7e5e87cf309a7368d5d92a71c1f9e6a8c9e7)
foo: unmerged (a77fa514de2720c72c1a861de098595959a2c97a)
foo: unmerged (4a622d2b991f1a19ba7be313a46dc6f03692cd0a)
fatal: git-write-tree: error building trees
Cannot save the current index state
- Alex
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: "fatal: git-write-tree: error building trees" from `git stash` 2012-12-27 18:07 "fatal: git-write-tree: error building trees" from `git stash` Alex Vandiver @ 2012-12-27 18:51 ` Junio C Hamano 2012-12-27 18:55 ` Alex Vandiver 0 siblings, 1 reply; 6+ messages in thread From: Junio C Hamano @ 2012-12-27 18:51 UTC (permalink / raw) To: Alex Vandiver; +Cc: git discussion list Alex Vandiver <alex@chmrr.net> writes: > Heya, > I just ran into the following with `git stash`. The set-up: > ... > $ git stash pop > Auto-merging foo > CONFLICT (content): Merge conflict in foo > Recorded preimage for 'foo' > > $ git stash > foo: needs merge > foo: needs merge > foo: unmerged (aeaa7e5e87cf309a7368d5d92a71c1f9e6a8c9e7) > foo: unmerged (a77fa514de2720c72c1a861de098595959a2c97a) > foo: unmerged (4a622d2b991f1a19ba7be313a46dc6f03692cd0a) > fatal: git-write-tree: error building trees > Cannot save the current index state This is totally expected, isn't it? You do not save state in the middle of a conflict with "git stash" (instead, you would "git stash" away your own work in progress before you start operation that may create and leave conflicts). ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: "fatal: git-write-tree: error building trees" from `git stash` 2012-12-27 18:51 ` Junio C Hamano @ 2012-12-27 18:55 ` Alex Vandiver 2012-12-27 19:05 ` Jeff King 2012-12-27 19:21 ` Junio C Hamano 0 siblings, 2 replies; 6+ messages in thread From: Alex Vandiver @ 2012-12-27 18:55 UTC (permalink / raw) To: Junio C Hamano; +Cc: git discussion list On Thu, 2012-12-27 at 10:51 -0800, Junio C Hamano wrote: > > $ git stash > > foo: needs merge > > foo: needs merge > > foo: unmerged (aeaa7e5e87cf309a7368d5d92a71c1f9e6a8c9e7) > > foo: unmerged (a77fa514de2720c72c1a861de098595959a2c97a) > > foo: unmerged (4a622d2b991f1a19ba7be313a46dc6f03692cd0a) > > fatal: git-write-tree: error building trees > > Cannot save the current index state > > This is totally expected, isn't it? > > You do not save state in the middle of a conflict with "git stash" > (instead, you would "git stash" away your own work in progress > before you start operation that may create and leave conflicts). Apologies for not being clear. While being unable to stash is not unexpected, perhaps, "Cannot stash while resolving conflicts" or similar would be more understandable to the end user than the above. - Alex ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: "fatal: git-write-tree: error building trees" from `git stash` 2012-12-27 18:55 ` Alex Vandiver @ 2012-12-27 19:05 ` Jeff King 2012-12-27 20:11 ` Junio C Hamano 2012-12-27 19:21 ` Junio C Hamano 1 sibling, 1 reply; 6+ messages in thread From: Jeff King @ 2012-12-27 19:05 UTC (permalink / raw) To: Alex Vandiver; +Cc: Junio C Hamano, git discussion list On Thu, Dec 27, 2012 at 01:55:56PM -0500, Alex Vandiver wrote: > On Thu, 2012-12-27 at 10:51 -0800, Junio C Hamano wrote: > > > $ git stash > > > foo: needs merge > > > foo: needs merge > > > foo: unmerged (aeaa7e5e87cf309a7368d5d92a71c1f9e6a8c9e7) > > > foo: unmerged (a77fa514de2720c72c1a861de098595959a2c97a) > > > foo: unmerged (4a622d2b991f1a19ba7be313a46dc6f03692cd0a) > > > fatal: git-write-tree: error building trees > > > Cannot save the current index state > > > > This is totally expected, isn't it? > > > > You do not save state in the middle of a conflict with "git stash" > > (instead, you would "git stash" away your own work in progress > > before you start operation that may create and leave conflicts). > > Apologies for not being clear. While being unable to stash is not > unexpected, perhaps, "Cannot stash while resolving conflicts" or similar > would be more understandable to the end user than the above. Yeah, I think the outcome is reasonable, but that message is just horrible. Something like this might be better: diff --git a/git-stash.sh b/git-stash.sh index 688e259..7ea425c 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -217,6 +217,12 @@ save_stash () { stash_msg="$*" + if ! git diff-index --cached --diff-filter=U --quiet HEAD; then + echo >&2 "fatal: unable to stash unmerged entries:" + git diff-index --cached --diff-filter=U --name-status HEAD + exit 1 + fi + git update-index -q --refresh if no_changes then but I suspect it is not sufficient: 1. There are other code paths that will end up in write-tree which should probably be protected, too. 2. Unmerged entries are only one reason that write-tree might fail. It's OK not to catch them all (since ultimately write-tree will complain if need be), but we may want to also handle intent-to-add entries with a nicer message. -Peff ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: "fatal: git-write-tree: error building trees" from `git stash` 2012-12-27 19:05 ` Jeff King @ 2012-12-27 20:11 ` Junio C Hamano 0 siblings, 0 replies; 6+ messages in thread From: Junio C Hamano @ 2012-12-27 20:11 UTC (permalink / raw) To: Jeff King; +Cc: Alex Vandiver, git discussion list Jeff King <peff@peff.net> writes: > but I suspect it is not sufficient: > > 1. There are other code paths that will end up in write-tree which > should probably be protected, too. Among 6 calls to write-tree, only the first ones in create_stash and apply_stash are about the index the user originally had. If the only expected failure case is unmerged entries, it should be sufficient to protect these two (and the one in apply_stash is already covered, I think). > 2. Unmerged entries are only one reason that write-tree might fail. > It's OK not to catch them all (since ultimately write-tree will > complain if need be), but we may want to also handle intent-to-add > entries with a nicer message. Hrmph. We used to fail write-tree when I-T-A entries existed and relied on that behaviour to implement "no state lost"; as we broke write-tree recently by allowing to write a tree out by pretending that I-T-A entries do not exist, I think we broke it. Stashing with I-T-A and then unstashing it may lose the file. Sigh... ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: "fatal: git-write-tree: error building trees" from `git stash` 2012-12-27 18:55 ` Alex Vandiver 2012-12-27 19:05 ` Jeff King @ 2012-12-27 19:21 ` Junio C Hamano 1 sibling, 0 replies; 6+ messages in thread From: Junio C Hamano @ 2012-12-27 19:21 UTC (permalink / raw) To: Alex Vandiver; +Cc: git discussion list Alex Vandiver <alex@chmrr.net> writes: > ... "Cannot stash while resolving conflicts" or similar would be > more understandable to the end user than the above. Interestingly enough, the "apply" side is protected with this one liner: # current index state c_tree=$(git write-tree) || die "$(gettext "Cannot apply a stash in the middle of a merge")" since 5fd448f (git stash: Give friendlier errors when there is nothing to apply, 2009-08-11). I would think something in line with that change on the "create" side is a welcome one. Thanks. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2012-12-27 20:12 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-12-27 18:07 "fatal: git-write-tree: error building trees" from `git stash` Alex Vandiver 2012-12-27 18:51 ` Junio C Hamano 2012-12-27 18:55 ` Alex Vandiver 2012-12-27 19:05 ` Jeff King 2012-12-27 20:11 ` Junio C Hamano 2012-12-27 19:21 ` Junio C Hamano
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox