CONFIGURATION FILE
------------------

The git configuration file contains a number of variables that affect
the git command's behavior. The `.git/config` file in each repository
is used to store the configuration for that repository, and
`$HOME/.gitconfig` is used to store a per-user configuration as
fallback values for the `.git/config` file. The file `/etc/gitconfig`
can be used to store a system-wide default configuration.

The configuration variables are used by both the git plumbing
and the porcelains. The variables are divided into sections, wherein
the fully qualified variable name of the variable itself is the last
dot-separated segment and the section name is everything before the last
dot. The variable names are case-insensitive and only alphanumeric
characters are allowed. Some variables may appear multiple times.

Syntax
~~~~~~

The syntax is fairly flexible and permissive; whitespaces are mostly
ignored.  The '#' and ';' characters begin comments to the end of line,
blank lines are ignored.

The file consists of sections and variables.  A section begins with
the name of the section in square brackets and continues until the next
section begins.  Section names are not case sensitive.  Only alphanumeric
characters, `-` and `.` are allowed in section names.  Each variable
must belong to some section, which means that there must be a section
header before the first setting of a variable.

Sections can be further divided into subsections.  To begin a subsection
put its name in double quotes, separated by space from the section name,
in the section header, like in the example below:

--------
	[section "subsection"]

--------

Subsection names are case sensitive and can contain any characters except
newline (doublequote `"` and backslash have to be escaped as `\"` and `\\`,
respectively).  Section headers cannot span multiple
lines.  Variables may belong directly to a section or to a given subsection.
You can have `[section]` if you have `[section "subsection"]`, but you
don't need to.

There is also a case insensitive alternative `[section.subsection]` syntax.
In this syntax, subsection names follow the same restrictions as for section
names.

All the other lines (and the remainder of the line after the section
header) are recognized as setting variables, in the form
'name = value'.  If there is no equal sign on the line, the entire line
is taken as 'name' and the variable is recognized as boolean "true".
The variable names are case-insensitive and only alphanumeric
characters and `-` are allowed.  There can be more than one value
for a given variable; we say then that variable is multivalued.

Leading and trailing whitespace in a variable value is discarded.
Internal whitespace within a variable value is retained verbatim.

The values following the equals sign in variable assign are all either
a string, an integer, or a boolean.  Boolean values may be given as yes/no,
0/1, true/false or on/off.  Case is not significant in boolean values, when
converting value to the canonical form using '--bool' type specifier;
'git config' will ensure that the output is "true" or "false".

String values may be entirely or partially enclosed in double quotes.
You need to enclose variable values in double quotes if you want to
preserve leading or trailing whitespace, or if the variable value contains
comment characters (i.e. it contains '#' or ';').
Double quote `"` and backslash `\` characters in variable values must
be escaped: use `\"` for `"` and `\\` for `\`.

The following escape sequences (beside `\"` and `\\`) are recognized:
`\n` for newline character (NL), `\t` for horizontal tabulation (HT, TAB)
and `\b` for backspace (BS).  No other char escape sequence, nor octal
char sequences are valid.

Variable values ending in a `\` are continued on the next line in the
customary UNIX fashion.

Some variables may require a special value format.

Example
~~~~~~~

	# Core variables
	[core]
		; Don't trust file modes
		filemode = false

	# Our diff algorithm
	[diff]
		external = /usr/local/bin/diff-wrapper
		renames = true

	[branch "devel"]
		remote = origin
		merge = refs/heads/devel

	# Proxy settings
	[core]
		gitProxy="ssh" for "kernel.org"
		gitProxy=default-proxy ; for the rest

Variables
~~~~~~~~~

Note that this list is non-comprehensive and not necessarily complete.
For command-specific variables, you will find a more detailed description
in the appropriate manual page. You will find a description of non-core
porcelain configuration variables in the respective porcelain documentation.

advice.*::
	When set to 'true', display the given optional help message.
	When set to 'false', do not display. The configuration variables
	are:
+
--
	pushNonFastForward::
		Advice shown when linkgit:git-push[1] refuses
		non-fast-forward refs. Default: true.
	statusHints::
		Directions on how to stage/unstage/add shown in the
		output of linkgit:git-status[1] and the template shown
		when writing commit messages. Default: true.
	commitBeforeMerge::
		Advice shown when linkgit:git-merge[1] refuses to
		merge to avoid overwriting local changes.
		Default: true.
	resolveConflict::
		Advices shown by various commands when conflicts
		prevent the operation from being performed.
		Default: true.
	implicitIdentity::
		Advice on how to set your identity configuration when
		your information is guessed from the system username and
		domain name. Default: true.

	detachedHead::
		Advice shown when you used linkgit::git-checkout[1] to
		move to the detach HEAD state, to instruct how to create
		a local branch after the fact.  Default: true.
--

core.fileMode::
	If false, the executable bit differences between the index and
	the working copy are ignored; useful on broken filesystems like FAT.
	See linkgit:git-update-index[1].
+
The default is true, except linkgit:git-clone[1] or linkgit:git-init[1]
will probe and set core.fileMode false if appropriate when the
repository is created.

core.ignoreCygwinFSTricks::
	This option is only used by Cygwin implementation of Git. If false,
	the Cygwin stat() and lstat() functions are used. This may be useful
	if your repository consists of a few separate directories joined in
	one hierarchy using Cygwin mount. If true, Git uses native Win32 API
	whenever it is possible and falls back to Cygwin functions only to
	handle symbol links. The native mode is more than twice faster than
	normal Cygwin l/stat() functions. True by default, unless core.filemode
	is true, in which case ignoreCygwinFSTricks is ignored as Cygwin's
	POSIX emulation is required to support core.filemode.

core.ignorecase::
	If true, this option enables various workarounds to enable
	git to work better on filesystems that are not case sensitive,
	like FAT. For example, if a directory listing finds
	"makefile" when git expects "Makefile", git will assume
	it is really the same file, and continue to remember it as
	"Makefile".
+
The default is false, except linkgit:git-clone[1] or linkgit:git-init[1]
will probe and set core.ignorecase true if appropriate when the repository
is created.

core.trustctime::
	If false, the ctime differences between the index and the
	working copy are ignored; useful when the inode change time
	is regularly modified by something outside Git (file system
	crawlers and some backup systems).
	See linkgit:git-update-index[1]. True by default.

core.quotepath::
	The commands that output paths (e.g. 'ls-files',
	'diff'), when not given the `-z` option, will quote
	"unusual" characters in the pathname by enclosing the
	pathname in a double-quote pair and with backslashes the
	same way strings in C source code are quoted.  If this
	variable is set to false, the bytes higher than 0x80 are
	not quoted but output as verbatim.  Note that double
	quote, backslash and control characters are always
	quoted without `-z` regardless of the setting of this
	variable.

core.eol::
	Sets the line ending type to use in the working directory for
	files that have the `text` property set.  Alternatives are
	'lf', 'crlf' and 'native', which uses the platform's native
	line ending.  The default value is `native`.  See
	linkgit:gitattributes[5] for more information on end-of-line
	conversion.

core.safecrlf::
	If true, makes git check if converting `CRLF` is reversible when
	end-of-line conversion is active.  Git will verify if a command
	modifies a file in the work tree either directly or indirectly.
	For example, committing a file followed by checking out the
	same file should yield the original file in the work tree.  If
	this is not the case for the current setting of
	`core.autocrlf`, git will reject the file.  The variable can
	be set to "warn", in which case git will only warn about an
	irreversible conversion but continue the operation.
+
CRLF conversion bears a slight chance of corrupting data.
When it is enabled, git will convert CRLF to LF during commit and LF to
CRLF during checkout.  A file that contains a mixture of LF and
CRLF before the commit cannot be recreated by git.  For text
files this is the right thing to do: it corrects line endings
such that we have only LF line endings in the repository.
But for binary files that are accidentally classified as text the
conversion can corrupt data.
+
If you recognize such corruption early you can easily fix it by
setting the conversion type explicitly in .gitattributes.  Right
after committing you still have the original file in your work
tree and this file is not yet corrupted.  You can explicitly tell
git that this file is binary and git will handle the file
appropriately.
+
Unfortunately, the desired effect of cleaning up text files with
mixed line endings and the undesired effect of corrupting binary
files cannot be distinguished.  In both cases CRLFs are removed
in an irreversible way.  For text files this is the right thing
to do because CRLFs are line endings, while for binary files
converting CRLFs corrupts data.
+
Note, this safety check does not mean that a checkout will generate a
file identical to the original file for a different setting of
`core.eol` and `core.autocrlf`, but only for the current one.  For
example, a text file with `LF` would be accepted with `core.eol=lf`
and could later be checked out with `core.eol=crlf`, in which case the
resulting file would contain `CRLF`, although the original file
contained `LF`.  However, in both work trees the line endings would be
consistent, that is either all `LF` or all `CRLF`, but never mixed.  A
file with mixed line endings would be reported by the `core.safecrlf`
mechanism.

core.autocrlf::
	Setting this variable to "true" is almost the same as setting
	the `text` attribute to "auto" on all files except that text
	files are not guaranteed to be normalized: files that contain
	`CRLF` in the repository will not be touched.  Use this
	setting if you want to have `CRLF` line endings in your
	working directory even though the repository does not have
	normalized line endings.  This variable can be set to 'input',
	in which case no output conversion is performed.

core.symlinks::
	If false, symbolic links are checked out as small plain files that
	contain the link text. linkgit:git-update-index[1] and
	linkgit:git-add[1] will not change the recorded type to regular
	file. Useful on filesystems like FAT that do not support
	symbolic links.
+
The default is true, except linkgit:git-clone[1] or linkgit:git-init[1]
will probe and set core.symlinks false if appropriate when the repository
is created.

core.gitProxy::
	A "proxy command" to execute (as 'command host port') instead
	of establishing direct connection to the remote server when
	using the git protocol for fetching. If the variable value is
	in the "COMMAND for DOMAIN" format, the command is applied only
	on hostnames ending with the specified domain string. This variable
	may be set multiple times and is matched in the given order;
	the first match wins.
+
Can be overridden by the 'GIT_PROXY_COMMAND' environment variable
(which always applies universally, without the special "for"
handling).
+
The special string `none` can be used as the proxy command to
specify that no proxy be used for a given domain pattern.
This is useful for excluding servers inside a firewall from
proxy use, while defaulting to a common proxy for external domains.

core.ignoreStat::
	If true, commands which modify both the working tree and the index
	will mark the updated paths with the "assume unchanged" bit in the
	index. These marked files are then assumed to stay unchanged in the
	working copy, until you	mark them otherwise manually - Git will not
	detect the file changes	by lstat() calls. This is useful on systems
	where those are very slow, such as Microsoft Windows.
	See linkgit:git-update-index[1].
	False by default.

core.preferSymlinkRefs::
	Instead of the default "symref" format for HEAD
	and other symbolic reference files, use symbolic links.
	This is sometimes needed to work with old scripts that
	expect HEAD to be a symbolic link.

core.bare::
	If true this repository is assumed to be 'bare' and has no
	working directory associated with it.  If this is the case a
	number of commands that require a working directory will be
	disabled, such as linkgit:git-add[1] or linkgit:git-merge[1].
+
This setting is automatically guessed by linkgit:git-clone[1] or
linkgit:git-init[1] when the repository was created.  By default a
repository that ends in "/.git" is assumed to be not bare (bare =
false), while all other repositories are assumed to be bare (bare
= true).

core.worktree::
	Set the path to the working tree.  The value will not be
	used in combination with repositories found automatically in
	a .git directory (i.e. $GIT_DIR is not set).
	This can be overridden by the GIT_WORK_TREE environment
	variable and the '--work-tree' command line option. It can be
	an absolute path or relative path to the directory specified by
	--git-dir or GIT_DIR.
	Note: If --git-dir or GIT_DIR are specified but none of
	--work-tree, GIT_WORK_TREE and core.worktree is specified,
	the current working directory is regarded as the top directory
	of your working tree.

core.logAllRefUpdates::
	Enable the reflog. Updates to a ref <ref> is logged to the file
	"$GIT_DIR/logs/<ref>", by appending the new and old
	SHA1, the date/time and the reason of the update, but
	only when the file exists.  If this configuration
	variable is set to true, missing "$GIT_DIR/logs/<ref>"
	file is automatically created for branch heads.
+
This information can be used to determine what commit
was the tip of a branch "2 days ago".
+
This value is true by default in a repository that has
a working directory associated with it, and false by
default in a bare repository.

core.repositoryFormatVersion::
	Internal variable identifying the repository format and layout
	version.

core.sharedRepository::
	When 'group' (or 'true'), the repository is made shareable between
	several users in a group (making sure all the files and objects are
	group-writable). When 'all' (or 'world' or 'everybody'), the
	repository will be readable by all users, additionally to being
	group-shareable. When 'umask' (or 'false'), git will use permissions
	reported by umask(2). When '0xxx', where '0xxx' is an octal number,
	files in the repository will have this mode value. '0xxx' will override
	user's umask value (whereas the other options will only override
	requested parts of the user's umask value). Examples: '0660' will make
	the repo read/write-able for the owner and group, but inaccessible to
	others (equivalent to 'group' unless umask is e.g. '0022'). '0640' is a
	repository that is group-readable but not group-writable.
	See linkgit:git-init[1]. False by default.

core.warnAmbiguousRefs::
	If true, git will warn you if the ref name you passed it is ambiguous
	and might match multiple refs in the .git/refs/ tree. True by default.

core.abbrevguard::
	Even though git makes sure that it uses enough hexdigits to show
	an abbreviated object name unambiguously, as more objects are
	added to the repository over time, a short name that used to be
	unique will stop being unique.  Git uses this many extra hexdigits
	that are more than necessary to make the object name currently
	unique, in the hope that its output will stay unique a bit longer.
	Defaults to 0.

core.compression::
	An integer -1..9, indicating a default compression level.
	-1 is the zlib default. 0 means no compression,
	and 1..9 are various speed/size tradeoffs, 9 being slowest.
	If set, this provides a default to other compression variables,
	such as 'core.loosecompression' and 'pack.compression'.

core.loosecompression::
	An integer -1..9, indicating the compression level for objects that
	are not in a pack file. -1 is the zlib default. 0 means no
	compression, and 1..9 are various speed/size tradeoffs, 9 being
	slowest.  If not set,  defaults to core.compression.  If that is
	not set,  defaults to 1 (best speed).

core.packedGitWindowSize::
	Number of bytes of a pack file to map into memory in a
	single mapping operation.  Larger window sizes may allow
	your system to process a smaller number of large pack files
	more quickly.  Smaller window sizes will negatively affect
	performance due to increased calls to the operating system's
	memory manager, but may improve performance when accessing
	a large number of large pack files.
+
Default is 1 MiB if NO_MMAP was set at compile time, otherwise 32
MiB on 32 bit platforms and 1 GiB on 64 bit platforms.  This should
be reasonable for all users/operating systems.  You probably do
not need to adjust this value.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

core.packedGitLimit::
	Maximum number of bytes to map simultaneously into memory
	from pack files.  If Git needs to access more than this many
	bytes at once to complete an operation it will unmap existing
	regions to reclaim virtual address space within the process.
+
Default is 256 MiB on 32 bit platforms and 8 GiB on 64 bit platforms.
This should be reasonable for all users/operating systems, except on
the largest projects.  You probably do not need to adjust this value.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

core.deltaBaseCacheLimit::
	Maximum number of bytes to reserve for caching base objects
	that may be referenced by multiple deltified objects.  By storing the
	entire decompressed base objects in a cache Git is able
	to avoid unpacking and decompressing frequently used base
	objects multiple times.
+
Default is 16 MiB on all platforms.  This should be reasonable
for all users/operating systems, except on the largest projects.
You probably do not need to adjust this value.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

core.bigFileThreshold::
	Files larger than this size are stored deflated, without
	attempting delta compression.  Storing large files without
	delta compression avoids excessive memory usage, at the
	slight expense of increased disk usage.
+
Default is 512 MiB on all platforms.  This should be reasonable
for most projects as source code and other text files can still
be delta compressed, but larger binary media files won't be.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
+
Currently only linkgit:git-fast-import[1] honors this setting.

core.excludesfile::
	In addition to '.gitignore' (per-directory) and
	'.git/info/exclude', git looks into this file for patterns
	of files which are not meant to be tracked.  "{tilde}/" is expanded
	to the value of `$HOME` and "{tilde}user/" to the specified user's
	home directory.  See linkgit:gitignore[5].

core.askpass::
	Some commands (e.g. svn and http interfaces) that interactively
	ask for a password can be told to use an external program given
	via the value of this variable. Can be overridden by the 'GIT_ASKPASS'
	environment variable. If not set, fall back to the value of the
	'SSH_ASKPASS' environment variable or, failing that, a simple password
	prompt. The external program shall be given a suitable prompt as
	command line argument and write the password on its STDOUT.

core.attributesfile::
	In addition to '.gitattributes' (per-directory) and
	'.git/info/attributes', git looks into this file for attributes
	(see linkgit:gitattributes[5]). Path expansions are made the same
	way as for `core.excludesfile`.

core.editor::
	Commands such as `commit` and `tag` that lets you edit
	messages by launching an editor uses the value of this
	variable when it is set, and the environment variable
	`GIT_EDITOR` is not set.  See linkgit:git-var[1].

core.pager::
	The command that git will use to paginate output.  Can
	be overridden with the `GIT_PAGER` environment
	variable.  Note that git sets the `LESS` environment
	variable to `FRSX` if it is unset when it runs the
	pager.  One can change these settings by setting the
	`LESS` variable to some other value.  Alternately,
	these settings can be overridden on a project or
	global basis by setting the `core.pager` option.
	Setting `core.pager` has no affect on the `LESS`
	environment variable behaviour above, so if you want
	to override git's default settings this way, you need
	to be explicit.  For example, to disable the S option
	in a backward compatible manner, set `core.pager`
	to `less -+$LESS -FRX`.  This will be passed to the
	shell by git, which will translate the final command to
	`LESS=FRSX less -+FRSX -FRX`.

core.whitespace::
	A comma separated list of common whitespace problems to
	notice.  'git diff' will use `color.diff.whitespace` to
	highlight them, and 'git apply --whitespace=error' will
	consider them as errors.  You can prefix `-` to disable
	any of them (e.g. `-trailing-space`):
+
* `blank-at-eol` treats trailing whitespaces at the end of the line
  as an error (enabled by default).
* `space-before-tab` treats a space character that appears immediately
  before a tab character in the initial indent part of the line as an
  error (enabled by default).
* `indent-with-non-tab` treats a line that is indented with 8 or more
  space characters as an error (not enabled by default).
* `tab-in-indent` treats a tab character in the initial indent part of
  the line as an error (not enabled by default).
* `blank-at-eof` treats blank lines added at the end of file as an error
  (enabled by default).
* `trailing-space` is a short-hand to cover both `blank-at-eol` and
  `blank-at-eof`.
* `cr-at-eol` treats a carriage-return at the end of line as
  part of the line terminator, i.e. with it, `trailing-space`
  does not trigger if the character before such a carriage-return
  is not a whitespace (not enabled by default).
* `tabwidth=<n>` tells how many character positions a tab occupies; this
  is relevant for `indent-with-non-tab` and when git fixes `tab-in-indent`
  errors. The default tab width is 8. Allowed values are 1 to 63.

core.fsyncobjectfiles::
	This boolean will enable 'fsync()' when writing object files.
+
This is a total waste of time and effort on a filesystem that orders
data writes properly, but can be useful for filesystems that do not use
journalling (traditional UNIX filesystems) or that only journal metadata
and not file contents (OS X's HFS+, or Linux ext3 with "data=writeback").

core.preloadindex::
	Enable parallel index preload for operations like 'git diff'
+
This can speed up operations like 'git diff' and 'git status' especially
on filesystems like NFS that have weak caching semantics and thus
relatively high IO latencies.  With this set to 'true', git will do the
index comparison to the filesystem data in parallel, allowing
overlapping IO's.

core.createObject::
	You can set this to 'link', in which case a hardlink followed by
	a delete of the source are used to make sure that object creation
	will not overwrite existing objects.
+
On some file system/operating system combinations, this is unreliable.
Set this config setting to 'rename' there; However, This will remove the
check that makes sure that existing object files will not get overwritten.

core.notesRef::
	When showing commit messages, also show notes which are stored in
	the given ref.  The ref must be fully qualified.  If the given
	ref does not exist, it is not an error but means that no
	notes should be printed.
+
This setting defaults to "refs/notes/commits", and it can be overridden by
the 'GIT_NOTES_REF' environment variable.  See linkgit:git-notes[1].

core.sparseCheckout::
	Enable "sparse checkout" feature. See section "Sparse checkout" in
	linkgit:git-read-tree[1] for more information.

add.ignore-errors::
add.ignoreErrors::
	Tells 'git add' to continue adding files when some files cannot be
	added due to indexing errors. Equivalent to the '--ignore-errors'
	option of linkgit:git-add[1].  Older versions of git accept only
	`add.ignore-errors`, which does not follow the usual naming
	convention for configuration variables.  Newer versions of git
	honor `add.ignoreErrors` as well.

alias.*::
	Command aliases for the linkgit:git[1] command wrapper - e.g.
	after defining "alias.last = cat-file commit HEAD", the invocation
	"git last" is equivalent to "git cat-file commit HEAD". To avoid
	confusion and troubles with script usage, aliases that
	hide existing git commands are ignored. Arguments are split by
	spaces, the usual shell quoting and escaping is supported.
	quote pair and a backslash can be used to quote them.
+
If the alias expansion is prefixed with an exclamation point,
it will be treated as a shell command.  For example, defining
"alias.new = !gitk --all --not ORIG_HEAD", the invocation
"git new" is equivalent to running the shell command
"gitk --all --not ORIG_HEAD".  Note that shell commands will be
executed from the top-level directory of a repository, which may
not necessarily be the current directory.

am.keepcr::
	If true, git-am will call git-mailsplit for patches in mbox format
	with parameter '--keep-cr'. In this case git-mailsplit will
	not remove `\r` from lines ending with `\r\n`. Can be overridden
	by giving '--no-keep-cr' from the command line.
	See linkgit:git-am[1], linkgit:git-mailsplit[1].

apply.ignorewhitespace::
	When set to 'change', tells 'git apply' to ignore changes in
	whitespace, in the same way as the '--ignore-space-change'
	option.
	When set to one of: no, none, never, false tells 'git apply' to
	respect all whitespace differences.
	See linkgit:git-apply[1].

apply.whitespace::
	Tells 'git apply' how to handle whitespaces, in the same way
	as the '--whitespace' option. See linkgit:git-apply[1].

branch.autosetupmerge::
	Tells 'git branch' and 'git checkout' to set up new branches
	so that linkgit:git-pull[1] will appropriately merge from the
	starting point branch. Note that even if this option is not set,
	this behavior can be chosen per-branch using the `--track`
	and `--no-track` options. The valid settings are: `false` -- no
	automatic setup is done; `true` -- automatic setup is done when the
	starting point is a remote-tracking branch; `always` --
	automatic setup is done when the starting point is either a
	local branch or remote-tracking
	branch. This option defaults to true.

branch.autosetuprebase::
	When a new branch is created with 'git branch' or 'git checkout'
	that tracks another branch, this variable tells git to set
	up pull to rebase instead of merge (see "branch.<name>.rebase").
	When `never`, rebase is never automatically set to true.
	When `local`, rebase is set to true for tracked branches of
	other local branches.
	When `remote`, rebase is set to true for tracked branches of
	remote-tracking branches.
	When `always`, rebase will be set to true for all tracking
	branches.
	See "branch.autosetupmerge" for details on how to set up a
	branch to track another branch.
	This option defaults to never.

branch.<name>.remote::
	When in branch <name>, it tells 'git fetch' and 'git push' which
	remote to fetch from/push to.  It defaults to `origin` if no remote is
	configured. `origin` is also used if you are not on any branch.

branch.<name>.merge::
	Defines, together with branch.<name>.remote, the upstream branch
	for the given branch. It tells 'git fetch'/'git pull' which
	branch to merge and can also affect 'git push' (see push.default).
	When in branch <name>, it tells 'git fetch' the default
	refspec to be marked for merging in FETCH_HEAD. The value is
	handled like the remote part of a refspec, and must match a
	ref which is fetched from the remote given by
	"branch.<name>.remote".
	The merge information is used by 'git pull' (which at first calls
	'git fetch') to lookup the default branch for merging. Without
	this option, 'git pull' defaults to merge the first refspec fetched.
	Specify multiple values to get an octopus merge.
	If you wish to setup 'git pull' so that it merges into <name> from
	another branch in the local repository, you can point
	branch.<name>.merge to the desired branch, and use the special setting
	`.` (a period) for branch.<name>.remote.

branch.<name>.mergeoptions::
	Sets default options for merging into branch <name>. The syntax and
	supported options are the same as those of linkgit:git-merge[1], but
	option values containing whitespace characters are currently not
	supported.

branch.<name>.rebase::
	When true, rebase the branch <name> on top of the fetched branch,
	instead of merging the default branch from the default remote when
	"git pull" is run.
	*NOTE*: this is a possibly dangerous operation; do *not* use
	it unless you understand the implications (see linkgit:git-rebase[1]
	for details).

browser.<tool>.cmd::
	Specify the command to invoke the specified browser. The
	specified command is evaluated in shell with the URLs passed
	as arguments. (See linkgit:git-web--browse[1].)

browser.<tool>.path::
	Override the path for the given tool that may be used to
	browse HTML help (see '-w' option in linkgit:git-help[1]) or a
	working repository in gitweb (see linkgit:git-instaweb[1]).

clean.requireForce::
	A boolean to make git-clean do nothing unless given -f
	or -n.   Defaults to true.

color.branch::
	A boolean to enable/disable color in the output of
	linkgit:git-branch[1]. May be set to `always`,
	`false` (or `never`) or `auto` (or `true`), in which case colors are used
	only when the output is to a terminal. Defaults to false.

color.branch.<slot>::
	Use customized color for branch coloration. `<slot>` is one of
	`current` (the current branch), `local` (a local branch),
	`remote` (a remote-tracking branch in refs/remotes/), `plain` (other
	refs).
+
The value for these configuration variables is a list of colors (at most
two) and attributes (at most one), separated by spaces.  The colors
accepted are `normal`, `black`, `red`, `green`, `yellow`, `blue`,
`magenta`, `cyan` and `white`; the attributes are `bold`, `dim`, `ul`,
`blink` and `reverse`.  The first color given is the foreground; the
second is the background.  The position of the attribute, if any,
doesn't matter.

color.diff::
	When set to `always`, always use colors in patch.
	When false (or `never`), never.  When set to `true` or `auto`, use
	colors only when the output is to the terminal. Defaults to false.

color.diff.<slot>::
	Use customized color for diff colorization.  `<slot>` specifies
	which part of the patch to use the specified color, and is one
	of `plain` (context text), `meta` (metainformation), `frag`
	(hunk header), 'func' (function in hunk header), `old` (removed lines),
	`new` (added lines), `commit` (commit headers), or `whitespace`
	(highlighting whitespace errors). The values of these variables may be
	specified as in color.branch.<slot>.

color.decorate.<slot>::
	Use customized color for 'git log --decorate' output.  `<slot>` is one
	of `branch`, `remoteBranch`, `tag`, `stash` or `HEAD` for local
	branches, remote-tracking branches, tags, stash and HEAD, respectively.

color.grep::
	When set to `always`, always highlight matches.  When `false` (or
	`never`), never.  When set to `true` or `auto`, use color only
	when the output is written to the terminal.  Defaults to `false`.

color.grep.<slot>::
	Use customized color for grep colorization.  `<slot>` specifies which
	part of the line to use the specified color, and is one of
+
--
`context`;;
	non-matching text in context lines (when using `-A`, `-B`, or `-C`)
`filename`;;
	filename prefix (when not using `-h`)
`function`;;
	function name lines (when using `-p`)
`linenumber`;;
	line number prefix (when using `-n`)
`match`;;
	matching text
`selected`;;
	non-matching text in selected lines
`separator`;;
	separators between fields on a line (`:`, `-`, and `=`)
	and between hunks (`--`)
--
+
The values of these variables may be specified as in color.branch.<slot>.

color.interactive::
	When set to `always`, always use colors for interactive prompts
	and displays (such as those used by "git-add --interactive").
	When false (or `never`), never.  When set to `true` or `auto`, use
	colors only when the output is to the terminal. Defaults to false.

color.interactive.<slot>::
	Use customized color for 'git add --interactive'
	output. `<slot>` may be `prompt`, `header`, `help` or `error`, for
	four distinct types of normal output from interactive
	commands.  The values of these variables may be specified as
	in color.branch.<slot>.

color.pager::
	A boolean to enable/disable colored output when the pager is in
	use (default is true).

color.showbranch::
	A boolean to enable/disable color in the output of
	linkgit:git-show-branch[1]. May be set to `always`,
	`false` (or `never`) or `auto` (or `true`), in which case colors are used
	only when the output is to a terminal. Defaults to false.

color.status::
	A boolean to enable/disable color in the output of
	linkgit:git-status[1]. May be set to `always`,
	`false` (or `never`) or `auto` (or `true`), in which case colors are used
	only when the output is to a terminal. Defaults to false.

color.status.<slot>::
	Use customized color for status colorization. `<slot>` is
	one of `header` (the header text of the status message),
	`added` or `updated` (files which are added but not committed),
	`changed` (files which are changed but not added in the index),
	`untracked` (files which are not tracked by git),
	`branch` (the current branch), or
	`nobranch` (the color the 'no branch' warning is shown in, defaulting
	to red). The values of these variables may be specified as in
	color.branch.<slot>.

color.ui::
	When set to `always`, always use colors in all git commands which
	are capable of colored output. When false (or `never`), never. When
	set to `true` or `auto`, use colors only when the output is to the
	terminal. When more specific variables of color.* are set, they always
	take precedence over this setting. Defaults to false.

commit.status::
	A boolean to enable/disable inclusion of status information in the
	commit message template when using an editor to prepare the commit
	message.  Defaults to true.

commit.template::
	Specify a file to use as the template for new commit messages.
	"{tilde}/" is expanded to the value of `$HOME` and "{tilde}user/" to the
	specified user's home directory.

diff.autorefreshindex::
	When using 'git diff' to compare with work tree
	files, do not consider stat-only change as changed.
	Instead, silently run `git update-index --refresh` to
	update the cached stat information for paths whose
	contents in the work tree match the contents in the
	index.  This option defaults to true.  Note that this
	affects only 'git diff' Porcelain, and not lower level
	'diff' commands such as 'git diff-files'.

diff.external::
	If this config variable is set, diff generation is not
	performed using the internal diff machinery, but using the
	given command.  Can be overridden with the `GIT_EXTERNAL_DIFF'
	environment variable.  The command is called with parameters
	as described under "git Diffs" in linkgit:git[1].  Note: if
	you want to use an external diff program only on a subset of
	your files, you	might want to use linkgit:gitattributes[5] instead.

diff.mnemonicprefix::
	If set, 'git diff' uses a prefix pair that is different from the
	standard "a/" and "b/" depending on what is being compared.  When
	this configuration is in effect, reverse diff output also swaps
	the order of the prefixes:
`git diff`;;
	compares the (i)ndex and the (w)ork tree;
`git diff HEAD`;;
	 compares a (c)ommit and the (w)ork tree;
`git diff --cached`;;
	compares a (c)ommit and the (i)ndex;
`git diff HEAD:file1 file2`;;
	compares an (o)bject and a (w)ork tree entity;
`git diff --no-index a b`;;
	compares two non-git things (1) and (2).

diff.noprefix::
	If set, 'git diff' does not show any source or destination prefix.

diff.renameLimit::
	The number of files to consider when performing the copy/rename
	detection; equivalent to the 'git diff' option '-l'.

diff.renames::
	Tells git to detect renames.  If set to any boolean value, it
	will enable basic rename detection.  If set to "copies" or
	"copy", it will detect copies, as well.

diff.ignoreSubmodules::
	Sets the default value of --ignore-submodules. Note that this
	affects only 'git diff' Porcelain, and not lower level 'diff'
	commands such as 'git diff-files'. 'git checkout' also honors
	this setting when reporting uncommitted changes.

diff.suppressBlankEmpty::
	A boolean to inhibit the standard behavior of printing a space
	before each empty output line. Defaults to false.

diff.tool::
	Controls which diff tool is used.  `diff.tool` overrides
	`merge.tool` when used by linkgit:git-difftool[1] and has
	the same valid values as `merge.tool` minus "tortoisemerge"
	and plus "kompare".

difftool.<tool>.path::
	Override the path for the given tool.  This is useful in case
	your tool is not in the PATH.

difftool.<tool>.cmd::
	Specify the command to invoke the specified diff tool.
	The specified command is evaluated in shell with the following
	variables available:  'LOCAL' is set to the name of the temporary
	file containing the contents of the diff pre-image and 'REMOTE'
	is set to the name of the temporary file containing the contents
	of the diff post-image.

difftool.prompt::
	Prompt before each invocation of the diff tool.

diff.wordRegex::
	A POSIX Extended Regular Expression used to determine what is a "word"
	when performing word-by-word difference calculations.  Character
	sequences that match the regular expression are "words", all other
	characters are *ignorable* whitespace.

fetch.recurseSubmodules::
	A boolean value which changes the behavior for fetch and pull, the
	default is to not recursively fetch populated submodules unless
	configured otherwise.

fetch.unpackLimit::
	If the number of objects fetched over the git native
	transfer is below this
	limit, then the objects will be unpacked into loose object
	files. However if the number of received objects equals or
	exceeds this limit then the received pack will be stored as
	a pack, after adding any missing delta bases.  Storing the
	pack from a push can make the push operation complete faster,
	especially on slow filesystems.  If not set, the value of
	`transfer.unpackLimit` is used instead.

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].

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.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.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.pretty::
	The default pretty format for log/show/whatchanged command,
	See linkgit:git-log[1], linkgit:git-show[1],
	linkgit:git-whatchanged[1].

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: line 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.

gc.aggressiveWindow::
	The window size parameter used in the delta compression
	algorithm used by 'git gc --aggressive'.  This defaults
	to 250.

gc.auto::
	When there are approximately more than this many loose
	objects in the repository, `git gc --auto` will pack them.
	Some Porcelain commands use this command to perform a
	light-weight garbage collection from time to time.  The
	default value is 6700.  Setting this to 0 disables it.

gc.autopacklimit::
	When there are more than this many packs that are not
	marked with `*.keep` file in the repository, `git gc
	--auto` consolidates them into one larger pack.  The
	default	value is 50.  Setting this to 0 disables it.

gc.packrefs::
	Running `git pack-refs` in a repository renders it
	unclonable by Git versions prior to 1.5.1.2 over dumb
	transports such as HTTP.  This variable determines whether
	'git gc' runs `git pack-refs`. This can be set to `notbare`
	to enable it within all non-bare repos or it can be set to a
	boolean value.  The default is `true`.

gc.pruneexpire::
	When 'git gc' is run, it will call 'prune --expire 2.weeks.ago'.
	Override the grace period with this config variable.  The value
	"now" may be used to disable this  grace period and always prune
	unreachable objects immediately.

gc.reflogexpire::
gc.<pattern>.reflogexpire::
	'git reflog expire' removes reflog entries older than
	this time; defaults to 90 days.  With "<pattern>" (e.g.
	"refs/stash") in the middle the setting applies only to
	the refs that match the <pattern>.

gc.reflogexpireunreachable::
gc.<ref>.reflogexpireunreachable::
	'git reflog expire' removes reflog entries older than
	this time and are not reachable from the current tip;
	defaults to 30 days.  With "<pattern>" (e.g. "refs/stash")
	in the middle, the setting applies only to the refs that
	match the <pattern>.

gc.rerereresolved::
	Records of conflicted merge you resolved earlier are
	kept for this many days when 'git rerere gc' is run.
	The default is 60 days.  See linkgit:git-rerere[1].

gc.rerereunresolved::
	Records of conflicted merge you have not resolved are
	kept for this many days when 'git rerere gc' is run.
	The default is 15 days.  See linkgit:git-rerere[1].

gitcvs.commitmsgannotation::
	Append this string to each commit message. Set to empty string
	to disable this feature. Defaults to "via git-CVS emulator".

gitcvs.enabled::
	Whether the CVS server interface is enabled for this repository.
	See linkgit:git-cvsserver[1].

gitcvs.logfile::
	Path to a log file where the CVS server interface well... logs
	various stuff. See linkgit:git-cvsserver[1].

gitcvs.usecrlfattr::
	If true, the server will look up the end-of-line conversion
	attributes for files to determine the '-k' modes to use. If
	the attributes force git to treat a file as text,
	the '-k' mode will be left blank so CVS clients will
	treat it as text. If they suppress text conversion, the file
	will be set with '-kb' mode, which suppresses any newline munging
	the client might otherwise do. If the attributes do not allow
	the file type to be determined, then 'gitcvs.allbinary' is
	used. See linkgit:gitattributes[5].

gitcvs.allbinary::
	This is used if 'gitcvs.usecrlfattr' does not resolve
	the correct '-kb' mode to use. If true, all
	unresolved files are sent to the client in
	mode '-kb'. This causes the client to treat them
	as binary files, which suppresses any newline munging it
	otherwise might do. Alternatively, if it is set to "guess",
	then the contents of the file are examined to decide if
	it is binary, similar to 'core.autocrlf'.

gitcvs.dbname::
	Database used by git-cvsserver to cache revision information
	derived from the git repository. The exact meaning depends on the
	used database driver, for SQLite (which is the default driver) this
	is a filename. Supports variable substitution (see
	linkgit:git-cvsserver[1] for details). May not contain semicolons (`;`).
	Default: '%Ggitcvs.%m.sqlite'

gitcvs.dbdriver::
	Used Perl DBI driver. You can specify any available driver
        for this here, but it might not work. git-cvsserver is tested
	with 'DBD::SQLite', reported to work with 'DBD::Pg', and
	reported *not* to work with 'DBD::mysql'. Experimental feature.
	May not contain double colons (`:`). Default: 'SQLite'.
	See linkgit:git-cvsserver[1].

gitcvs.dbuser, gitcvs.dbpass::
	Database user and password. Only useful if setting 'gitcvs.dbdriver',
	since SQLite has no concept of database users and/or passwords.
	'gitcvs.dbuser' supports variable substitution (see
	linkgit:git-cvsserver[1] for details).

gitcvs.dbTableNamePrefix::
	Database table name prefix.  Prepended to the names of any
	database tables used, allowing a single database to be used
	for several repositories.  Supports variable substitution (see
	linkgit:git-cvsserver[1] for details).  Any non-alphabetic
	characters will be replaced with underscores.

All gitcvs variables except for 'gitcvs.usecrlfattr' and
'gitcvs.allbinary' can also be specified as
'gitcvs.<access_method>.<varname>' (where 'access_method'
is one of "ext" and "pserver") to make them apply only for the given
access method.

gui.commitmsgwidth::
	Defines how wide the commit message window is in the
	linkgit:git-gui[1]. "75" is the default.

gui.diffcontext::
	Specifies how many context lines should be used in calls to diff
	made by the linkgit:git-gui[1]. The default is "5".

gui.encoding::
	Specifies the default encoding to use for displaying of
	file contents in linkgit:git-gui[1] and linkgit:gitk[1].
	It can be overridden by setting the 'encoding' attribute
	for relevant files (see linkgit:gitattributes[5]).
	If this option is not set, the tools default to the
	locale encoding.

gui.matchtrackingbranch::
	Determines if new branches created with linkgit:git-gui[1] should
	default to tracking remote branches with matching names or
	not. Default: "false".

gui.newbranchtemplate::
	Is used as suggested name when creating new branches using the
	linkgit:git-gui[1].

gui.pruneduringfetch::
	"true" if linkgit:git-gui[1] should prune remote-tracking branches when
	performing a fetch. The default value is "false".

gui.trustmtime::
	Determines if linkgit:git-gui[1] should trust the file modification
	timestamp or not. By default the timestamps are not trusted.

gui.spellingdictionary::
	Specifies the dictionary used for spell checking commit messages in
	the linkgit:git-gui[1]. When set to "none" spell checking is turned
	off.

gui.fastcopyblame::
	If true, 'git gui blame' uses `-C` instead of `-C -C` for original
	location detection. It makes blame significantly faster on huge
	repositories at the expense of less thorough copy detection.

gui.copyblamethreshold::
	Specifies the threshold to use in 'git gui blame' original location
	detection, measured in alphanumeric characters. See the
	linkgit:git-blame[1] manual for more information on copy detection.

gui.blamehistoryctx::
	Specifies the radius of history context in days to show in
	linkgit:gitk[1] for the selected commit, when the `Show History
	Context` menu item is invoked from 'git gui blame'. If this
	variable is set to zero, the whole history is shown.

guitool.<name>.cmd::
	Specifies the shell command line to execute when the corresponding item
	of the linkgit:git-gui[1] `Tools` menu is invoked. This option is
	mandatory for every tool. The command is executed from the root of
	the working directory, and in the environment it receives the name of
	the tool as 'GIT_GUITOOL', the name of the currently selected file as
	'FILENAME', and the name of the current branch as 'CUR_BRANCH' (if
	the head is detached, 'CUR_BRANCH' is empty).

guitool.<name>.needsfile::
	Run the tool only if a diff is selected in the GUI. It guarantees
	that 'FILENAME' is not empty.

guitool.<name>.noconsole::
	Run the command silently, without creating a window to display its
	output.

guitool.<name>.norescan::
	Don't rescan the working directory for changes after the tool
	finishes execution.

guitool.<name>.confirm::
	Show a confirmation dialog before actually running the tool.

guitool.<name>.argprompt::
	Request a string argument from the user, and pass it to the tool
	through the 'ARGS' environment variable. Since requesting an
	argument implies confirmation, the 'confirm' option has no effect
	if this is enabled. If the option is set to 'true', 'yes', or '1',
	the dialog uses a built-in generic prompt; otherwise the exact
	value of the variable is used.

guitool.<name>.revprompt::
	Request a single valid revision from the user, and set the
	'REVISION' environment variable. In other aspects this option
	is similar to 'argprompt', and can be used together with it.

guitool.<name>.revunmerged::
	Show only unmerged branches in the 'revprompt' subdialog.
	This is useful for tools similar to merge or rebase, but not
	for things like checkout or reset.

guitool.<name>.title::
	Specifies the title to use for the prompt dialog. The default
	is the tool name.

guitool.<name>.prompt::
	Specifies the general prompt string to display at the top of
	the dialog, before subsections for 'argprompt' and 'revprompt'.
	The default value includes the actual command.

help.browser::
	Specify the browser that will be used to display help in the
	'web' format. See linkgit:git-help[1].

help.format::
	Override the default help format used by linkgit:git-help[1].
	Values 'man', 'info', 'web' and 'html' are supported. 'man' is
	the default. 'web' and 'html' are the same.

help.autocorrect::
	Automatically correct and execute mistyped commands after
	waiting for the given number of deciseconds (0.1 sec). If more
	than one command can be deduced from the entered text, nothing
	will be executed.  If the value of this option is negative,
	the corrected command will be executed immediately. If the
	value is 0 - the command will be just shown but not executed.
	This is the default.

http.proxy::
	Override the HTTP proxy, normally configured using the 'http_proxy'
	environment variable (see linkgit:curl[1]).  This can be overridden
	on a per-remote basis; see remote.<name>.proxy

http.sslVerify::
	Whether to verify the SSL certificate when fetching or pushing
	over HTTPS. Can be overridden by the 'GIT_SSL_NO_VERIFY' environment
	variable.

http.sslCert::
	File containing the SSL certificate when fetching or pushing
	over HTTPS. Can be overridden by the 'GIT_SSL_CERT' environment
	variable.

http.sslKey::
	File containing the SSL private key when fetching or pushing
	over HTTPS. Can be overridden by the 'GIT_SSL_KEY' environment
	variable.

http.sslCertPasswordProtected::
	Enable git's password prompt for the SSL certificate.  Otherwise
	OpenSSL will prompt the user, possibly many times, if the
	certificate or private key is encrypted.  Can be overridden by the
	'GIT_SSL_CERT_PASSWORD_PROTECTED' environment variable.

http.sslCAInfo::
	File containing the certificates to verify the peer with when
	fetching or pushing over HTTPS. Can be overridden by the
	'GIT_SSL_CAINFO' environment variable.

http.sslCAPath::
	Path containing files with the CA certificates to verify the peer
	with when fetching or pushing over HTTPS. Can be overridden
	by the 'GIT_SSL_CAPATH' environment variable.

http.maxRequests::
	How many HTTP requests to launch in parallel. Can be overridden
	by the 'GIT_HTTP_MAX_REQUESTS' environment variable. Default is 5.

http.minSessions::
	The number of curl sessions (counted across slots) to be kept across
	requests. They will not be ended with curl_easy_cleanup() until
	http_cleanup() is invoked. If USE_CURL_MULTI is not defined, this
	value will be capped at 1. Defaults to 1.

http.postBuffer::
	Maximum size in bytes of the buffer used by smart HTTP
	transports when POSTing data to the remote system.
	For requests larger than this buffer size, HTTP/1.1 and
	Transfer-Encoding: chunked is used to avoid creating a
	massive pack file locally.  Default is 1 MiB, which is
	sufficient for most requests.

http.lowSpeedLimit, http.lowSpeedTime::
	If the HTTP transfer speed is less than 'http.lowSpeedLimit'
	for longer than 'http.lowSpeedTime' seconds, the transfer is aborted.
	Can be overridden by the 'GIT_HTTP_LOW_SPEED_LIMIT' and
	'GIT_HTTP_LOW_SPEED_TIME' environment variables.

http.noEPSV::
	A boolean which disables using of EPSV ftp command by curl.
	This can helpful with some "poor" ftp servers which don't
	support EPSV mode. Can be overridden by the 'GIT_CURL_FTP_NO_EPSV'
	environment variable. Default is false (curl will use EPSV).

http.useragent::
	The HTTP USER_AGENT string presented to an HTTP server.  The default
	value represents the version of the client git such as git/1.7.1.
	This option allows you to override this value to a more common value
	such as Mozilla/4.0.  This may be necessary, for instance, if
	connecting through a firewall that restricts HTTP connections to a set
	of common USER_AGENT strings (but not including those like git/1.7.1).
	Can be overridden by the 'GIT_HTTP_USER_AGENT' environment variable.

i18n.commitEncoding::
	Character encoding the commit messages are stored in; git itself
	does not care per se, but this information is necessary e.g. when
	importing commits from emails or in the gitk graphical history
	browser (and possibly at other places in the future or in other
	porcelains). See e.g. linkgit:git-mailinfo[1]. Defaults to 'utf-8'.

i18n.logOutputEncoding::
	Character encoding the commit messages are converted to when
	running 'git log' and friends.

imap::
	The configuration variables in the 'imap' section are described
	in linkgit:git-imap-send[1].

init.templatedir::
	Specify the directory from which templates will be copied.
	(See the "TEMPLATE DIRECTORY" section of linkgit:git-init[1].)

instaweb.browser::
	Specify the program that will be used to browse your working
	repository in gitweb. See linkgit:git-instaweb[1].

instaweb.httpd::
	The HTTP daemon command-line to start gitweb on your working
	repository. See linkgit:git-instaweb[1].

instaweb.local::
	If true the web server started by linkgit:git-instaweb[1] will
	be bound to the local IP (127.0.0.1).

instaweb.modulepath::
	The default module path for linkgit:git-instaweb[1] to use
	instead of /usr/lib/apache2/modules.  Only used if httpd
	is Apache.

instaweb.port::
	The port number to bind the gitweb httpd to. See
	linkgit:git-instaweb[1].

interactive.singlekey::
	In interactive commands, allow the user to provide one-letter
	input with a single key (i.e., without hitting enter).
	Currently this is used only by the `\--patch` mode of
	linkgit:git-add[1].  Note that this setting is silently
	ignored if portable keystroke input is not available.

log.date::
	Set the default date-time mode for the 'log' command.
	Setting a value for log.date is similar to using 'git log''s
	`\--date` option.  Possible values are `relative`, `local`,
	`default`, `iso`, `rfc`, and `short`; see linkgit:git-log[1]
	for details.

log.decorate::
	Print out the ref names of any commits that are shown by the log
	command. If 'short' is specified, the ref name prefixes 'refs/heads/',
	'refs/tags/' and 'refs/remotes/' will not be printed. If 'full' is
	specified, the full ref name (including prefix) will be printed.
	This is the same as the log commands '--decorate' option.

log.showroot::
	If true, the initial commit will be shown as a big creation event.
	This is equivalent to a diff against an empty tree.
	Tools like linkgit:git-log[1] or linkgit:git-whatchanged[1], which
	normally hide the root commit will now show it. True by default.

mailmap.file::
	The location of an augmenting mailmap file. The default
	mailmap, located in the root of the repository, is loaded
	first, then the mailmap file pointed to by this variable.
	The location of the mailmap file may be in a repository
	subdirectory, or somewhere outside of the repository itself.
	See linkgit:git-shortlog[1] and linkgit:git-blame[1].

man.viewer::
	Specify the programs that may be used to display help in the
	'man' format. See linkgit:git-help[1].

man.<tool>.cmd::
	Specify the command to invoke the specified man viewer. The
	specified command is evaluated in shell with the man page
	passed as argument. (See linkgit:git-help[1].)

man.<tool>.path::
	Override the path for the given tool that may be used to
	display help in the 'man' format. See linkgit:git-help[1].

include::merge-config.txt[]

mergetool.<tool>.path::
	Override the path for the given tool.  This is useful in case
	your tool is not in the PATH.

mergetool.<tool>.cmd::
	Specify the command to invoke the specified merge tool.  The
	specified command is evaluated in shell with the following
	variables available: 'BASE' is the name of a temporary file
	containing the common base of the files to be merged, if available;
	'LOCAL' is the name of a temporary file containing the contents of
	the file on the current branch; 'REMOTE' is the name of a temporary
	file containing the contents of the file from the branch being
	merged; 'MERGED' contains the name of the file to which the merge
	tool should write the results of a successful merge.

mergetool.<tool>.trustExitCode::
	For a custom merge command, specify whether the exit code of
	the merge command can be used to determine whether the merge was
	successful.  If this is not set to true then the merge target file
	timestamp is checked and the merge assumed to have been successful
	if the file has been updated, otherwise the user is prompted to
	indicate the success of the merge.

mergetool.keepBackup::
	After performing a merge, the original file with conflict markers
	can be saved as a file with a `.orig` extension.  If this variable
	is set to `false` then this file is not preserved.  Defaults to
	`true` (i.e. keep the backup files).

mergetool.keepTemporaries::
	When invoking a custom merge tool, git uses a set of temporary
	files to pass to the tool. If the tool returns an error and this
	variable is set to `true`, then these temporary files will be
	preserved, otherwise they will be removed after the tool has
	exited. Defaults to `false`.

mergetool.prompt::
	Prompt before each invocation of the merge resolution program.

notes.displayRef::
	The (fully qualified) refname from which to show notes when
	showing commit messages.  The value of this variable can be set
	to a glob, in which case notes from all matching refs will be
	shown.  You may also specify this configuration variable
	several times.  A warning will be issued for refs that do not
	exist, but a glob that does not match any refs is silently
	ignored.
+
This setting can be overridden with the `GIT_NOTES_DISPLAY_REF`
environment variable, which must be a colon separated list of refs or
globs.
+
The effective value of "core.notesRef" (possibly overridden by
GIT_NOTES_REF) is also implicitly added to the list of refs to be
displayed.

notes.rewrite.<command>::
	When rewriting commits with <command> (currently `amend` or
	`rebase`) and this variable is set to `true`, git
	automatically copies your notes from the original to the
	rewritten commit.  Defaults to `true`, but see
	"notes.rewriteRef" below.

notes.rewriteMode::
	When copying notes during a rewrite (see the
	"notes.rewrite.<command>" option), determines what to do if
	the target commit already has a note.  Must be one of
	`overwrite`, `concatenate`, or `ignore`.  Defaults to
	`concatenate`.
+
This setting can be overridden with the `GIT_NOTES_REWRITE_MODE`
environment variable.

notes.rewriteRef::
	When copying notes during a rewrite, specifies the (fully
	qualified) ref whose notes should be copied.  The ref may be a
	glob, in which case notes in all matching refs will be copied.
	You may also specify this configuration several times.
+
Does not have a default value; you must configure this variable to
enable note rewriting.
+
This setting can be overridden with the `GIT_NOTES_REWRITE_REF`
environment variable, which must be a colon separated list of refs or
globs.

pack.window::
	The size of the window used by linkgit:git-pack-objects[1] when no
	window size is given on the command line. Defaults to 10.

pack.depth::
	The maximum delta depth used by linkgit:git-pack-objects[1] when no
	maximum depth is given on the command line. Defaults to 50.

pack.windowMemory::
	The window memory size limit used by linkgit:git-pack-objects[1]
	when no limit is given on the command line.  The value can be
	suffixed with "k", "m", or "g".  Defaults to 0, meaning no
	limit.

pack.compression::
	An integer -1..9, indicating the compression level for objects
	in a pack file. -1 is the zlib default. 0 means no
	compression, and 1..9 are various speed/size tradeoffs, 9 being
	slowest.  If not set,  defaults to core.compression.  If that is
	not set,  defaults to -1, the zlib default, which is "a default
	compromise between speed and compression (currently equivalent
	to level 6)."
+
Note that changing the compression level will not automatically recompress
all existing objects. You can force recompression by passing the -F option
to linkgit:git-repack[1].

pack.deltaCacheSize::
	The maximum memory in bytes used for caching deltas in
	linkgit:git-pack-objects[1] before writing them out to a pack.
	This cache is used to speed up the writing object phase by not
	having to recompute the final delta result once the best match
	for all objects is found.  Repacking large repositories on machines
	which are tight with memory might be badly impacted by this though,
	especially if this cache pushes the system into swapping.
	A value of 0 means no limit. The smallest size of 1 byte may be
	used to virtually disable this cache. Defaults to 256 MiB.

pack.deltaCacheLimit::
	The maximum size of a delta, that is cached in
	linkgit:git-pack-objects[1]. This cache is used to speed up the
	writing object phase by not having to recompute the final delta
	result once the best match for all objects is found. Defaults to 1000.

pack.threads::
	Specifies the number of threads to spawn when searching for best
	delta matches.  This requires that linkgit:git-pack-objects[1]
	be compiled with pthreads otherwise this option is ignored with a
	warning. This is meant to reduce packing time on multiprocessor
	machines. The required amount of memory for the delta search window
	is however multiplied by the number of threads.
	Specifying 0 will cause git to auto-detect the number of CPU's
	and set the number of threads accordingly.

pack.indexVersion::
	Specify the default pack index version.  Valid values are 1 for
	legacy pack index used by Git versions prior to 1.5.2, and 2 for
	the new pack index with capabilities for packs larger than 4 GB
	as well as proper protection against the repacking of corrupted
	packs.  Version 2 is the default.  Note that version 2 is enforced
	and this config option ignored whenever the corresponding pack is
	larger than 2 GB.
+
If you have an old git that does not understand the version 2 `{asterisk}.idx` file,
cloning or fetching over a non native protocol (e.g. "http" and "rsync")
that will copy both `{asterisk}.pack` file and corresponding `{asterisk}.idx` file from the
other side may give you a repository that cannot be accessed with your
older version of git. If the `{asterisk}.pack` file is smaller than 2 GB, however,
you can use linkgit:git-index-pack[1] on the *.pack file to regenerate
the `{asterisk}.idx` file.

pack.packSizeLimit::
	The maximum size of a pack.  This setting only affects
	packing to a file when repacking, i.e. the git:// protocol
	is unaffected.  It can be overridden by the `\--max-pack-size`
	option of linkgit:git-repack[1]. The minimum size allowed is
	limited to 1 MiB. The default is unlimited.
	Common unit suffixes of 'k', 'm', or 'g' are
	supported.

pager.<cmd>::
	If the value is boolean, turns on or off pagination of the
	output of a particular git subcommand when writing to a tty.
	Otherwise, turns on pagination for the subcommand using the
	pager specified by the value of `pager.<cmd>`.  If `\--paginate`
	or `\--no-pager` is specified on the command line, it takes
	precedence over this option.  To disable pagination for all
	commands, set `core.pager` or `GIT_PAGER` to `cat`.

pretty.<name>::
	Alias for a --pretty= format string, as specified in
	linkgit:git-log[1]. Any aliases defined here can be used just
	as the built-in pretty formats could. For example,
	running `git config pretty.changelog "format:{asterisk} %H %s"`
	would cause the invocation `git log --pretty=changelog`
	to be equivalent to running `git log "--pretty=format:{asterisk} %H %s"`.
	Note that an alias with the same name as a built-in format
	will be silently ignored.

pull.octopus::
	The default merge strategy to use when pulling multiple branches
	at once.

pull.twohead::
	The default merge strategy to use when pulling a single branch.

push.default::
	Defines the action git push should take if no refspec is given
	on the command line, no refspec is configured in the remote, and
	no refspec is implied by any of the options given on the command
	line. Possible values are:
+
* `nothing` - do not push anything.
* `matching` - push all matching branches.
  All branches having the same name in both ends are considered to be
  matching. This is the default.
* `tracking` - push the current branch to its upstream branch.
* `current` - push the current branch to a branch of the same name.

rebase.stat::
	Whether to show a diffstat of what changed upstream since the last
	rebase. False by default.

rebase.autosquash::
	If set to true enable '--autosquash' option by default.

receive.autogc::
	By default, git-receive-pack will run "git-gc --auto" after
	receiving data from git-push and updating refs.  You can stop
	it by setting this variable to false.

receive.fsckObjects::
	If it is set to true, git-receive-pack will check all received
	objects. It will abort in the case of a malformed object or a
	broken link. The result of an abort are only dangling objects.
	Defaults to false.

receive.unpackLimit::
	If the number of objects received in a push is below this
	limit then the objects will be unpacked into loose object
	files. However if the number of received objects equals or
	exceeds this limit then the received pack will be stored as
	a pack, after adding any missing delta bases.  Storing the
	pack from a push can make the push operation complete faster,
	especially on slow filesystems.  If not set, the value of
	`transfer.unpackLimit` is used instead.

receive.denyDeletes::
	If set to true, git-receive-pack will deny a ref update that deletes
	the ref. Use this to prevent such a ref deletion via a push.

receive.denyDeleteCurrent::
	If set to true, git-receive-pack will deny a ref update that
	deletes the currently checked out branch of a non-bare repository.

receive.denyCurrentBranch::
	If set to true or "refuse", git-receive-pack will deny a ref update
	to the currently checked out branch of a non-bare repository.
	Such a push is potentially dangerous because it brings the HEAD
	out of sync with the index and working tree. If set to "warn",
	print a warning of such a push to stderr, but allow the push to
	proceed. If set to false or "ignore", allow such pushes with no
	message. Defaults to "refuse".

receive.denyNonFastForwards::
	If set to true, git-receive-pack will deny a ref update which is
	not a fast-forward. Use this to prevent such an update via a push,
	even if that push is forced. This configuration variable is
	set when initializing a shared repository.

receive.updateserverinfo::
	If set to true, git-receive-pack will run git-update-server-info
	after receiving data from git-push and updating refs.

remote.<name>.url::
	The URL of a remote repository.  See linkgit:git-fetch[1] or
	linkgit:git-push[1].

remote.<name>.pushurl::
	The push URL of a remote repository.  See linkgit:git-push[1].

remote.<name>.proxy::
	For remotes that require curl (http, https and ftp), the URL to
	the proxy to use for that remote.  Set to the empty string to
	disable proxying for that remote.

remote.<name>.fetch::
	The default set of "refspec" for linkgit:git-fetch[1]. See
	linkgit:git-fetch[1].

remote.<name>.push::
	The default set of "refspec" for linkgit:git-push[1]. See
	linkgit:git-push[1].

remote.<name>.mirror::
	If true, pushing to this remote will automatically behave
	as if the `\--mirror` option was given on the command line.

remote.<name>.skipDefaultUpdate::
	If true, this remote will be skipped by default when updating
	using linkgit:git-fetch[1] or the `update` subcommand of
	linkgit:git-remote[1].

remote.<name>.skipFetchAll::
	If true, this remote will be skipped by default when updating
	using linkgit:git-fetch[1] or the `update` subcommand of
	linkgit:git-remote[1].

remote.<name>.receivepack::
	The default program to execute on the remote side when pushing.  See
	option \--receive-pack of linkgit:git-push[1].

remote.<name>.uploadpack::
	The default program to execute on the remote side when fetching.  See
	option \--upload-pack of linkgit:git-fetch-pack[1].

remote.<name>.tagopt::
	Setting this value to \--no-tags disables automatic tag following when
	fetching from remote <name>. Setting it to \--tags will fetch every
	tag from remote <name>, even if they are not reachable from remote
	branch heads. Passing these flags directly to linkgit:git-fetch[1] can
	override this setting. See options \--tags and \--no-tags of
	linkgit:git-fetch[1].

remote.<name>.vcs::
	Setting this to a value <vcs> will cause git to interact with
	the remote with the git-remote-<vcs> helper.

remotes.<group>::
	The list of remotes which are fetched by "git remote update
	<group>".  See linkgit:git-remote[1].

repack.usedeltabaseoffset::
	By default, linkgit:git-repack[1] creates packs that use
	delta-base offset. If you need to share your repository with
	git older than version 1.4.4, either directly or via a dumb
	protocol such as http, then you need to set this option to
	"false" and repack. Access from old git versions over the
	native protocol are unaffected by this option.

rerere.autoupdate::
	When set to true, `git-rerere` updates the index with the
	resulting contents after it cleanly resolves conflicts using
	previously recorded resolution.  Defaults to false.

rerere.enabled::
	Activate recording of resolved conflicts, so that identical
	conflict hunks can be resolved automatically, should they
	be encountered again.  linkgit:git-rerere[1] command is by
	default enabled if you create `rr-cache` directory under
	`$GIT_DIR`, but can be disabled by setting this option to false.

sendemail.identity::
	A configuration identity. When given, causes values in the
	'sendemail.<identity>' subsection to take precedence over
	values in the 'sendemail' section. The default identity is
	the value of 'sendemail.identity'.

sendemail.smtpencryption::
	See linkgit:git-send-email[1] for description.  Note that this
	setting is not subject to the 'identity' mechanism.

sendemail.smtpssl::
	Deprecated alias for 'sendemail.smtpencryption = ssl'.

sendemail.<identity>.*::
	Identity-specific versions of the 'sendemail.*' parameters
	found below, taking precedence over those when the this
	identity is selected, through command-line or
	'sendemail.identity'.

sendemail.aliasesfile::
sendemail.aliasfiletype::
sendemail.bcc::
sendemail.cc::
sendemail.cccmd::
sendemail.chainreplyto::
sendemail.confirm::
sendemail.envelopesender::
sendemail.from::
sendemail.multiedit::
sendemail.signedoffbycc::
sendemail.smtppass::
sendemail.suppresscc::
sendemail.suppressfrom::
sendemail.to::
sendemail.smtpdomain::
sendemail.smtpserver::
sendemail.smtpserverport::
sendemail.smtpserveroption::
sendemail.smtpuser::
sendemail.thread::
sendemail.validate::
	See linkgit:git-send-email[1] for description.

sendemail.signedoffcc::
	Deprecated alias for 'sendemail.signedoffbycc'.

showbranch.default::
	The default set of branches for linkgit:git-show-branch[1].
	See linkgit:git-show-branch[1].

status.relativePaths::
	By default, linkgit:git-status[1] shows paths relative to the
	current directory. Setting this variable to `false` shows paths
	relative to the repository root (this was the default for git
	prior to v1.5.4).

status.showUntrackedFiles::
	By default, linkgit:git-status[1] and linkgit:git-commit[1] show
	files which are not currently tracked by Git. Directories which
	contain only untracked files, are shown with the directory name
	only. Showing untracked files means that Git needs to lstat() all
	all the files in the whole repository, which might be slow on some
	systems. So, this variable controls how the commands displays
	the untracked files. Possible values are:
+
--
* `no` - Show no untracked files.
* `normal` - Show untracked files and directories.
* `all` - Show also individual files in untracked directories.
--
+
If this variable is not specified, it defaults to 'normal'.
This variable can be overridden with the -u|--untracked-files option
of linkgit:git-status[1] and linkgit:git-commit[1].

status.submodulesummary::
	Defaults to false.
	If this is set to a non zero number or true (identical to -1 or an
	unlimited number), the submodule summary will be enabled and a
	summary of commits for modified submodules will be shown (see
	--summary-limit option of linkgit:git-submodule[1]).

submodule.<name>.path::
submodule.<name>.url::
submodule.<name>.update::
	The path within this project, URL, and the updating strategy
	for a submodule.  These variables are initially populated
	by 'git submodule init'; edit them to override the
	URL and other values found in the `.gitmodules` file.  See
	linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.

submodule.<name>.fetchRecurseSubmodules::
	This option can be used to enable/disable recursive fetching of this
	submodule. It can be overridden by using the --[no-]recurse-submodules
	command line option to "git fetch" and "git pull".
	This setting will override that from in the linkgit:gitmodules[5]
	file.

submodule.<name>.ignore::
	Defines under what circumstances "git status" and the diff family show
	a submodule as modified. When set to "all", it will never be considered
	modified, "dirty" will ignore all changes to the submodules work tree and
	takes only differences between the HEAD of the submodule and the commit
	recorded in the superproject into account. "untracked" will additionally
	let submodules with modified tracked files in their work tree show up.
	Using "none" (the default when this option is not set) also shows
	submodules that have untracked files in their work tree as changed.
	This setting overrides any setting made in .gitmodules for this submodule,
	both settings can be overridden on the command line by using the
	"--ignore-submodules" option.

tar.umask::
	This variable can be used to restrict the permission bits of
	tar archive entries.  The default is 0002, which turns off the
	world write bit.  The special value "user" indicates that the
	archiving user's umask will be used instead.  See umask(2) and
	linkgit:git-archive[1].

transfer.unpackLimit::
	When `fetch.unpackLimit` or `receive.unpackLimit` are
	not set, the value of this variable is used instead.
	The default value is 100.

url.<base>.insteadOf::
	Any URL that starts with this value will be rewritten to
	start, instead, with <base>. In cases where some site serves a
	large number of repositories, and serves them with multiple
	access methods, and some users need to use different access
	methods, this feature allows people to specify any of the
	equivalent URLs and have git automatically rewrite the URL to
	the best alternative for the particular user, even for a
	never-before-seen repository on the site.  When more than one
	insteadOf strings match a given URL, the longest match is used.

url.<base>.pushInsteadOf::
	Any URL that starts with this value will not be pushed to;
	instead, it will be rewritten to start with <base>, and the
	resulting URL will be pushed to. In cases where some site serves
	a large number of repositories, and serves them with multiple
	access methods, some of which do not allow push, this feature
	allows people to specify a pull-only URL and have git
	automatically use an appropriate URL to push, even for a
	never-before-seen repository on the site.  When more than one
	pushInsteadOf strings match a given URL, the longest match is
	used.  If a remote has an explicit pushurl, git will ignore this
	setting for that remote.

user.email::
	Your email address to be recorded in any newly created commits.
	Can be overridden by the 'GIT_AUTHOR_EMAIL', 'GIT_COMMITTER_EMAIL', and
	'EMAIL' environment variables.  See linkgit:git-commit-tree[1].

user.name::
	Your full name to be recorded in any newly created commits.
	Can be overridden by the 'GIT_AUTHOR_NAME' and 'GIT_COMMITTER_NAME'
	environment variables.  See linkgit:git-commit-tree[1].

user.signingkey::
	If linkgit:git-tag[1] is not selecting the key you want it to
	automatically when creating a signed tag, you can override the
	default selection with this variable.  This option is passed
	unchanged to gpg's --local-user parameter, so you may specify a key
	using any method that gpg supports.

web.browser::
	Specify a web browser that may be used by some commands.
	Currently only linkgit:git-instaweb[1] and linkgit:git-help[1]
	may use it.
