)]}'
{
  "commit": "6ec4c0b45ba916770c6fbc03df94018ca06fb77e",
  "tree": "cfe4467b04ad199f8fa620e6663b0504273613d0",
  "parents": [
    "7ec85185b197ce1cd28721a6f4415fb9db5cd42f"
  ],
  "author": {
    "name": "Patrick Steinhardt",
    "email": "ps@pks.im",
    "time": "Thu Oct 23 09:16:21 2025 +0200"
  },
  "committer": {
    "name": "Junio C Hamano",
    "email": "gitster@pobox.com",
    "time": "Tue Nov 04 07:32:25 2025 -0800"
  },
  "message": "refs: don\u0027t store peeled object IDs for invalid tags\n\nBoth the \"files\" and \"reftable\" backend store peeled object IDs for\nreferences that point to tags:\n\n  - The \"files\" backend stores the value when packing refs, where each\n    peeled object ID is prefixed with \"^\".\n\n  - The \"reftable\" backend stores the value whenever writing a new\n    reference that points to a tag via a special ref record type.\n\nBoth of these backends use `peel_object()` to find the peeled object ID.\nBut as explained in the preceding commit, that function does not detect\nthe case where the tag\u0027s tagged object and its claimed type mismatch.\n\nThe consequence of storing these bogus peeled object IDs is that we\u0027re\nless likely to detect such corruption in other parts of Git.\ngit-for-each-ref(1) for example does not notice anymore that the tag is\nbroken when using \"--format\u003d%(*objectname)\" to dereference tags.\n\nOne could claim that this is good, because it still allows us to mostly\nuse the tag as intended. But the biggest problem here is that we now\nhave different behaviour for such a broken tag depending on whether or\nnot we have its peeled value in the refdb.\n\nFix the issue by verifying the object type when peeling the object. If\nthat verification fails we simply skip storing the peeled value in\neither of the reference formats.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "4752d3f3981fe3de645e6bd6bce95e487639b481",
      "old_mode": 33188,
      "old_path": "refs/packed-backend.c",
      "new_id": "1ab0c5039301647d133b9672898a8262aa8a1568",
      "new_mode": 33188,
      "new_path": "refs/packed-backend.c"
    },
    {
      "type": "modify",
      "old_id": "9febb2322c3b24ba024a85a8fda5ac5af7c24047",
      "old_mode": 33188,
      "old_path": "refs/reftable-backend.c",
      "new_id": "6bbfd5618dac16693c735994d29550da73403bf7",
      "new_mode": 33188,
      "new_path": "refs/reftable-backend.c"
    },
    {
      "type": "modify",
      "old_id": "3dbcc01718e157cec951736b333aa16506bd11f8",
      "old_mode": 33188,
      "old_path": "t/pack-refs-tests.sh",
      "new_id": "095823d915fd637e6212497566d3a76544d96caf",
      "new_mode": 33188,
      "new_path": "t/pack-refs-tests.sh"
    },
    {
      "type": "modify",
      "old_id": "3ea5d51532a8b88ac8e36d79613812ed4668234a",
      "old_mode": 33261,
      "old_path": "t/t0610-reftable-basics.sh",
      "new_id": "6575528f212716df5a47bf3e973a269cb0e8bf9a",
      "new_mode": 33261,
      "new_path": "t/t0610-reftable-basics.sh"
    }
  ]
}
