From: Patrick Steinhardt <ps@pks.im>
To: ZheNing Hu via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
Jeff King <peff@peff.net>, ZheNing Hu <adlternative@gmail.com>
Subject: Re: [PATCH] commit: add --committer option
Date: Mon, 10 Nov 2025 10:24:39 +0100 [thread overview]
Message-ID: <aRGvVwRcsJA9CD9c@pks.im> (raw)
In-Reply-To: <pull.1997.git.1762683774166.gitgitgadget@gmail.com>
On Sun, Nov 09, 2025 at 10:22:54AM +0000, ZheNing Hu via GitGitGadget wrote:
> From: ZheNing Hu <adlternative@gmail.com>
>
> Add --committer option to git-commit, allowing users to override the
> committer identity similar to how --author works. This provides a more
> convenient alternative to setting GIT_COMMITTER_* environment variables.
Yeah, I can see how that's useful.
> diff --git a/Documentation/git-commit.adoc b/Documentation/git-commit.adoc
> index 54c207ad45..a015c8328e 100644
> --- a/Documentation/git-commit.adoc
> +++ b/Documentation/git-commit.adoc
> @@ -12,7 +12,7 @@ git commit [-a | --interactive | --patch] [-s] [-v] [-u[<mode>]] [--amend]
> [--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|reword):]<commit>]
> [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
> [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
> - [--date=<date>] [--cleanup=<mode>] [--[no-]status]
> + [--date=<date>] [--committer=<committer>] [--cleanup=<mode>] [--[no-]status]
> [-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]
> [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]
> [--] [<pathspec>...]
Nit: I'd move `--committer` before `--date` so that it comes directly
after `--author`.
> @@ -181,6 +181,13 @@ See linkgit:git-rebase[1] for details.
> `--date=<date>`::
> Override the author date used in the commit.
>
> +`--committer=<committer>`::
> + Override the committer for the commit. Specify an explicit committer using the
> + standard `A U Thor <committer@example.com>` format. Otherwise _<committer>_
> + is assumed to be a pattern and is used to search for an existing
> + commit by that author (i.e. `git rev-list --all -i --author=<committer>`);
> + the commit author is then copied from the first such commit found.
This matches the description of `--author`.
> diff --git a/builtin/commit.c b/builtin/commit.c
> index 0243f17d53..88e77cbaab 100644
> --- a/builtin/commit.c
> +++ b/builtin/commit.c
> @@ -690,6 +691,48 @@ static void determine_author_info(struct strbuf *author_ident)
> free(date);
> }
>
> +static void determine_committer_info(struct strbuf *committer_ident)
> +{
> + char *name, *email, *date;
> + struct ident_split committer;
> +
> + name = xstrdup_or_null(getenv("GIT_COMMITTER_NAME"));
> + email = xstrdup_or_null(getenv("GIT_COMMITTER_EMAIL"));
> + date = xstrdup_or_null(getenv("GIT_COMMITTER_DATE"));
> +
> + if (force_committer) {
> + struct ident_split ident;
> +
> + if (split_ident_line(&ident, force_committer, strlen(force_committer)) < 0)
> + die(_("malformed --committer parameter"));
> + set_ident_var(&name, xmemdupz(ident.name_begin, ident.name_end - ident.name_begin));
> + set_ident_var(&email, xmemdupz(ident.mail_begin, ident.mail_end - ident.mail_begin));
> +
> + if (ident.date_begin) {
> + struct strbuf date_buf = STRBUF_INIT;
> + strbuf_addch(&date_buf, '@');
> + strbuf_add(&date_buf, ident.date_begin, ident.date_end - ident.date_begin);
> + strbuf_addch(&date_buf, ' ');
> + strbuf_add(&date_buf, ident.tz_begin, ident.tz_end - ident.tz_begin);
> + set_ident_var(&date, strbuf_detach(&date_buf, NULL));
> + }
> + }
> +
> + if (force_date) {
> + struct strbuf date_buf = STRBUF_INIT;
> + if (parse_force_date(force_date, &date_buf))
> + die(_("invalid date format: %s"), force_date);
> + set_ident_var(&date, strbuf_detach(&date_buf, NULL));
> + }
> +
> + strbuf_addstr(committer_ident, fmt_ident(name, email, WANT_COMMITTER_IDENT, date,
> + IDENT_STRICT));
> + assert_split_ident(&committer, committer_ident);
> + free(name);
> + free(email);
> + free(date);
> +}
> +
> static int author_date_is_interesting(void)
> {
> return author_message || force_date;
A lot of the infra in this new function is shared with
`determine_author_info()`. It would be great if we could refactor it so
that the common parts are shared given that this all is quite
non-trivial.
Maybe we could have something like `determine_identity()` that contains
the common bits between both functions? It might ultimately not really
be worth it, but at least the functionality in the `force_committer`
condition feels like it should be pulled out.
> @@ -1321,6 +1364,9 @@ static int parse_and_validate_options(int argc, const char *argv[],
> if (force_author && renew_authorship)
> die(_("options '%s' and '%s' cannot be used together"), "--reset-author", "--author");
>
> + if (force_committer && !strchr(force_committer, '>'))
> + force_committer = find_author_by_nickname(force_committer);
> +
> if (logfile || have_option_m || use_message)
> use_editor = 0;
>
Is it the right thing to search by author here? Shouldn't we rather be
searching by committer?
> @@ -1930,8 +1978,13 @@ int cmd_commit(int argc,
> append_merge_tag_headers(parents, &tail);
> }
>
> + if (force_committer) {
> + determine_committer_info(&committer_ident);
> + }
> +
Nit: we tend to not use braces around single-line bodies.
Thanks!
Patrick
next prev parent reply other threads:[~2025-11-10 9:24 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-09 10:22 [PATCH] commit: add --committer option ZheNing Hu via GitGitGadget
2025-11-10 9:24 ` Patrick Steinhardt [this message]
2025-11-10 14:17 ` ZheNing Hu
2025-11-10 17:38 ` Junio C Hamano
2025-11-11 13:19 ` ZheNing Hu
2025-11-10 16:50 ` Phillip Wood
2025-11-10 18:01 ` brian m. carlson
2025-11-10 20:11 ` Jeff King
2025-11-10 22:06 ` Junio C Hamano
2025-11-11 6:54 ` Patrick Steinhardt
2025-11-11 14:53 ` Phillip Wood
2025-11-12 16:11 ` ZheNing Hu
2025-11-11 13:42 ` ZheNing Hu
2025-11-11 19:15 ` Jeff King
2025-11-11 20:16 ` Junio C Hamano
2025-11-11 21:33 ` Jeff King
2025-11-11 21:58 ` Junio C Hamano
2025-11-11 22:23 ` Jeff King
2025-11-12 16:51 ` ZheNing Hu
2025-11-12 16:48 ` ZheNing Hu
2025-11-12 16:46 ` ZheNing Hu
2025-11-12 16:41 ` ZheNing Hu
2025-11-12 16:37 ` ZheNing Hu
2025-11-11 13:01 ` ZheNing Hu
2025-11-11 14:38 ` Phillip Wood
2025-11-12 15:58 ` ZheNing Hu
2025-11-12 17:24 ` Junio C Hamano
2025-11-15 5:29 ` ZheNing Hu
2025-11-16 1:06 ` Junio C Hamano
2025-11-17 15:06 ` ZheNing Hu
2025-11-16 22:12 ` Matej Dujava
2025-11-17 14:27 ` Phillip Wood
2025-11-17 15:18 ` ZheNing Hu
2025-11-17 15:15 ` ZheNing Hu
2025-11-10 16:56 ` [PATCH v2] " ZheNing Hu via GitGitGadget
2025-11-10 19:22 ` Junio C Hamano
2025-11-10 19:29 ` Junio C Hamano
2025-11-11 13:36 ` ZheNing Hu
2025-11-11 15:40 ` Junio C Hamano
2025-11-12 16:23 ` ZheNing Hu
2025-11-12 16:55 ` [PATCH v3] " ZheNing Hu via GitGitGadget
2025-11-12 18:56 ` Junio C Hamano
2025-11-15 6:33 ` ZheNing Hu
2025-11-15 15:43 ` [PATCH v4] " ZheNing Hu 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=aRGvVwRcsJA9CD9c@pks.im \
--to=ps@pks.im \
--cc=adlternative@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).