Subject: safer git?

From: [email-masked]
Date: Sat, 24 Oct 2020 21:19:29 +0100

Hi, due to a hardware or firmware issue, my machine is currently crashing
rather a lot. If that happens around the time I'm performing any git
activity, it seems quite likely to cause substantial corruption of the
git state.

I've responded both by running sync(1) every 60 seconds and by pushing
work to github more frequently, but the latter isn't appropriate for
everything; twice recently I've lost a fair bit of work as a result.

Q: Is there a mode in which I can run git that would make it a bit more
robust against crashes, at the cost of being a bit slower?

The primary symptom is that files modified shortly before a crash show
up existing but zero-length after the crash. For source files I mostly
know what to do in that situation, but `git fsck` shows a lot of files
under '.git/objects' that are empty, which seems to make things hard
to recover:

% git fsck
error: object file .git/objects/0e/f31631726cea2e9bf89d7bbe7b924b5282d533 is empty
error: unable to mmap .git/objects/0e/f31631726cea2e9bf89d7bbe7b924b5282d533: No such file or directory
error: 0ef31631726cea2e9bf89d7bbe7b924b5282d533: object corrupt or missing: .git/objects/0e/f31631726cea2e9bf89d7bbe7b924b5282d533
[... a dozen similar entries ...]
error: object file .git/objects/f5/a9d125645e69a0e40f9bf7a8c90b1c1c4a4ea5 is empty
error: unable to mmap .git/objects/f5/a9d125645e69a0e40f9bf7a8c90b1c1c4a4ea5: No such file or directory
error: f5a9d125645e69a0e40f9bf7a8c90b1c1c4a4ea5: object corrupt or missing: .git/objects/f5/a9d125645e69a0e40f9bf7a8c90b1c1c4a4ea5
Checking object directories: 100% (256/256), done.
Checking objects: 100% (1577/1577), done.
error: refs/stash: invalid sha1 pointer 0000000000000000000000000000000000000000
error: bad ref for .git/logs/refs/stash
dangling commit 1c0ea4e6159952501957012d2b9db7d68b52d107
% 

Last time I checked out the previous state from github in a new
directory and was able to find and copy over most of my work before
continuing. On this occasion I did a `git stash save` shortly before
the crash, and I'm not sure how to get that back. I see René Scharfe's
suggestion of:
  git fsck --unreachable |
  grep commit | cut -d\  -f3 |
  xargs git log --merges --no-walk --grep=WIP
from a recent message, but that is only showing me an older stash item.

Thanks in advance for any suggestions,

Hugo van der Sanden