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

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

They can be used by both the git plumbing
and the porcelains. The variables are divided into sections, where
in the fully qualified variable name 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 section
header before 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 example below:

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

--------

Subsection names can contain any characters except newline (doublequote
'`"`' and backslash have to be escaped as '`\"`' and '`\\`',
respectively) and are case sensitive.  Section header 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 (case insensitive) alternative `[section.subsection]` syntax.
In this syntax subsection names follow the same restrictions as for section
name.

All the other lines 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 or true/false.  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 value in double quotes if you want to
preserve leading or trailing whitespace, or if variable value contains
beginning of comment characters (if it contains '#' or ';').
Double quote '`"`' and backslash '`\`' characters in variable value 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 value ending in a '`\`' is continued on the next line in the
customary UNIX fashion.

Some variables may require 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.

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]. True by default.

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.autocrlf::
	If true, makes git convert `CRLF` at the end of lines in text files to
	`LF` when reading from the filesystem, and convert in reverse when
	writing to the filesystem.  The variable can be set to
	'input', in which case the conversion happens only while
	reading from the filesystem but files are written out with
	`LF` at the end of lines.  Currently, which paths to consider
	"text" (i.e. be subjected to the autocrlf mechanism) is
	decided purely based on the contents.

core.safecrlf::
	If true, makes git check if converting `CRLF` as controlled by
	`core.autocrlf` is reversible.  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.
autocrlf=true 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.autocrlf`, but only for the current one.  For example, a text
file with `LF` would be accepted with `core.autocrlf=input` and could
later be checked out with `core.autocrlf=true`, 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.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. True by default.

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

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
	a 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, and thus, users with a safe umask (0077) can use
	this option. Examples: '0660' is equivalent to 'group'. '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.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 multiple deltafied objects reference.  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.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.  See
	linkgit:gitignore[5].

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.  The order of preference is
	`GIT_EDITOR` environment, `core.editor`, `VISUAL` and
	`EDITOR` environment variables and then finally `vi`.

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 or by giving the
	`core.pager` option a value such as "`less -+FRSX`".

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`):
+
* `trailing-space` 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).
* `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).

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").

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

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 setup 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 branch; `always` -- automatic setup is
	done when the starting point is either a local branch or remote
	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 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' which remote to fetch.
	If this option is not given, 'git-fetch' defaults to remote "origin".

branch.<name>.merge::
	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 equal to that 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 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), `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.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`, or `help`, for
	three distinct types of normal output from interactive
	programs.  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.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), 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>.

commit.template::
	Specify a file to use as the template for new commit messages.

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.

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

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.numbered::
	A boolean which can enable sequence numbers in patch subjects.
	Setting this option to "auto" will enable it only if there is
	more than one patch.  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.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].

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

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::
	'git-gc' does not run `git pack-refs` in a bare repository by
	default so that older dumb-transport clients can still fetch
	from the repository.  Setting this to `true` lets 'git-gc'
	to run `git pack-refs`.  Setting this to `false` tells
	'git-gc' never to run `git pack-refs`. The default setting is
	`notbare`. Enable it only when you know you do not have to
	support such clients.  The default setting will change to `true`
	at some stage, and setting this to `false` will continue to
	prevent `git pack-refs` from being run from 'git-gc'.

gc.pruneexpire::
	When 'git-gc' is run, it will call 'prune --expire 2.weeks.ago'.
	Override the grace period with this config variable.

gc.reflogexpire::
	'git-reflog expire' removes reflog entries older than
	this time; defaults to 90 days.

gc.reflogexpireunreachable::
	'git-reflog expire' removes reflog entries older than
	this time and are not reachable from the current tip;
	defaults to 30 days.

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

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.

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 `crlf` attribute for
	files to determine the '-k' modes to use. If `crlf` is set,
	the '-k' mode will be left blank, so cvs clients will
	treat it as text. If `crlf` is explicitly unset, the file
	will be set with '-kb' mode, which suppresses any newline munging
	the client might otherwise do. If `crlf` is not specified,
	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.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 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.

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.

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

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.

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 module path for an apache httpd used by linkgit:git-instaweb[1].

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

log.date::
	Set default date-time mode for the log command. Setting log.date
	value is similar to using 'git-log'\'s --date option. The value is one of the
	following alternatives: {relative,local,default,iso,rfc,short}.
	See linkgit:git-log[1].

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.

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

include::merge-config.txt[]

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

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

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)."

pack.deltaCacheSize::
	The maximum memory in bytes used for caching deltas in
	linkgit:git-pack-objects[1].
	A value of 0 means no limit. Defaults to 0.

pack.deltaCacheLimit::
	The maximum size of a delta, that is cached in
	linkgit:git-pack-objects[1]. 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 default maximum size of a pack.  This setting only affects
	packing to a file, i.e. the git:// protocol is unaffected.  It
	can be overridden by the `\--max-pack-size` option of
	linkgit:git-repack[1].

pager.<cmd>::
	Allows turning on or off pagination of the output of a
	particular git subcommand when writing to a tty.  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`".

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.

remote.<name>.url::
	The URL of a remote repository.  See linkgit:git-fetch[1] or
	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 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>

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.

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' - Shows untracked files and directories
	- 'all'    - Shows 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].

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

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.

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.

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

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

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

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.
