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

The git configuration file contains a number of variables that affect
the git command's behavior. 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.

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, lines containing strings enclosed in square
brackets start sections and 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". String values may be entirely or partially
enclosed in double quotes; 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/gnu-diff -u"
		renames = true

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


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 gitlink:git-update-index[1]. 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::
	The working copy files are assumed to stay unchanged 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 gitlink: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.logAllRefUpdates::
	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). See gitlink:git-init-db[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 the compression level for objects that
	are not in a pack file. -1 is the zlib and git default. 0 means no
	compression, and 1..9 are various speed/size tradeoffs, 9 being
	slowest.

core.legacyheaders::
	A boolean which enables the legacy object header format in case
	you want to interoperate with old clients accessing the object
	database directly (where the "http://" and "rsync://" protocols
	count as direct access).

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.

alias.*::
	Command aliases for the gitlink: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.

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

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 has exactly to match
	a remote part of one of the refspecs which are 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.

color.branch::
	A boolean to enable/disable color in the output of
	gitlink:git-branch[1]. May be set to `true` (or `always`),
	`false` (or `never`) or `auto`, 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), or `reset` (the normal terminal color).  The value for
	these configuration variables can be one of: `normal`, `bold`,
	`dim`, `ul`, `blink`, `reverse`, `reset`, `black`, `red`,
	`green`, `yellow`, `blue`, `magenta`, `cyan`, or `white`.

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

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), or `new` (added lines).  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
	gitlink:git-status[1]. May be set to `true` (or `always`),
	`false` (or `never`) or `auto`, 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),
	or `untracked` (files which are not tracked by git). The values of
	these variables may be specified as in color.branch.<slot>.

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.

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

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 gitlink: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 gitlink:git-rerere[1].

gitcvs.enabled::
	Whether the cvs pserver interface is enabled for this repository.
	See gitlink:git-cvsserver[1].

gitcvs.logfile::
	Path to a log file where the cvs pserver interface well... logs
	various stuff. See gitlink:git-cvsserver[1].

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 doesn'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. gitlink:git-mailinfo[1]. Defaults to 'utf-8'.

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

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 gitlink:git-log[1] or gitlink:git-whatchanged[1], which
	normally hide the root commit will now show it. True by default.

merge.summary::
	Whether to include summaries of merged commits in newly created
	merge commit messages. False by default.

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

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 gitlink:git-fetch[1] or
	gitlink:git-push[1].

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

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

repack.usedeltabaseoffset::
	Allow gitlink:git-repack[1] to create packs that uses
	delta-base offset.  Defaults to false.

show.difftree::
	The default gitlink:git-diff-tree[1] arguments to be used
	for gitlink:git-show[1].

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

tar.umask::
	By default, gitlink:git-tar-tree[1] sets file and directories modes
	to 0666 or 0777. While this is both useful and acceptable for projects
	such as the Linux Kernel, it might be excessive for other projects.
	With this variable, it becomes possible to tell
	gitlink:git-tar-tree[1] to apply a specific umask to the modes above.
	The special value "user" indicates that the user's current umask will
	be used. This should be enough for most projects, as it will lead to
	the same permissions as gitlink:git-checkout[1] would use. The default
	value remains 0, which means world read-write.

user.email::
	Your email address to be recorded in any newly created commits.
	Can be overridden by the 'GIT_AUTHOR_EMAIL' and 'GIT_COMMITTER_EMAIL'
	environment variables.  See gitlink: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 gitlink:git-commit-tree[1].

whatchanged.difftree::
	The default gitlink:git-diff-tree[1] arguments to be used
	for gitlink:git-whatchanged[1].

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

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.

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.

