Subject: Re: git gc gives "error: Could not read..."

From: Jeff King <[email-masked]>
Date: Mon, 1 Jun 2015 04:52:26 -0400

On Mon, Jun 01, 2015 at 10:40:53AM +0200, Stefan Näwe wrote:

> Turns out to be a tree:
> 
> tree 7713c3b1e9ea2dd9126244697389e4000bb39d85
> parent d7acfc22fbc0fba467d82f41c90aab7d61f8d751
> author Stefan Naewe <[email-masked]> 1429536806 +0200
> committer Stefan Naewe <[email-masked]> 1429536806 +0200

Yeah, I bungled the grep earlier. That message can come from a missing
tag, tree, or commit object. But I think the root cause is the same.

> Not exactly. My msysgit is merge-rebase'd (or rebase-merge'd...) onto v2.2.0...
> I'll try older versions (pre v2.2.0) on linux.

OK, that makes more sense then.

> I also cloned from local filesystem (widnows drive) to a samba share.

And that, too.

I've managed to create a small test case that replicates the problem:

diff --git a/t/t6501-freshen-objects.sh b/t/t6501-freshen-objects.sh
index 157f3f9..015b0da 100755
--- a/t/t6501-freshen-objects.sh
+++ b/t/t6501-freshen-objects.sh
@@ -129,4 +129,19 @@ for repack in '' true; do
 	'
 done
 
+test_expect_failure 'do not complain about existing broken links' '
+	cat >broken-commit <<-\EOF &&
+	tree 0000000000000000000000000000000000000001
+	parent 0000000000000000000000000000000000000002
+	author whatever <[email-masked]> 1234 -0000
+	committer whatever <[email-masked]> 1234 -0000
+
+	some message
+	EOF
+	commit=$(git hash-object -t commit -w broken-commit) &&
+	git gc 2>stderr &&
+	verbose git cat-file -e $commit &&
+	test_must_be_empty stderr
+'
+
 test_done

which produces:

  'stderr' is not empty, it contains:
  error: Could not read 0000000000000000000000000000000000000002
  error: Could not read 0000000000000000000000000000000000000001
  error: Could not read 0000000000000000000000000000000000000002
  error: Could not read 0000000000000000000000000000000000000001

Unfortunately the fix is a little bit invasive. I'll send something out
in a few minutes.

-Peff