From: Patrick Steinhardt <ps@pks.im>
To: Miklos Vajna <vmiklos@collabora.com>
Cc: gitster@pobox.com, jltobler@gmail.com, szeder.dev@gmail.com,
git@vger.kernel.org
Subject: Re: [PATCH] log: make --follow following renames for non-linear history optional
Date: Fri, 13 Nov 2026 08:00:07 +0100 [thread overview]
Message-ID: <ava1ax5UFfcvkU_d@pks.im> (raw)
In-Reply-To: <avWBQ_10mHUNQcFi@collabora.com>
On Thu, Nov 12, 2026 at 09:05:07AM +0000, Miklos Vajna wrote:
> diff --git a/Documentation/config/log.adoc b/Documentation/config/log.adoc
> index f7dfce69b5..72a3486a73 100644
> --- a/Documentation/config/log.adoc
> +++ b/Documentation/config/log.adoc
> @@ -53,7 +53,9 @@ This is the same as the `--decorate` option of the `git log`.
> `log.follow`::
> If `true`, `git log` will act as if the `--follow` option was used when
> a single <path> is given. This has the same limitations as `--follow`,
> - i.e. it cannot be used to follow multiple files.
> + i.e. it cannot be used to follow multiple files and does not work well
> + on non-linear history. If `merges`, `git log` will act as if the
> + `--follow=merges` option was used.
>
> `log.graphColors`::
> A list of colors, separated by commas, that can be used to draw
I'd think we should also document here that "merges" is expensive, same
as you do for "--follow[=merges]".
> diff --git a/builtin/log.c b/builtin/log.c
> index 350b35c556..db707877f6 100644
> --- a/builtin/log.c
> +++ b/builtin/log.c
> @@ -505,7 +508,10 @@ static int git_log_config(const char *var, const char *value,
> return 0;
> }
> if (!strcmp(var, "log.follow")) {
> - cfg->default_follow = git_config_bool(var, value);
> + if (value && !strcmp(value, "merges"))
> + cfg->default_follow = 2;
> + else
> + cfg->default_follow = git_config_bool(var, value);
> return 0;
> }
> if (skip_prefix(var, "color.decorate.", &slot_name))
I think we should use `git_parse_maybe_bool()` here, as we otherwise die
with "fatal: bad boolean config value 'bogus' for 'log.follow'" in case
it's not a boolean. Then we can die with our own error message.
> @@ -814,9 +820,14 @@ int cmd_log_reflog(int argc,
>
> static void log_setup_revisions_tweak(struct rev_info *rev)
> {
> + /* If --follow is not used, use the log.follow option. */
> if (rev->diffopt.flags.default_follow_renames &&
> - diff_check_follow_pathspec(&rev->prune_data, 0))
> + !rev->diffopt.flags.follow_renames &&
> + diff_check_follow_pathspec(&rev->prune_data, 0)) {
> rev->diffopt.flags.follow_renames = 1;
> + rev->diffopt.flags.follow_merges =
> + rev->diffopt.flags.default_follow_merges;
> + }
>
> if (rev->first_parent_only)
> diff_merges_default_to_first_parent(rev);
I assume that this change here is done so that "--follow" overrides
"log.follow=merge". Makes sense.
> diff --git a/log-tree.c b/log-tree.c
> index 83a3c4bf9b..93cc61af2d 100644
> --- a/log-tree.c
> +++ b/log-tree.c
> @@ -1277,7 +1277,8 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
> opt->diffopt.no_free = 1;
>
> /* Any recorded path for this commit? If so, restore it */
> - if (opt->diffopt.flags.follow_renames) {
> + if (opt->diffopt.flags.follow_renames &&
> + opt->diffopt.flags.follow_merges) {
> const char *stored = recall_follow_pathspec(opt, commit);
> if (stored) {
> const char *current = pathspec_single_path(&opt->diffopt.pathspec);
> @@ -1300,7 +1301,8 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
> show_diff_of_diff(opt);
>
> /* Record what path each parent of this commit should use */
> - if (opt->diffopt.flags.follow_renames) {
> + if (opt->diffopt.flags.follow_renames &&
> + opt->diffopt.flags.follow_merges) {
> struct commit_list *parents = get_saved_parents(opt, commit);
> if (parents && parents->next) {
> struct commit_list *p;
Okay, and these two changes here disable the logic where we record the
changed paths on all parents, and that should get us back to previous
speed by default. Good.
As far as I've seen we only ever set `follow_merges` when
`follow_renames = 1`, so it feels redundant to check for both. But on
the other hand that's a bit more defensive, so maybe that's not a bad
idea.
Other than those nits this patch looks good to me, thanks!
Patrick
next prev parent reply other threads:[~2026-11-13 7:00 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 13:55 Performance regression in `git log --follow` Patrick Steinhardt
2026-10-13 21:24 ` SZEDER Gábor
2026-10-15 14:48 ` [PATCH] log: speed up --follow following renames for non-linear history Miklos Vajna
2026-10-15 16:57 ` Junio C Hamano
2026-10-19 6:10 ` [PATCH v2] " Miklos Vajna
2026-10-22 20:45 ` [PATCH v3 0/4] " Miklos Vajna
2026-10-22 20:45 ` [PATCH v3 1/4] t4219: test more --follow cases across merges Miklos Vajna
2026-10-22 20:46 ` [PATCH v3 2/4] log: extract showing the remerge/combined diff of a merge commit Miklos Vajna
2026-10-22 20:46 ` [PATCH v3 3/4] log: simplify --follow following renames for non-linear history Miklos Vajna
2026-10-26 11:40 ` Patrick Steinhardt
2026-10-22 20:47 ` [PATCH v3 4/4] log: speed up " Miklos Vajna
2026-10-26 11:40 ` Patrick Steinhardt
2026-10-26 11:42 ` [PATCH v3 0/4] " Patrick Steinhardt
2026-10-30 20:07 ` [PATCH v4 0/6] " Miklos Vajna
2026-10-30 20:07 ` [PATCH v4 1/6] t4219: test more --follow cases across merges Miklos Vajna
2026-10-30 20:07 ` [PATCH v4 2/6] log: extract showing the remerge/combined diff of a merge commit Miklos Vajna
2026-10-30 20:08 ` [PATCH v4 3/6] log: fix -m --follow losing the history of later parents Miklos Vajna
2026-10-30 20:08 ` [PATCH v4 4/6] log: simplify --follow following renames for non-linear history Miklos Vajna
2026-10-30 20:09 ` [PATCH v4 5/6] log: speed up " Miklos Vajna
2026-11-06 14:14 ` Patrick Steinhardt
2026-11-09 8:02 ` Miklos Vajna
2026-10-30 20:10 ` [PATCH v4 6/6] log: fix --follow following an edit on a side the merge did not take Miklos Vajna
2026-11-06 14:14 ` Patrick Steinhardt
2026-11-09 8:03 ` Miklos Vajna
2026-11-06 14:14 ` [PATCH v4 0/6] log: speed up --follow following renames for non-linear history Patrick Steinhardt
2026-11-09 8:01 ` Miklos Vajna
2026-11-09 8:03 ` [PATCH v5 0/5] " Miklos Vajna
2026-11-09 8:04 ` [PATCH v5 1/5] t4219: test more --follow cases across merges Miklos Vajna
2026-11-10 23:06 ` Justin Tobler
2026-11-09 8:05 ` [PATCH v5 2/5] log: extract showing the remerge/combined diff of a merge commit Miklos Vajna
2026-11-09 8:05 ` [PATCH v5 3/5] log: fix -m --follow losing the history of later parents Miklos Vajna
2026-11-09 8:05 ` [PATCH v5 4/5] log: simplify --follow following renames for non-linear history Miklos Vajna
2026-11-10 16:45 ` Toon Claes
2026-11-09 8:06 ` [PATCH v5 5/5] log: speed up " Miklos Vajna
2026-11-11 0:40 ` [PATCH v5 0/5] " Justin Tobler
2026-11-11 10:43 ` Patrick Steinhardt
2026-11-11 12:41 ` Miklos Vajna
2026-11-11 13:29 ` Patrick Steinhardt
2026-11-12 9:05 ` [PATCH] log: make --follow following renames for non-linear history optional Miklos Vajna
2026-11-12 19:09 ` Junio C Hamano
2026-11-13 7:00 ` Patrick Steinhardt [this message]
2026-11-11 16:44 ` [PATCH v5 0/5] log: speed up --follow following renames for non-linear history Junio C Hamano
2026-10-16 20:37 ` [PATCH] " Junio C Hamano
2026-10-14 6:16 ` Performance regression in `git log --follow` Miklos Vajna
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=ava1ax5UFfcvkU_d@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jltobler@gmail.com \
--cc=szeder.dev@gmail.com \
--cc=vmiklos@collabora.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.