format.attach::
	Enable multipart/mixed attachments as the default for
	'format-patch'.  The value can also be a double quoted string
	which will enable attachments as the default and set the
	value as the boundary.  See the --attach option in
	linkgit:git-format-patch[1].  To countermand an earlier
	value, set it to an empty string.

format.from::
	Provides the default value for the `--from` option to format-patch.
	Accepts a boolean value, or a name and email address.  If false,
	format-patch defaults to `--no-from`, using commit authors directly in
	the "From:" field of patch mails.  If true, format-patch defaults to
	`--from`, using your committer identity in the "From:" field of patch
	mails and including a "From:" field in the body of the patch mail if
	different.  If set to a non-boolean value, format-patch uses that
	value instead of your committer identity.  Defaults to false.

format.forceInBodyFrom::
	Provides the default value for the `--[no-]force-in-body-from`
	option to format-patch.  Defaults to false.

format.numbered::
	A boolean which can enable or disable sequence numbers in patch
	subjects.  It defaults to "auto" which enables it only if there
	is more than one patch.  It can be enabled or disabled for all
	messages by setting it to "true" or "false".  See --numbered
	option in linkgit:git-format-patch[1].

format.headers::
	Additional email headers to include in a patch to be submitted
	by mail.  See linkgit:git-format-patch[1].

format.to::
format.cc::
	Additional recipients to include in a patch to be submitted
	by mail.  See the --to and --cc options in
	linkgit:git-format-patch[1].

format.subjectPrefix::
	The default for format-patch is to output files with the '[PATCH]'
	subject prefix. Use this variable to change that prefix.

format.coverFromDescription::
	The default mode for format-patch to determine which parts of
	the cover letter will be populated using the branch's
	description. See the `--cover-from-description` option in
	linkgit:git-format-patch[1].

format.signature::
	The default for format-patch is to output a signature containing
	the Git version number. Use this variable to change that default.
	Set this variable to the empty string ("") to suppress
	signature generation.

format.signatureFile::
	Works just like format.signature except the contents of the
	file specified by this variable will be used as the signature.

format.suffix::
	The default for format-patch is to output files with the suffix
	`.patch`. Use this variable to change that suffix (make sure to
	include the dot if you want it).

format.encodeEmailHeaders::
	Encode email headers that have non-ASCII characters with
	"Q-encoding" (described in RFC 2047) for email transmission.
	Defaults to true.

format.pretty::
ifndef::with-breaking-changes[]
	The default pretty format for log/show/whatchanged command.
	See linkgit:git-log[1], linkgit:git-show[1],
	linkgit:git-whatchanged[1].
endif::with-breaking-changes[]
ifdef::with-breaking-changes[]
	The default pretty format for log/show command.
	See linkgit:git-log[1], linkgit:git-show[1].
endif::with-breaking-changes[]

format.thread::
	The default threading style for 'git format-patch'.  Can be
	a boolean value, or `shallow` or `deep`.  `shallow` threading
	makes every mail a reply to the head of the series,
	where the head is chosen from the cover letter, the
	`--in-reply-to`, and the first patch mail, in this order.
	`deep` threading makes every mail a reply to the previous one.
	A true boolean value is the same as `shallow`, and a false
	value disables threading.

format.signOff::
	A boolean value which lets you enable the `-s/--signoff` option of
	format-patch by default. *Note:* Adding the `Signed-off-by` trailer to a
	patch should be a conscious act and means that you certify you have
	the rights to submit this work under the same open source license.
	Please see the 'SubmittingPatches' document for further discussion.

format.coverLetter::
	A boolean that controls whether to generate a cover-letter when
	format-patch is invoked, but in addition can be set to "auto", to
	generate a cover-letter only when there's more than one patch.
	Default is false.

format.outputDirectory::
	Set a custom directory to store the resulting files instead of the
	current working directory. All directory components will be created.

format.filenameMaxLength::
	The maximum length of the output filenames generated by the
	`format-patch` command; defaults to 64.  Can be overridden
	by the `--filename-max-length=<n>` command line option.

format.useAutoBase::
	A boolean value which lets you enable the `--base=auto` option of
	format-patch by default. Can also be set to "whenAble" to allow
	enabling `--base=auto` if a suitable base is available, but to skip
	adding base info otherwise without the format dying.

format.notes::
	Provides the default value for the `--notes` option to
	format-patch. Accepts a boolean value, or a ref which specifies
	where to get notes. If false, format-patch defaults to
	`--no-notes`. If true, format-patch defaults to `--notes`. If
	set to a non-boolean value, format-patch defaults to
	`--notes=<ref>`, where `ref` is the non-boolean value. Defaults
	to false.
+
If one wishes to use the ref `refs/notes/true`, please use that literal
instead.
+
This configuration can be specified multiple times in order to allow
multiple notes refs to be included. In that case, it will behave
similarly to multiple `--[no-]notes[=]` options passed in. That is, a
value of `true` will show the default notes, a value of `<ref>` will
also show notes from that notes ref and a value of `false` will negate
previous configurations and not show notes.
+
For example,
+
------------
[format]
	notes = true
	notes = foo
	notes = false
	notes = bar
------------
+
will only show notes from `refs/notes/bar`.

format.mboxrd::
	A boolean value which enables the robust "mboxrd" format when
	`--stdout` is in use to escape "^>+From " lines.

format.noprefix::
	If set, do not show any source or destination prefix in patches.
	This is equivalent to the `diff.noprefix` option used by `git
	diff` (but which is not respected by `format-patch`). Note that
	by setting this, the receiver of any patches you generate will
	have to apply them using the `-p0` option.
