From: "Ravi Mistry via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Abhijeetsingh Meena <abhijeet040403@gmail.com>,
Kristoffer Haugsbakk <code@khaugsbakk.name>,
Phillip Wood <phillip.wood@dunelm.org.uk>,
Eric Sunshine <sunshine@sunshineco.com>,
Phillip Wood <phillip.wood123@gmail.com>,
Ravi Mistry <rmistry@google.com>
Subject: [PATCH v4 0/2] blame: ignore revs in HEAD:.git-blame-ignore-revs by default
Date: Mon, 12 Oct 2026 19:17:22 +0000 [thread overview]
Message-ID: <pull.2224.v4.git.1791832644.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2224.git.1789169384240.gitgitgadget@gmail.com>
This series teaches git-blame(1) and git-annotate(1) to automatically use
the HEAD:.git-blame-ignore-revs blob by default if it exists, so local runs
match hosting platforms without requiring manual blame.ignoreRevsFile
configuration in every clone. This restarts the stalled attempt in PR
https://github.com/gitgitgadget/git/pull/1809
(https://lore.kernel.org/git/pull.1809.v2.git.1728707867.gitgitgadget@gmail.com/)
and addresses https://github.com/gitgitgadget/git/issues/1494.
Changes since v3:
* Patch 2/2 caps the size of the default HEAD:.git-blame-ignore-revs blob
at IGNORE_REVS_MAX_FILE_SIZE (100MB, matching ATTR_MAX_FILE_SIZE from
3c50032ff5 ("attr: ignore overly large gitattributes files", 2022-12-01))
via odb_read_object_info() before calling odb_read_object(), skipping
oversized blobs with a warning without loading them into memory.
Changes since v2:
* Patch 2/2 uses sb->repo instead of the_repository in
parse_default_ignore_revs_blob().
Changes since v1:
* Split the series into two commits.
* Patch 1/2 hardens oidset_parse_file_carefully() in oidset.c and
peel_to_commit_oid() in builtin/blame.c before exposing them to
upstream-controlled content at a well-known path:
* Reject lines containing embedded NUL bytes via memchr() so trailing
bytes after a NUL cannot be silently ignored.
* Pass OBJECT_INFO_LOOKUP_REPLACE | OBJECT_INFO_SKIP_FETCH_OBJECT |
OBJECT_INFO_QUICK to odb_read_object_info_extended() and peel tags one
layer per iteration so missing OIDs or tag targets do not trigger lazy
promisor fetches or pack directory rescans in partial clones, and
verify that each peeled target matches the tag's declared type.
* Patch 2/2 reads the committed HEAD:.git-blame-ignore-revs blob (in both
bare and non-bare repositories) instead of reading a file from the
working tree, matching hosting platforms even when an untracked file is
present or a tracked one has local modifications. The tree entry is
checked with S_ISREG() so non-regular entries (such as committed
symlinks) are skipped, parsed in memory via
oidset_parse_buffer_carefully(), and bypassed without reading if cleared
via blame.ignoreRevsFile="" or --no-ignore-revs-file.
Ravi Mistry (2):
blame: harden ignore-revs parser and tag peeling
blame: ignore revs in HEAD:.git-blame-ignore-revs
Documentation/blame-options.adoc | 8 +-
Documentation/config/blame.adoc | 9 +-
builtin/blame.c | 74 +++++++++-
oidset.c | 81 ++++++++---
oidset.h | 9 ++
t/t8013-blame-ignore-revs.sh | 235 +++++++++++++++++++++++++++++++
6 files changed, 381 insertions(+), 35 deletions(-)
base-commit: fa7f9290efe2bd22dd736689597b474b93798e11
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2224%2Frmistry%2Fblame-default-ignore-revs-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2224/rmistry/blame-default-ignore-revs-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/2224
Range-diff vs v3:
1: 2e12486c0d = 1: 2e12486c0d blame: harden ignore-revs parser and tag peeling
2: 72a87d1c34 ! 2: 76d597dfa8 blame: ignore revs in HEAD:.git-blame-ignore-revs
@@ Commit message
reading the object so that non-regular tree entries (such as a
committed symbolic link whose blob stores a target path rather than
revision IDs, a subdirectory, or a gitlink) are skipped instead of
- being read and rejected as malformed object names. The blob is parsed
- in memory via a new oidset_parse_buffer_carefully() helper in
- oidset.c that shares line parsing with oidset_parse_file_carefully().
+ being read and rejected as malformed object names. Its size is checked
+ via odb_read_object_info() and capped at IGNORE_REVS_MAX_FILE_SIZE
+ (100MB, matching ATTR_MAX_FILE_SIZE from 3c50032ff5 ("attr: ignore
+ overly large gitattributes files", 2022-12-01)) so an oversized blob
+ is skipped with a warning without being loaded into memory. The blob
+ is parsed in memory via a new oidset_parse_buffer_carefully() helper
+ in oidset.c that shares line parsing with
+ oidset_parse_file_carefully().
- In build_ignorelist(), ignore-revs entries are processed starting
after the last empty string entry. This ensures setting
blame.ignoreRevsFile to "" or passing --ignore-revs-file "" or
@@ Commit message
add comprehensive test coverage in t8013 for the default blob lookup,
subdirectory invocations, bare repositories, uncommitted and untracked
working-tree files, CLI and config overrides, committed symlink
- entries, and comments and whitespace handling.
+ entries, overly large blobs, and comments and whitespace handling.
Based-on-patch-by: Abhijeetsingh Meena <abhijeet040403@gmail.com>
Helped-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
@@ builtin/blame.c: static int peel_to_commit_oid(struct object_id *oid_ret, void *
}
}
++#define IGNORE_REVS_MAX_FILE_SIZE (100 * 1024 * 1024)
++
+static void parse_default_ignore_revs_blob(struct blame_scoreboard *sb,
+ const char *name)
+{
@@ builtin/blame.c: static int peel_to_commit_oid(struct object_id *oid_ret, void *
+ if (!S_ISREG(oc.mode))
+ goto out;
+
++ if (odb_read_object_info(sb->repo->objects, &oid, &size) != OBJ_BLOB)
++ goto out;
++ if (size >= IGNORE_REVS_MAX_FILE_SIZE) {
++ warning(_("ignoring overly large ignore-revs blob '%s'"), name);
++ goto out;
++ }
++
+ buf = odb_read_object(sb->repo->objects, &oid, &type, &size);
+ if (!buf)
+ goto out;
@@ t/t8013-blame-ignore-revs.sh: test_expect_success 'ignore-revs-file peels chaine
+'
+
+test_expect_success 'blame works when HEAD:.git-blame-ignore-revs does not exist and ignores untracked file' '
++ test_when_finished "rm -f .git-blame-ignore-revs" &&
+ git rm -f .git-blame-ignore-revs &&
+ test_tick &&
+ git commit -m "remove .git-blame-ignore-revs" &&
@@ t/t8013-blame-ignore-revs.sh: test_expect_success 'ignore-revs-file peels chaine
+ git rev-parse DEF_B >expect &&
+ test_cmp expect actual
+'
++
++test_expect_success EXPENSIVE 'overly large default HEAD:.git-blame-ignore-revs blob is ignored' '
++ blob=$(dd if=/dev/zero bs=1048576 count=101 2>/dev/null |
++ git hash-object -w --stdin) &&
++ git update-index --add --cacheinfo 100644,$blob,.git-blame-ignore-revs &&
++ test_tick &&
++ git commit -m "overly large .git-blame-ignore-revs" &&
++ test_when_finished "git reset --hard HEAD~" &&
++ git blame --line-porcelain def-file >blame_raw 2>err &&
++ sed -ne "/^[0-9a-f][0-9a-f]* [0-9][0-9]* 1/s/ .*//p" blame_raw >actual &&
++ git rev-parse DEF_B >expect &&
++ test_cmp expect actual &&
++ test_grep "warning: ignoring overly large ignore-revs blob '\''HEAD:.git-blame-ignore-revs'\''" err
++'
+
test_done
--
gitgitgadget
next prev parent reply other threads:[~2026-10-12 19:17 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-11 23:29 [PATCH] blame: default to ignoring revisions in .git-blame-ignore-revs Ravi Mistry via GitGitGadget
2026-09-30 14:59 ` Ravi Mistry
2026-10-05 15:37 ` Junio C Hamano
2026-10-05 21:12 ` Ravi Mistry
2026-10-07 17:43 ` Junio C Hamano
2026-10-07 18:07 ` Ravi Mistry
2026-10-08 21:07 ` [PATCH v2 0/2] blame: ignore revs in HEAD:.git-blame-ignore-revs by default Ravi Mistry via GitGitGadget
2026-10-08 21:07 ` [PATCH v2 1/2] blame: harden ignore-revs parser and tag peeling Ravi Mistry via GitGitGadget
2026-10-09 5:07 ` Junio C Hamano
2026-10-10 19:25 ` Ravi Mistry
2026-10-08 21:07 ` [PATCH v2 2/2] blame: ignore revs in HEAD:.git-blame-ignore-revs Ravi Mistry via GitGitGadget
2026-10-09 20:17 ` Junio C Hamano
2026-10-10 6:12 ` Eric Sunshine
2026-10-10 18:40 ` Ravi Mistry
2026-10-11 18:58 ` Junio C Hamano
2026-10-11 22:29 ` Ravi Mistry
2026-10-11 23:07 ` Junio C Hamano
2026-10-12 9:13 ` Phillip Wood
2026-10-12 16:38 ` Junio C Hamano
2026-10-12 19:21 ` Ravi Mistry
2026-10-12 21:13 ` Junio C Hamano
2026-10-13 14:48 ` Ravi Mistry
2026-10-11 22:21 ` [PATCH v3 0/2] blame: ignore revs in HEAD:.git-blame-ignore-revs by default Ravi Mistry via GitGitGadget
2026-10-11 22:21 ` [PATCH v3 1/2] blame: harden ignore-revs parser and tag peeling Ravi Mistry via GitGitGadget
2026-10-11 22:21 ` [PATCH v3 2/2] blame: ignore revs in HEAD:.git-blame-ignore-revs Ravi Mistry via GitGitGadget
2026-10-12 9:10 ` Phillip Wood
2026-10-12 15:48 ` Ravi Mistry
2026-10-12 19:17 ` Ravi Mistry via GitGitGadget [this message]
2026-10-12 19:17 ` [PATCH v4 1/2] blame: harden ignore-revs parser and tag peeling Ravi Mistry via GitGitGadget
2026-10-12 19:17 ` [PATCH v4 2/2] blame: ignore revs in HEAD:.git-blame-ignore-revs Ravi Mistry via GitGitGadget
2026-10-13 14:36 ` [PATCH v5 0/2] blame: ignore revs in .git-blame-ignore-revs by default Ravi Mistry via GitGitGadget
2026-10-13 14:36 ` [PATCH v5 1/2] blame: harden ignore-revs parser and tag peeling Ravi Mistry via GitGitGadget
2026-10-13 14:36 ` [PATCH v5 2/2] blame: ignore revs in .git-blame-ignore-revs by default Ravi Mistry via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2224.v4.git.1791832644.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=abhijeet040403@gmail.com \
--cc=code@khaugsbakk.name \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=phillip.wood123@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
--cc=rmistry@google.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.