git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v8 4/4] format-patch: add commitListFormat config

From
Mirko Faina <mroik@delayed.space>
Date
Mar 12, 2026, 16:20 UTC
Message-ID
<50b1f37e8cd6091deca793f9a972b1d15d9aae7d.1773331754.git.mroik@delayed.space>
In-Reply-To
<cover.1773331753.git.mroik@delayed.space>

Using "--cover-letter" we can tell format-patch to generate a cover letter, in this cover letter there's a list of commits included in the patch series and the format is specified by the "--cover-letter-format" option. Would be useful if this format could be configured from the config file instead of always needing to pass it from the command line.

Teach format-patch how to read the format spec for the cover letter from the config files. The variable it should look for is called format.commitListFormat, it accepts the same values as the option "--cover-letter-format".

Signed-off-by: Mirko Faina <mroik@delayed.space>
---
 Documentation/config/format.adoc    |  5 +++
 Documentation/git-format-patch.adoc |  1 +
 builtin/log.c                       | 13 +++++++
 t/t4014-format-patch.sh             | 57 +++++++++++++++++++++++++++++
 4 files changed, 76 insertions(+)
diff --git a/Documentation/config/format.adoc b/Documentation/config/format.adoc
index ab0710e86a..ef1ed1d250 100644
--- a/Documentation/config/format.adoc
+++ b/Documentation/config/format.adoc
@@ -101,6 +101,11 @@ format.coverLetter::
 	generate a cover-letter only when there's more than one patch.
 	Default is false.
 
+format.commitListFormat::
+	When the `--cover-letter-format` option is not given, `format-patch`
+	uses the value of this variable to decide how to format the title of
+	each commit. Defaults to `shortlog`.
+
 format.outputDirectory::
 	Set a custom directory to store the resulting files instead of the
 	current working directory. All directory components will be created.
diff --git a/Documentation/git-format-patch.adoc b/Documentation/git-format-patch.adoc
index 6364fd1f5a..88e580d1b3 100644
--- a/Documentation/git-format-patch.adoc
+++ b/Documentation/git-format-patch.adoc
@@ -463,6 +463,7 @@ with configuration variables.
 	signOff = true
 	outputDirectory = <directory>
 	coverLetter = auto
+	commitListFormat = shortlog
 	coverFromDescription = auto
 ------------
 
diff --git a/builtin/log.c b/builtin/log.c
index 12877a0ac2..e19e122bc9 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -887,6 +887,7 @@ struct format_config {
 	char *signature;
 	char *signature_file;
 	enum cover_setting config_cover_letter;
+	char *fmt_cover_letter_commit_list;
 	char *config_output_directory;
 	enum cover_from_description cover_from_description_mode;
 	int show_notes;
@@ -931,6 +932,7 @@ static void format_config_release(struct format_config *cfg)
 	string_list_clear(&cfg->extra_cc, 0);
 	strbuf_release(&cfg->sprefix);
 	free(cfg->fmt_patch_suffix);
+	free(cfg->fmt_cover_letter_commit_list);
 }
 
 static enum cover_from_description parse_cover_from_description(const char *arg)
@@ -1053,6 +1055,11 @@ static int git_format_config(const char *var, const char *value,
 		cfg->config_cover_letter = git_config_bool(var, value) ? COVER_ON : COVER_OFF;
 		return 0;
 	}
+	if (!strcmp(var, "format.commitlistformat")) {
+		FREE_AND_NULL(cfg->fmt_cover_letter_commit_list);
+		git_config_string(&cfg->fmt_cover_letter_commit_list, var, value);
+		return 0;
+	}
 	if (!strcmp(var, "format.outputdirectory")) {
 		FREE_AND_NULL(cfg->config_output_directory);
 		return git_config_string(&cfg->config_output_directory, var, value);
@@ -2329,6 +2336,12 @@ int cmd_format_patch(int argc,
 		goto done;
 	total = list.nr;
 
+	if (!cover_letter_fmt) {
+		cover_letter_fmt = cfg.fmt_cover_letter_commit_list;
+		if (!cover_letter_fmt)
+			cover_letter_fmt = "shortlog";
+	}
+
 	if (cover_letter == -1) {
 		if (cfg.config_cover_letter == COVER_AUTO)
 			cover_letter = (total > 1);
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 5ec527bce9..2091b5e9bb 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -449,6 +449,63 @@ test_expect_success 'cover letter no format' '
 	test_line_count = 1 result
 '
 
+test_expect_success 'cover letter config with count, subject and author' '
+	test_when_finished "rm -rf patches result" &&
+	test_when_finished "git config unset format.coverletter" &&
+	test_when_finished "git config unset format.commitlistformat" &&
+	git config set format.coverletter true &&
+	git config set format.commitlistformat "[%(count)/%(total)] %s (%an)" &&
+	git format-patch -o patches HEAD~2 &&
+	grep -E "^[[[:digit:]]+/[[:digit:]]+] .* \(A U Thor\)" patches/0000-cover-letter.patch >result &&
+	test_line_count = 2 result
+'
+
+test_expect_success 'cover letter config with count and author' '
+	test_when_finished "rm -rf patches result" &&
+	test_when_finished "git config unset format.coverletter" &&
+	test_when_finished "git config unset format.commitlistformat" &&
+	git config set format.coverletter true &&
+	git config set format.commitlistformat "[%(count)/%(total)] (%an)" &&
+	git format-patch -o patches HEAD~2 &&
+	grep -E "^[[[:digit:]]+/[[:digit:]]+] \(A U Thor\)" patches/0000-cover-letter.patch >result &&
+	test_line_count = 2 result
+'
+
+test_expect_success 'cover letter config commitlistformat set to shortlog' '
+	test_when_finished "rm -rf patches result" &&
+	test_when_finished "git config unset format.coverletter" &&
+	test_when_finished "git config unset format.commitlistformat" &&
+	git config set format.coverletter true &&
+	git config set format.commitlistformat shortlog &&
+	git format-patch -o patches HEAD~2 &&
+	grep -E "^A U Thor \([[:digit:]]+\)" patches/0000-cover-letter.patch >result &&
+	test_line_count = 1 result
+'
+
+test_expect_success 'cover letter config commitlistformat set to chronological' '
+	test_when_finished "git reset --hard HEAD~1" &&
+	test_when_finished "rm -rf patches result test_file" &&
+	test_when_finished "git config unset format.coverletter" &&
+	test_when_finished "git config unset format.commitlistformat" &&
+	git config set format.coverletter true &&
+	git config set format.commitlistformat chronological &&
+	touch test_file &&
+	git add test_file &&
+	git commit -m "This is a subject" &&
+	git format-patch -o patches HEAD~1 &&
+	grep -E "^[[[:digit:]]+/[[:digit:]]+]" patches/0000-cover-letter.patch >result &&
+	test_line_count = 1 result
+'
+
+test_expect_success 'cover letter config commitlistformat not set' '
+	test_when_finished "rm -rf patches result" &&
+	test_when_finished "git config unset format.coverletter" &&
+	git config set format.coverletter true &&
+	git format-patch -o patches HEAD~2 &&
+	grep -E "^A U Thor \([[:digit:]]+\)" patches/0000-cover-letter.patch >result &&
+	test_line_count = 1 result
+'
+
 test_expect_success 'reroll count' '
 	rm -fr patches &&
 	git format-patch -o patches --cover-letter --reroll-count 4 main..side >list &&
-- 
2.53.0.904.g2727be2e99
Previous: Junio C HamanoNext: Junio C Hamano
Message 99 of 113 in “format-patch: better commit list for cover letter”
  1. format-patch: better commit list for cover letterMirko Faina, Feb 20, 2026
  2. format-patch: better commit list for cover letterMirko Faina, Feb 20, 2026
  3. Mirko FainaFeb 21, 2026
  4. Junio C HamanoFeb 21, 2026
  5. Mirko FainaFeb 21, 2026
  6. Junio C HamanoFeb 21, 2026
  7. Junio C HamanoFeb 21, 2026
  8. Mirko FainaFeb 21, 2026
  9. Junio C HamanoFeb 21, 2026
  10. Mirko FainaFeb 21, 2026
  11. 0/3 format-patch: add cover-letter-format optionMirko Faina, Feb 24, 2026
  12. Mirko FainaFeb 24, 2026
  13. 0/2 format-patch: add cover-letter-format optionMirko Faina, Feb 24, 2026
  14. 1/2 format-patch: add ability to use alt cover formatMirko Faina, Feb 24, 2026
  15. Junio C HamanoFeb 24, 2026
  16. Mirko FainaFeb 24, 2026
  17. Junio C HamanoFeb 25, 2026
  18. Jeff KingFeb 25, 2026
  19. Junio C HamanoFeb 24, 2026
  20. Jeff KingFeb 25, 2026
  21. Mirko FainaFeb 25, 2026
  22. 2/2 format-patch: add commitListFormat configMirko Faina, Feb 24, 2026
  23. Junio C HamanoFeb 24, 2026
  24. Mirko FainaFeb 25, 2026
  25. Junio C HamanoFeb 25, 2026
  26. Mirko FainaFeb 26, 2026
  27. Junio C HamanoFeb 26, 2026
  28. Junio C HamanoFeb 24, 2026
  29. Junio C HamanoFeb 24, 2026
  30. Mirko FainaFeb 25, 2026
  31. Junio C HamanoFeb 25, 2026
  32. 0/4 format-patch: add cover-letter-format optionMirko Faina, Feb 27, 2026
  33. 1/4 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Feb 27, 2026
  34. 2/4 format-patch: move cover letter summary generationMirko Faina, Feb 27, 2026
  35. 4/4 format-patch: add commitListFormat configMirko Faina, Feb 27, 2026
  36. 3/4 format-patch: add ability to use alt cover formatMirko Faina, Feb 27, 2026
  37. Junio C HamanoFeb 27, 2026
  38. Mirko FainaFeb 27, 2026
  39. 0/4 format-patch: add cover-letter-format optionMirko Faina, Feb 27, 2026
  40. 1/4 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Feb 27, 2026
  41. 3/4 format-patch: add ability to use alt cover formatMirko Faina, Feb 27, 2026
  42. 2/4 format-patch: move cover letter summary generationMirko Faina, Feb 27, 2026
  43. 4/4 format-patch: add commitListFormat configMirko Faina, Feb 27, 2026
  44. 5/4 docs: add usage for the cover-letter fmt featureMirko Faina, Feb 27, 2026
  45. Junio C HamanoFeb 27, 2026
  46. Mirko FainaFeb 27, 2026
  47. Junio C HamanoFeb 27, 2026
  48. 0/5 format-patch: add cover-letter-format optionMirko Faina, Feb 27, 2026
  49. 1/5 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Feb 27, 2026
  50. 2/5 format-patch: move cover letter summary generationMirko Faina, Feb 27, 2026
  51. 3/5 format-patch: add ability to use alt cover formatMirko Faina, Feb 27, 2026
  52. 4/5 format-patch: add commitListFormat configMirko Faina, Feb 27, 2026
  53. 5/5 docs: add usage for the cover-letter fmt featureMirko Faina, Feb 27, 2026
  54. Junio C HamanoMar 6, 2026
  55. Mirko FainaMar 6, 2026
  56. 0/5 format-patch: add cover-letter-format optionMirko Faina, Mar 6, 2026
  57. 1/5 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Mar 6, 2026
  58. 2/5 format-patch: move cover letter summary generationMirko Faina, Mar 6, 2026
  59. 3/5 format-patch: add ability to use alt cover formatMirko Faina, Mar 6, 2026
  60. Junio C HamanoMar 10, 2026
  61. Mirko FainaMar 10, 2026
  62. 4/5 format-patch: add commitListFormat configMirko Faina, Mar 6, 2026
  63. 5/5 docs: add usage for the cover-letter fmt featureMirko Faina, Mar 6, 2026
  64. Junio C HamanoMar 6, 2026
  65. 0/5 format-patch: add cover-letter-format optionMirko Faina, Mar 6, 2026
  66. 1/5 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Mar 6, 2026
  67. Phillip WoodMar 10, 2026
  68. Mirko FainaMar 10, 2026
  69. 2/5 format-patch: move cover letter summary generationMirko Faina, Mar 6, 2026
  70. 3/5 format-patch: add ability to use alt cover formatMirko Faina, Mar 6, 2026
  71. Phillip WoodMar 10, 2026
  72. MroikMar 10, 2026
  73. 4/5 format-patch: add commitListFormat configMirko Faina, Mar 6, 2026
  74. Phillip WoodMar 10, 2026
  75. Junio C HamanoMar 10, 2026
  76. Mirko FainaMar 10, 2026
  77. Phillip WoodMar 11, 2026
  78. Junio C HamanoMar 11, 2026
  79. Phillip WoodMar 11, 2026
  80. Junio C HamanoMar 11, 2026
  81. Mirko FainaMar 10, 2026
  82. 5/5 docs: add usage for the cover-letter fmt featureMirko Faina, Mar 6, 2026
  83. Bert WesargMar 10, 2026
  84. Phillip WoodMar 10, 2026
  85. 0/4 format-patch: add cover-letter-format optionMirko Faina, Mar 12, 2026
  86. 1/4 format-patch: move cover letter summary generationMirko Faina, Mar 12, 2026
  87. Junio C HamanoMar 12, 2026
  88. 2/4 format-patch: add ability to use alt cover formatMirko Faina, Mar 12, 2026
  89. Junio C HamanoMar 12, 2026
  90. Mirko FainaMar 12, 2026
  91. Junio C HamanoMar 12, 2026
  92. Junio C HamanoMar 12, 2026
  93. Phillip WoodMar 13, 2026
  94. Junio C HamanoMar 13, 2026
  95. Mirko FainaMar 13, 2026
  96. Junio C HamanoMar 13, 2026
  97. 3/4 format-patch: add "chronological" format for coverMirko Faina, Mar 12, 2026
  98. Junio C HamanoMar 12, 2026
  99. 4/4 format-patch: add commitListFormat configMirko Faina, Mar 12, 2026
  100. Junio C HamanoMar 12, 2026
  101. Junio C HamanoMar 12, 2026
  102. Mirko FainaMar 12, 2026
  103. Junio C HamanoMar 12, 2026
  104. 1/3 pretty.c: fix null pointer dereferenceMirko Faina, Feb 24, 2026
  105. Junio C HamanoFeb 24, 2026
  106. Mirko FainaFeb 24, 2026
  107. Mirko FainaFeb 24, 2026
  108. Jeff KingFeb 24, 2026
  109. 2/3 format-patch: add ability to use alt cover formatMirko Faina, Feb 24, 2026
  110. Jeff KingFeb 24, 2026
  111. Mirko FainaFeb 24, 2026
  112. Jeff KingFeb 24, 2026
  113. 3/3 format-patch: add commitListFormat configMirko Faina, Feb 24, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.