git bisect made that pretty easy, thanks. It looks like it started with this commit: "unpack-trees: optimize walking same trees with cache-tree" https://github.com/git/git/commit/b4da37380b7774248086f42bcd59397a44e1ac79 (I ran git bisect between tags v2.19.2 and v2.20.0.) Testing the commit in question: % git checkout b4da37380b7774248086f42bcd59397a44e1ac79 % gmake -j 6 NO_OPENSSL=YesPlease NO_PERL=YesPlease NO_TCLTK=YesPlease NO_GETTEXT=YesPlease NO_EXPAT=YesPlease all % ~/tmp/git-source/git version git version 2.18.0.751.gb4da37380b % ~/tmp/git-source/git commit null_terminated.hh # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Your branch is up to date with 'origin/master'. # # Changes to be committed: # deleted: algo/find.hh # new file: app/.reserved # deleted: ascii/contains_icase.hh # deleted: ascii/contains_icase.test.cc # modified: null_terminated.hh # # Changes not staged for commit: Aborting commit due to empty commit message. Note that the latest version behaves differently (it tries to delete another file): % git version git version 2.24.1 % git commit null_terminated.hh # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Your branch is up to date with 'origin/master'. # # Changes to be committed: # deleted: defer.hh # modified: null_terminated.hh Aborting commit due to empty commit message. The commit before "unpack-trees: optimize walking same trees with cache-tree" works as it should: % git checkout b4da37380b7774248086f42bcd59397a44e1ac79^ % gmake -j 6 NO_OPENSSL=YesPlease NO_PERL=YesPlease NO_TCLTK=YesPlease NO_GETTEXT=YesPlease NO_EXPAT=YesPlease all % ~/tmp/git-source/git version git version 2.18.0.750.g0d1ed5963d % ~/tmp/git-source/git commit null_terminated.hh # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Your branch is up to date with 'origin/master'. # # Changes to be committed: # modified: null_terminated.hh # # Changes not staged for commit: Aborting commit due to empty commit message. Here's my local commit from about a week ago when the problems started. I'm sure I ran "git commit readme.md" because I had several files staged. The commit pulled in 3 staged files (I think there were more) and deleted 3 files that 100% weren't staged. % git show --numstat 7d5d43d849f1391b3cc11f12e037b8cb5174e3a3 commit 7d5d43d849f1391b3cc11f12e037b8cb5174e3a3 Author: Mikael Simonsson <m@xxxxxxxxxxxxxxxxxxx> Date: Sun Dec 8 10:38:38 2019 +0000 Add short info and requirements for ranges 56 0 algo/find.hh 0 1 app/.reserved 16 0 ascii/contains_icase.hh 28 0 ascii/contains_icase.test.cc 0 41 bench/bench.hh 0 41 debug.hh 76 0 readme.md -Mikael On Tue, Dec 17, 2019 at 7:33 AM Jeff King <peff@xxxxxxxx> wrote: > > On Mon, Dec 16, 2019 at 09:50:33AM +0000, Mikael Simonsson wrote: > > > I will try to recreate the problem with a new repository. > > > > So far I think I've narrowed it down to a bug introduced in git 2.20.0. > > > > Not buggy: > > [...] > > If you can build Git from source, you might try using "git bisect" to > find the exact commit where the problem starts. > > > The buggy versions all try to delete fileX when running "git commit fileA": > > > > % git commit fileA > > > > # Please enter the commit message for your changes. Lines starting > > # with '#' will be ignored, and an empty message aborts the commit. > > # > > # On branch master > > # Your branch is up to date with 'origin/master'. > > # > > # Changes to be committed: > > # deleted: fileX > > # modified: fileA > > # > > # Changes not staged for commit: > > Is there anything about "fileX" and "fileA"'s names that might be > relevant? E.g., might they case-fold to the same name or something? > > -Peff