On Wed, Mar 13 2019, Johannes Schindelin via GitGitGadget wrote: > From: Johannes Schindelin <johannes.schindelin@xxxxxx> > > We specifically support `exec` commands in `git rebase -i`'s todo lists > to rewrite the very same todo list. Of course, we need to validate that > todo list when re-reading it. > > It is also totally legitimate to extend the todo list by `pick` lines > using short names of commits that were created only after the rebase > started. > > And this is where the loose object cache interferes with this feature: > if *some* loose object was read whose hash shares the same first two > digits with a commit that was not yet created when that loose object was > created, then we fail to find that new commit by its short name in > `get_oid()`, and the interactive rebase fails with an obscure error > message like: > > error: invalid line 1: pick 6568fef > error: please fix this using 'git rebase --edit-todo'. As a further improvement, is there a good reason for why we wouldn't pass something down to the oid machinery to say "we're only interested in commits". I have a WIP series somewhere to generalize that more, but e.g. here locally: $ git rev-parse 80b06 error: short SHA1 80b06 is ambiguous hint: The candidates are: hint: 80b06b942e commit 2019-03-13 - Revert "this patch fail whales" hint: 80b063bb9b blob hint: 80b06f0714 blob 80b06 $ git rev-parse 80b06^{commit} 80b06b942ed33e597a0152b3e6ba45b7d8ead94b I can't remember if there's some caveat with that particular peel syntax I meant to fix, but I mean if we could pass something down to say "no blobs or trees" shouldn't we? Then stuff like this wouldn't die: $ git rebase -i hint: Waiting for your editor to close the file... Waiting for Emacs... error: short SHA1 80b06 is ambiguous hint: The candidates are: hint: 80b06b942e commit 2019-03-13 - Revert "this patch fail whales" hint: 80b063bb9b blob hint: 80b06f0714 blob error: invalid line 2: p 80b06 Revert "this patch fail whales" You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'. > [...] > +test_expect_failure SHA1 'loose object cache vs re-reading todo list' ' > + GIT_REBASE_TODO=.git/rebase-merge/git-rebase-todo && > + export GIT_REBASE_TODO && > + write_script append-todo.sh <<-\EOS && > + # For values 5 and 6, this yields SHA-1s with the same first two digits > + echo "pick $(git rev-parse --short \ > + $(printf "%s\\n" \ > + "tree $EMPTY_TREE" \ > + "author A U Thor <author@xxxxxxxxxxx> $1 +0000" \ > + "committer A U Thor <author@xxxxxxxxxxx> $1 +0000" \ > + "" \ > + "$1" | > + git hash-object -t commit -w --stdin))" >>$GIT_REBASE_TODO > + > + shift > + test -z "$*" || > + echo "exec $0 $*" >>$GIT_REBASE_TODO > + EOS > + > + git rebase HEAD -x "./append-todo.sh 5 6" > +' > + > test_done This is a test for rebase, but perhaps it would be best put in t1512-rev-parse-disambiguation.sh. Then when we finally port that somehow to SHA256 we'll have all this SHA-1 golfing in the same file & can fix it at once. Just a thought...