2006-04-25 06:59:33 +08:00
|
|
|
CONFIGURATION FILE
|
|
|
|
------------------
|
|
|
|
|
2013-01-22 03:17:53 +08:00
|
|
|
The Git configuration file contains a number of variables that affect
|
|
|
|
the Git commands' behavior. The `.git/config` file in each repository
|
2009-04-23 17:38:02 +08:00
|
|
|
is used to store the configuration for that repository, and
|
|
|
|
`$HOME/.gitconfig` is used to store a per-user configuration as
|
2009-04-23 17:38:00 +08:00
|
|
|
fallback values for the `.git/config` file. The file `/etc/gitconfig`
|
2009-04-23 17:38:02 +08:00
|
|
|
can be used to store a system-wide default configuration.
|
2007-01-17 14:45:35 +08:00
|
|
|
|
2013-01-22 03:17:53 +08:00
|
|
|
The configuration variables are used by both the Git plumbing
|
2009-04-23 17:38:01 +08:00
|
|
|
and the porcelains. The variables are divided into sections, wherein
|
|
|
|
the fully qualified variable name of the variable itself is the last
|
2006-04-25 06:59:33 +08:00
|
|
|
dot-separated segment and the section name is everything before the last
|
2012-03-01 18:59:45 +08:00
|
|
|
dot. The variable names are case-insensitive, allow only alphanumeric
|
|
|
|
characters and `-`, and must start with an alphabetic character. Some
|
2015-03-05 02:26:17 +08:00
|
|
|
variables may appear multiple times; we say then that the variable is
|
|
|
|
multivalued.
|
2006-04-25 06:59:33 +08:00
|
|
|
|
2007-01-22 23:25:47 +08:00
|
|
|
Syntax
|
|
|
|
~~~~~~
|
|
|
|
|
2006-04-25 06:59:33 +08:00
|
|
|
The syntax is fairly flexible and permissive; whitespaces are mostly
|
2007-01-22 23:25:47 +08:00
|
|
|
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
|
2015-03-04 12:03:50 +08:00
|
|
|
section begins. Section names are case-insensitive. Only alphanumeric
|
2009-03-15 19:30:52 +08:00
|
|
|
characters, `-` and `.` are allowed in section names. Each variable
|
2009-04-23 17:38:00 +08:00
|
|
|
must belong to some section, which means that there must be a section
|
|
|
|
header before the first setting of a variable.
|
2007-01-22 23:25:47 +08:00
|
|
|
|
|
|
|
Sections can be further divided into subsections. To begin a subsection
|
|
|
|
put its name in double quotes, separated by space from the section name,
|
2009-04-23 17:38:00 +08:00
|
|
|
in the section header, like in the example below:
|
2007-01-22 23:25:47 +08:00
|
|
|
|
|
|
|
--------
|
|
|
|
[section "subsection"]
|
|
|
|
|
|
|
|
--------
|
|
|
|
|
2009-04-23 17:38:01 +08:00
|
|
|
Subsection names are case sensitive and can contain any characters except
|
2017-12-21 21:10:42 +08:00
|
|
|
newline and the null byte. Doublequote `"` and backslash can be included
|
|
|
|
by escaping them as `\"` and `\\`, respectively. Backslashes preceding
|
|
|
|
other characters are dropped when reading; for example, `\t` is read as
|
|
|
|
`t` and `\0` is read as `0` 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.
|
2007-01-22 23:25:47 +08:00
|
|
|
|
2011-10-12 23:52:06 +08:00
|
|
|
There is also a deprecated `[section.subsection]` syntax. With this
|
|
|
|
syntax, the subsection name is converted to lower-case and is also
|
|
|
|
compared case sensitively. These subsection names follow the same
|
|
|
|
restrictions as section names.
|
2007-01-22 23:25:47 +08:00
|
|
|
|
2009-07-25 08:28:50 +08:00
|
|
|
All the other lines (and the remainder of the line after the section
|
|
|
|
header) are recognized as setting variables, in the form
|
2015-03-05 03:08:34 +08:00
|
|
|
'name = value' (or just 'name', which is a short-hand to say that
|
|
|
|
the variable is the boolean "true").
|
2012-03-01 18:59:45 +08:00
|
|
|
The variable names are case-insensitive, allow only alphanumeric characters
|
2015-03-05 02:26:17 +08:00
|
|
|
and `-`, and must start with an alphabetic character.
|
2007-01-22 23:25:47 +08:00
|
|
|
|
2015-03-05 02:33:38 +08:00
|
|
|
A line that defines a value can be continued to the next line by
|
|
|
|
ending it with a `\`; the backquote and the end-of-line are
|
|
|
|
stripped. Leading whitespaces after 'name =', the remainder of the
|
|
|
|
line after the first comment character '#' or ';', and trailing
|
|
|
|
whitespaces of the line are discarded unless they are enclosed in
|
|
|
|
double quotes. Internal whitespaces within the value are retained
|
|
|
|
verbatim.
|
2007-01-22 23:25:47 +08:00
|
|
|
|
2015-03-05 02:33:38 +08:00
|
|
|
Inside double quotes, double quote `"` and backslash `\` characters
|
|
|
|
must be escaped: use `\"` for `"` and `\\` for `\`.
|
2007-01-22 23:25:47 +08:00
|
|
|
|
2009-03-15 19:30:52 +08:00
|
|
|
The following escape sequences (beside `\"` and `\\`) are recognized:
|
|
|
|
`\n` for newline character (NL), `\t` for horizontal tabulation (HT, TAB)
|
2014-04-01 06:11:44 +08:00
|
|
|
and `\b` for backspace (BS). Other char escape sequences (including octal
|
|
|
|
escape sequences) are invalid.
|
2007-01-22 23:25:47 +08:00
|
|
|
|
2006-04-25 06:59:33 +08:00
|
|
|
|
config: add include directive
It can be useful to split your ~/.gitconfig across multiple
files. For example, you might have a "main" file which is
used on many machines, but a small set of per-machine
tweaks. Or you may want to make some of your config public
(e.g., clever aliases) while keeping other data back (e.g.,
your name or other identifying information). Or you may want
to include a number of config options in some subset of your
repos without copying and pasting (e.g., you want to
reference them from the .git/config of participating repos).
This patch introduces an include directive for config files.
It looks like:
[include]
path = /path/to/file
This is syntactically backwards-compatible with existing git
config parsers (i.e., they will see it as another config
entry and ignore it unless you are looking up include.path).
The implementation provides a "git_config_include" callback
which wraps regular config callbacks. Callers can pass it to
git_config_from_file, and it will transparently follow any
include directives, passing all of the discovered options to
the real callback.
Include directives are turned on automatically for "regular"
git config parsing. This includes calls to git_config, as
well as calls to the "git config" program that do not
specify a single file (e.g., using "-f", "--global", etc).
They are not turned on in other cases, including:
1. Parsing of other config-like files, like .gitmodules.
There isn't a real need, and I'd rather be conservative
and avoid unnecessary incompatibility or confusion.
2. Reading single files via "git config". This is for two
reasons:
a. backwards compatibility with scripts looking at
config-like files.
b. inspection of a specific file probably means you
care about just what's in that file, not a general
lookup for "do we have this value anywhere at
all". If that is not the case, the caller can
always specify "--includes".
3. Writing files via "git config"; we want to treat
include.* variables as literal items to be copied (or
modified), and not expand them. So "git config
--unset-all foo.bar" would operate _only_ on
.git/config, not any of its included files (just as it
also does not operate on ~/.gitconfig).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-02-06 17:54:04 +08:00
|
|
|
Includes
|
|
|
|
~~~~~~~~
|
|
|
|
|
2017-05-11 17:10:47 +08:00
|
|
|
The `include` and `includeIf` sections allow you to include config
|
|
|
|
directives from another source. These sections behave identically to
|
|
|
|
each other with the exception that `includeIf` sections may be ignored
|
|
|
|
if their condition does not evaluate to true; see "Conditional includes"
|
|
|
|
below.
|
|
|
|
|
2017-03-01 19:26:29 +08:00
|
|
|
You can include a config file from another by setting the special
|
2017-05-11 17:10:47 +08:00
|
|
|
`include.path` (or `includeIf.*.path`) variable to the name of the file
|
|
|
|
to be included. The variable takes a pathname as its value, and is
|
|
|
|
subject to tilde expansion. These variables can be given multiple times.
|
2016-04-30 01:43:55 +08:00
|
|
|
|
2017-05-11 17:13:04 +08:00
|
|
|
The contents of the included file are inserted immediately, as if they
|
|
|
|
had been found at the location of the include directive. If the value of the
|
2017-05-11 17:10:47 +08:00
|
|
|
variable is a relative path, the path is considered to
|
2017-03-01 19:26:30 +08:00
|
|
|
be relative to the configuration file in which the include directive
|
|
|
|
was found. See below for examples.
|
2016-04-30 01:43:55 +08:00
|
|
|
|
config: add conditional include
Sometimes a set of repositories want to share configuration settings
among themselves that are distinct from other such sets of repositories.
A user may work on two projects, each of which have multiple
repositories, and use one user.email for one project while using another
for the other.
Setting $GIT_DIR/.config works, but if the penalty of forgetting to
update $GIT_DIR/.config is high (especially when you end up cloning
often), it may not be the best way to go. Having the settings in
~/.gitconfig, which would work for just one set of repositories, would
not well in such a situation. Having separate ${HOME}s may add more
problems than it solves.
Extend the include.path mechanism that lets a config file include
another config file, so that the inclusion can be done only when some
conditions hold. Then ~/.gitconfig can say "include config-project-A
only when working on project-A" for each project A the user works on.
In this patch, the only supported grouping is based on $GIT_DIR (in
absolute path), so you would need to group repositories by directory, or
something like that to take advantage of it.
We already have include.path for unconditional includes. This patch goes
with includeIf.<condition>.path to make it clearer that a condition is
required. The new config has the same backward compatibility approach as
include.path: older git versions that don't understand includeIf will
simply ignore them.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-03-01 19:26:31 +08:00
|
|
|
Conditional includes
|
|
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
You can include a config file from another conditionally by setting a
|
|
|
|
`includeIf.<condition>.path` variable to the name of the file to be
|
2017-05-11 17:10:47 +08:00
|
|
|
included.
|
config: add conditional include
Sometimes a set of repositories want to share configuration settings
among themselves that are distinct from other such sets of repositories.
A user may work on two projects, each of which have multiple
repositories, and use one user.email for one project while using another
for the other.
Setting $GIT_DIR/.config works, but if the penalty of forgetting to
update $GIT_DIR/.config is high (especially when you end up cloning
often), it may not be the best way to go. Having the settings in
~/.gitconfig, which would work for just one set of repositories, would
not well in such a situation. Having separate ${HOME}s may add more
problems than it solves.
Extend the include.path mechanism that lets a config file include
another config file, so that the inclusion can be done only when some
conditions hold. Then ~/.gitconfig can say "include config-project-A
only when working on project-A" for each project A the user works on.
In this patch, the only supported grouping is based on $GIT_DIR (in
absolute path), so you would need to group repositories by directory, or
something like that to take advantage of it.
We already have include.path for unconditional includes. This patch goes
with includeIf.<condition>.path to make it clearer that a condition is
required. The new config has the same backward compatibility approach as
include.path: older git versions that don't understand includeIf will
simply ignore them.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-03-01 19:26:31 +08:00
|
|
|
|
|
|
|
The condition starts with a keyword followed by a colon and some data
|
|
|
|
whose format and meaning depends on the keyword. Supported keywords
|
|
|
|
are:
|
|
|
|
|
|
|
|
`gitdir`::
|
|
|
|
|
|
|
|
The data that follows the keyword `gitdir:` is used as a glob
|
|
|
|
pattern. If the location of the .git directory matches the
|
|
|
|
pattern, the include condition is met.
|
|
|
|
+
|
|
|
|
The .git location may be auto-discovered, or come from `$GIT_DIR`
|
|
|
|
environment variable. If the repository is auto discovered via a .git
|
|
|
|
file (e.g. from submodules, or a linked worktree), the .git location
|
|
|
|
would be the final location where the .git directory is, not where the
|
|
|
|
.git file is.
|
|
|
|
+
|
|
|
|
The pattern can contain standard globbing wildcards and two additional
|
|
|
|
ones, `**/` and `/**`, that can match multiple path components. Please
|
|
|
|
refer to linkgit:gitignore[5] for details. For convenience:
|
|
|
|
|
|
|
|
* If the pattern starts with `~/`, `~` will be substituted with the
|
|
|
|
content of the environment variable `HOME`.
|
|
|
|
|
|
|
|
* If the pattern starts with `./`, it is replaced with the directory
|
|
|
|
containing the current config file.
|
|
|
|
|
|
|
|
* If the pattern does not start with either `~/`, `./` or `/`, `**/`
|
|
|
|
will be automatically prepended. For example, the pattern `foo/bar`
|
|
|
|
becomes `**/foo/bar` and would match `/any/path/to/foo/bar`.
|
|
|
|
|
|
|
|
* If the pattern ends with `/`, `**` will be automatically added. For
|
|
|
|
example, the pattern `foo/` becomes `foo/**`. In other words, it
|
|
|
|
matches "foo" and everything inside, recursively.
|
|
|
|
|
|
|
|
`gitdir/i`::
|
|
|
|
This is the same as `gitdir` except that matching is done
|
|
|
|
case-insensitively (e.g. on case-insensitive file sytems)
|
|
|
|
|
|
|
|
A few more notes on matching via `gitdir` and `gitdir/i`:
|
|
|
|
|
|
|
|
* Symlinks in `$GIT_DIR` are not resolved before matching.
|
|
|
|
|
2017-05-16 16:28:46 +08:00
|
|
|
* Both the symlink & realpath versions of paths will be matched
|
|
|
|
outside of `$GIT_DIR`. E.g. if ~/git is a symlink to
|
|
|
|
/mnt/storage/git, both `gitdir:~/git` and `gitdir:/mnt/storage/git`
|
|
|
|
will match.
|
|
|
|
+
|
|
|
|
This was not the case in the initial release of this feature in
|
|
|
|
v2.13.0, which only matched the realpath version. Configuration that
|
|
|
|
wants to be compatible with the initial release of this feature needs
|
|
|
|
to either specify only the realpath version, or both versions.
|
|
|
|
|
config: add conditional include
Sometimes a set of repositories want to share configuration settings
among themselves that are distinct from other such sets of repositories.
A user may work on two projects, each of which have multiple
repositories, and use one user.email for one project while using another
for the other.
Setting $GIT_DIR/.config works, but if the penalty of forgetting to
update $GIT_DIR/.config is high (especially when you end up cloning
often), it may not be the best way to go. Having the settings in
~/.gitconfig, which would work for just one set of repositories, would
not well in such a situation. Having separate ${HOME}s may add more
problems than it solves.
Extend the include.path mechanism that lets a config file include
another config file, so that the inclusion can be done only when some
conditions hold. Then ~/.gitconfig can say "include config-project-A
only when working on project-A" for each project A the user works on.
In this patch, the only supported grouping is based on $GIT_DIR (in
absolute path), so you would need to group repositories by directory, or
something like that to take advantage of it.
We already have include.path for unconditional includes. This patch goes
with includeIf.<condition>.path to make it clearer that a condition is
required. The new config has the same backward compatibility approach as
include.path: older git versions that don't understand includeIf will
simply ignore them.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-03-01 19:26:31 +08:00
|
|
|
* Note that "../" is not special and will match literally, which is
|
|
|
|
unlikely what you want.
|
config: add include directive
It can be useful to split your ~/.gitconfig across multiple
files. For example, you might have a "main" file which is
used on many machines, but a small set of per-machine
tweaks. Or you may want to make some of your config public
(e.g., clever aliases) while keeping other data back (e.g.,
your name or other identifying information). Or you may want
to include a number of config options in some subset of your
repos without copying and pasting (e.g., you want to
reference them from the .git/config of participating repos).
This patch introduces an include directive for config files.
It looks like:
[include]
path = /path/to/file
This is syntactically backwards-compatible with existing git
config parsers (i.e., they will see it as another config
entry and ignore it unless you are looking up include.path).
The implementation provides a "git_config_include" callback
which wraps regular config callbacks. Callers can pass it to
git_config_from_file, and it will transparently follow any
include directives, passing all of the discovered options to
the real callback.
Include directives are turned on automatically for "regular"
git config parsing. This includes calls to git_config, as
well as calls to the "git config" program that do not
specify a single file (e.g., using "-f", "--global", etc).
They are not turned on in other cases, including:
1. Parsing of other config-like files, like .gitmodules.
There isn't a real need, and I'd rather be conservative
and avoid unnecessary incompatibility or confusion.
2. Reading single files via "git config". This is for two
reasons:
a. backwards compatibility with scripts looking at
config-like files.
b. inspection of a specific file probably means you
care about just what's in that file, not a general
lookup for "do we have this value anywhere at
all". If that is not the case, the caller can
always specify "--includes".
3. Writing files via "git config"; we want to treat
include.* variables as literal items to be copied (or
modified), and not expand them. So "git config
--unset-all foo.bar" would operate _only_ on
.git/config, not any of its included files (just as it
also does not operate on ~/.gitconfig).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-02-06 17:54:04 +08:00
|
|
|
|
2006-04-25 06:59:33 +08:00
|
|
|
Example
|
|
|
|
~~~~~~~
|
|
|
|
|
|
|
|
# Core variables
|
|
|
|
[core]
|
|
|
|
; Don't trust file modes
|
|
|
|
filemode = false
|
|
|
|
|
|
|
|
# Our diff algorithm
|
|
|
|
[diff]
|
2008-07-27 19:12:15 +08:00
|
|
|
external = /usr/local/bin/diff-wrapper
|
2006-04-25 06:59:33 +08:00
|
|
|
renames = true
|
|
|
|
|
2006-12-07 14:36:55 +08:00
|
|
|
[branch "devel"]
|
|
|
|
remote = origin
|
|
|
|
merge = refs/heads/devel
|
|
|
|
|
2007-01-22 23:25:47 +08:00
|
|
|
# Proxy settings
|
|
|
|
[core]
|
2007-08-03 06:45:56 +08:00
|
|
|
gitProxy="ssh" for "kernel.org"
|
2007-01-22 23:25:47 +08:00
|
|
|
gitProxy=default-proxy ; for the rest
|
2006-12-07 14:36:55 +08:00
|
|
|
|
config: add include directive
It can be useful to split your ~/.gitconfig across multiple
files. For example, you might have a "main" file which is
used on many machines, but a small set of per-machine
tweaks. Or you may want to make some of your config public
(e.g., clever aliases) while keeping other data back (e.g.,
your name or other identifying information). Or you may want
to include a number of config options in some subset of your
repos without copying and pasting (e.g., you want to
reference them from the .git/config of participating repos).
This patch introduces an include directive for config files.
It looks like:
[include]
path = /path/to/file
This is syntactically backwards-compatible with existing git
config parsers (i.e., they will see it as another config
entry and ignore it unless you are looking up include.path).
The implementation provides a "git_config_include" callback
which wraps regular config callbacks. Callers can pass it to
git_config_from_file, and it will transparently follow any
include directives, passing all of the discovered options to
the real callback.
Include directives are turned on automatically for "regular"
git config parsing. This includes calls to git_config, as
well as calls to the "git config" program that do not
specify a single file (e.g., using "-f", "--global", etc).
They are not turned on in other cases, including:
1. Parsing of other config-like files, like .gitmodules.
There isn't a real need, and I'd rather be conservative
and avoid unnecessary incompatibility or confusion.
2. Reading single files via "git config". This is for two
reasons:
a. backwards compatibility with scripts looking at
config-like files.
b. inspection of a specific file probably means you
care about just what's in that file, not a general
lookup for "do we have this value anywhere at
all". If that is not the case, the caller can
always specify "--includes".
3. Writing files via "git config"; we want to treat
include.* variables as literal items to be copied (or
modified), and not expand them. So "git config
--unset-all foo.bar" would operate _only_ on
.git/config, not any of its included files (just as it
also does not operate on ~/.gitconfig).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-02-06 17:54:04 +08:00
|
|
|
[include]
|
|
|
|
path = /path/to/foo.inc ; include by absolute path
|
2017-05-11 17:14:30 +08:00
|
|
|
path = foo.inc ; find "foo.inc" relative to the current file
|
|
|
|
path = ~/foo.inc ; find "foo.inc" in your `$HOME` directory
|
config: add include directive
It can be useful to split your ~/.gitconfig across multiple
files. For example, you might have a "main" file which is
used on many machines, but a small set of per-machine
tweaks. Or you may want to make some of your config public
(e.g., clever aliases) while keeping other data back (e.g.,
your name or other identifying information). Or you may want
to include a number of config options in some subset of your
repos without copying and pasting (e.g., you want to
reference them from the .git/config of participating repos).
This patch introduces an include directive for config files.
It looks like:
[include]
path = /path/to/file
This is syntactically backwards-compatible with existing git
config parsers (i.e., they will see it as another config
entry and ignore it unless you are looking up include.path).
The implementation provides a "git_config_include" callback
which wraps regular config callbacks. Callers can pass it to
git_config_from_file, and it will transparently follow any
include directives, passing all of the discovered options to
the real callback.
Include directives are turned on automatically for "regular"
git config parsing. This includes calls to git_config, as
well as calls to the "git config" program that do not
specify a single file (e.g., using "-f", "--global", etc).
They are not turned on in other cases, including:
1. Parsing of other config-like files, like .gitmodules.
There isn't a real need, and I'd rather be conservative
and avoid unnecessary incompatibility or confusion.
2. Reading single files via "git config". This is for two
reasons:
a. backwards compatibility with scripts looking at
config-like files.
b. inspection of a specific file probably means you
care about just what's in that file, not a general
lookup for "do we have this value anywhere at
all". If that is not the case, the caller can
always specify "--includes".
3. Writing files via "git config"; we want to treat
include.* variables as literal items to be copied (or
modified), and not expand them. So "git config
--unset-all foo.bar" would operate _only_ on
.git/config, not any of its included files (just as it
also does not operate on ~/.gitconfig).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-02-06 17:54:04 +08:00
|
|
|
|
config: add conditional include
Sometimes a set of repositories want to share configuration settings
among themselves that are distinct from other such sets of repositories.
A user may work on two projects, each of which have multiple
repositories, and use one user.email for one project while using another
for the other.
Setting $GIT_DIR/.config works, but if the penalty of forgetting to
update $GIT_DIR/.config is high (especially when you end up cloning
often), it may not be the best way to go. Having the settings in
~/.gitconfig, which would work for just one set of repositories, would
not well in such a situation. Having separate ${HOME}s may add more
problems than it solves.
Extend the include.path mechanism that lets a config file include
another config file, so that the inclusion can be done only when some
conditions hold. Then ~/.gitconfig can say "include config-project-A
only when working on project-A" for each project A the user works on.
In this patch, the only supported grouping is based on $GIT_DIR (in
absolute path), so you would need to group repositories by directory, or
something like that to take advantage of it.
We already have include.path for unconditional includes. This patch goes
with includeIf.<condition>.path to make it clearer that a condition is
required. The new config has the same backward compatibility approach as
include.path: older git versions that don't understand includeIf will
simply ignore them.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-03-01 19:26:31 +08:00
|
|
|
; include if $GIT_DIR is /path/to/foo/.git
|
|
|
|
[includeIf "gitdir:/path/to/foo/.git"]
|
|
|
|
path = /path/to/foo.inc
|
|
|
|
|
|
|
|
; include for all repositories inside /path/to/group
|
|
|
|
[includeIf "gitdir:/path/to/group/"]
|
|
|
|
path = /path/to/foo.inc
|
|
|
|
|
|
|
|
; include for all repositories inside $HOME/to/group
|
|
|
|
[includeIf "gitdir:~/to/group/"]
|
|
|
|
path = /path/to/foo.inc
|
2015-03-05 02:57:43 +08:00
|
|
|
|
2017-05-11 17:11:06 +08:00
|
|
|
; relative paths are always relative to the including
|
|
|
|
; file (if the condition is true); their location is not
|
|
|
|
; affected by the condition
|
|
|
|
[includeIf "gitdir:/path/to/group/"]
|
|
|
|
path = foo.inc
|
|
|
|
|
2015-03-05 02:57:43 +08:00
|
|
|
Values
|
|
|
|
~~~~~~
|
|
|
|
|
|
|
|
Values of many variables are treated as a simple string, but there
|
|
|
|
are variables that take values of specific types and there are rules
|
|
|
|
as to how to spell them.
|
|
|
|
|
|
|
|
boolean::
|
|
|
|
|
|
|
|
When a variable is said to take a boolean value, many
|
|
|
|
synonyms are accepted for 'true' and 'false'; these are all
|
|
|
|
case-insensitive.
|
|
|
|
|
2017-08-15 06:12:18 +08:00
|
|
|
true;; Boolean true literals are `yes`, `on`, `true`,
|
|
|
|
and `1`. Also, a variable defined without `= <value>`
|
2015-03-05 02:57:43 +08:00
|
|
|
is taken as true.
|
|
|
|
|
2017-08-15 06:12:18 +08:00
|
|
|
false;; Boolean false literals are `no`, `off`, `false`,
|
|
|
|
`0` and the empty string.
|
2015-03-05 02:57:43 +08:00
|
|
|
+
|
2018-09-20 00:38:18 +08:00
|
|
|
When converting a value to its canonical form using the `--type=bool` type
|
2017-08-15 06:12:18 +08:00
|
|
|
specifier, 'git config' will ensure that the output is "true" or
|
2015-03-05 02:57:43 +08:00
|
|
|
"false" (spelled in lowercase).
|
|
|
|
|
|
|
|
integer::
|
|
|
|
The value for many variables that specify various sizes can
|
|
|
|
be suffixed with `k`, `M`,... to mean "scale the number by
|
|
|
|
1024", "by 1024x1024", etc.
|
|
|
|
|
2015-03-04 15:07:13 +08:00
|
|
|
color::
|
2016-06-24 01:32:30 +08:00
|
|
|
The value for a variable that takes a color is a list of
|
|
|
|
colors (at most two, one for foreground and one for background)
|
|
|
|
and attributes (as many as you want), separated by spaces.
|
2015-03-21 04:50:51 +08:00
|
|
|
+
|
2016-06-24 01:32:30 +08:00
|
|
|
The basic colors accepted are `normal`, `black`, `red`, `green`, `yellow`,
|
|
|
|
`blue`, `magenta`, `cyan` and `white`. The first color given is the
|
|
|
|
foreground; the second is the background.
|
log --decorate: do not leak "commit" color into the next item
In "git log --decorate", you would see the commit header like this:
commit ... (HEAD, jc/decorate-leaky-separator-color)
where "commit ... (" is painted in color.diff.commit, "HEAD" in
color.decorate.head, ", " in color.diff.commit, the branch name in
color.decorate.branch and then closing ")" in color.diff.commit.
If you wanted to paint the HEAD and local branch name in the same
color as the body text (perhaps because cyan and green are too faint
on a black-on-white terminal to be readable), you would not want to
have to say
[color "decorate"]
head = black
branch = black
because that you would not be able to reuse same configuration on a
white-on-black terminal. You would naively expect
[color "decorate"]
head = normal
branch = normal
to work, but unfortunately it does not. It paints the string "HEAD"
and the branch name in the same color as the opening parenthesis or
comma between the decoration elements. This is because the code
forgets to reset the color after printing the "prefix" in its own
color.
It theoretically is possible that some people were expecting and
relying on that the attribute set as the "diff.commit" color, which
is used to draw these opening parenthesis and inter-item comma, is
inherited by the drawing of branch names, but it is not how the
coloring works everywhere else.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-03-05 03:07:12 +08:00
|
|
|
+
|
2016-06-24 01:32:30 +08:00
|
|
|
Colors may also be given as numbers between 0 and 255; these use ANSI
|
|
|
|
256-color mode (but note that not all terminals may support this). If
|
|
|
|
your terminal supports it, you may also specify 24-bit RGB values as
|
|
|
|
hex, like `#ff0ab3`.
|
|
|
|
+
|
2016-06-24 01:40:16 +08:00
|
|
|
The accepted attributes are `bold`, `dim`, `ul`, `blink`, `reverse`,
|
|
|
|
`italic`, and `strike` (for crossed-out or "strikethrough" letters).
|
|
|
|
The position of any attributes with respect to the colors
|
2016-06-24 01:39:07 +08:00
|
|
|
(before, after, or in between), doesn't matter. Specific attributes may
|
|
|
|
be turned off by prefixing them with `no` or `no-` (e.g., `noreverse`,
|
|
|
|
`no-ul`, etc).
|
2016-06-24 01:32:30 +08:00
|
|
|
+
|
2017-02-02 20:42:44 +08:00
|
|
|
An empty color string produces no color effect at all. This can be used
|
|
|
|
to avoid coloring specific elements without disabling color entirely.
|
|
|
|
+
|
2016-06-24 01:32:30 +08:00
|
|
|
For git's pre-defined color slots, the attributes are meant to be reset
|
|
|
|
at the beginning of each item in the colored output. So setting
|
|
|
|
`color.decorate.branch` to `black` will paint that branch name in a
|
|
|
|
plain `black`, even if the previous thing on the same output line (e.g.
|
|
|
|
opening parenthesis before the list of branch names in `log --decorate`
|
|
|
|
output) is set to be painted with `bold` or some other attribute.
|
|
|
|
However, custom log formats may do more complicated and layered
|
|
|
|
coloring, and the negated forms may be useful there.
|
2015-03-04 15:07:13 +08:00
|
|
|
|
2016-04-30 01:43:55 +08:00
|
|
|
pathname::
|
|
|
|
A variable that takes a pathname value can be given a
|
|
|
|
string that begins with "`~/`" or "`~user/`", and the usual
|
|
|
|
tilde expansion happens to such a string: `~/`
|
|
|
|
is expanded to the value of `$HOME`, and `~user/` to the
|
|
|
|
specified user's home directory.
|
|
|
|
|
2015-03-05 02:57:43 +08:00
|
|
|
|
2006-04-25 06:59:33 +08:00
|
|
|
Variables
|
|
|
|
~~~~~~~~~
|
|
|
|
|
|
|
|
Note that this list is non-comprehensive and not necessarily complete.
|
2006-06-08 07:15:05 +08:00
|
|
|
For command-specific variables, you will find a more detailed description
|
2014-03-21 12:07:08 +08:00
|
|
|
in the appropriate manual page.
|
|
|
|
|
|
|
|
Other git-related tools may and do use their own variables. When
|
|
|
|
inventing new variables for use in your own tool, make sure their
|
|
|
|
names do not conflict with those that are used by Git itself and
|
|
|
|
other popular tools, and describe them in your documentation.
|
|
|
|
|
2018-10-27 14:22:35 +08:00
|
|
|
include::config/advice.txt[]
|
2009-09-09 19:38:58 +08:00
|
|
|
|
2018-10-27 14:22:36 +08:00
|
|
|
include::config/core.txt[]
|
2010-10-29 02:28:04 +08:00
|
|
|
|
2018-10-27 14:22:37 +08:00
|
|
|
include::config/add.txt[]
|
2009-05-31 13:08:02 +08:00
|
|
|
|
2018-10-27 14:22:38 +08:00
|
|
|
include::config/alias.txt[]
|
2007-02-11 08:33:58 +08:00
|
|
|
|
2018-10-27 14:22:39 +08:00
|
|
|
include::config/am.txt[]
|
2015-08-04 22:19:26 +08:00
|
|
|
|
2018-10-27 14:22:40 +08:00
|
|
|
include::config/apply.txt[]
|
2006-04-25 06:59:33 +08:00
|
|
|
|
2018-10-27 14:22:41 +08:00
|
|
|
include::config/blame.txt[]
|
2018-08-04 14:25:00 +08:00
|
|
|
|
2018-10-27 14:22:42 +08:00
|
|
|
include::config/branch.txt[]
|
2013-01-01 17:30:53 +08:00
|
|
|
|
2018-10-27 14:22:43 +08:00
|
|
|
include::config/browser.txt[]
|
2008-01-29 14:08:22 +08:00
|
|
|
|
2018-10-27 14:22:44 +08:00
|
|
|
include::config/checkout.txt[]
|
2018-08-17 02:27:11 +08:00
|
|
|
|
2018-10-27 14:22:45 +08:00
|
|
|
include::config/clean.txt[]
|
2007-04-24 08:18:16 +08:00
|
|
|
|
2018-10-27 14:22:46 +08:00
|
|
|
include::config/color.txt[]
|
2008-02-18 15:26:03 +08:00
|
|
|
|
2018-10-27 14:22:47 +08:00
|
|
|
include::config/column.txt[]
|
2012-04-13 18:54:41 +08:00
|
|
|
|
2018-10-27 14:22:48 +08:00
|
|
|
include::config/commit.txt[]
|
2016-05-05 17:50:02 +08:00
|
|
|
|
2018-10-27 14:22:49 +08:00
|
|
|
include::config/credential.txt[]
|
2015-11-10 08:26:29 +08:00
|
|
|
|
2018-10-27 14:22:50 +08:00
|
|
|
include::config/completion.txt[]
|
2018-05-21 02:40:09 +08:00
|
|
|
|
2018-10-27 14:22:51 +08:00
|
|
|
include::config/diff.txt[]
|
2009-04-07 16:21:20 +08:00
|
|
|
|
2018-10-27 14:22:52 +08:00
|
|
|
include::config/difftool.txt[]
|
2009-04-07 16:21:22 +08:00
|
|
|
|
2018-10-27 14:22:53 +08:00
|
|
|
include::config/fastimport.txt[]
|
2016-04-26 05:17:28 +08:00
|
|
|
|
2018-10-27 14:22:54 +08:00
|
|
|
include::config/fetch.txt[]
|
2018-07-17 02:44:01 +08:00
|
|
|
|
2018-10-27 14:22:56 +08:00
|
|
|
include::config/format.txt[]
|
2016-04-26 15:51:24 +08:00
|
|
|
|
2018-10-27 14:22:55 +08:00
|
|
|
include::config/filter.txt[]
|
2011-04-07 02:46:48 +08:00
|
|
|
|
2018-10-27 14:22:58 +08:00
|
|
|
include::config/fsck.txt[]
|
2015-06-22 23:27:23 +08:00
|
|
|
|
2018-10-27 14:22:59 +08:00
|
|
|
include::config/gc.txt[]
|
2006-12-27 17:24:05 +08:00
|
|
|
|
2018-10-27 14:23:00 +08:00
|
|
|
include::config/gitcvs.txt[]
|
2007-04-14 00:13:42 +08:00
|
|
|
|
2018-10-27 14:23:01 +08:00
|
|
|
include::config/gitweb.txt[]
|
2011-10-16 19:07:34 +08:00
|
|
|
|
2018-10-27 14:23:02 +08:00
|
|
|
include::config/grep.txt[]
|
2016-01-12 18:40:26 +08:00
|
|
|
|
2018-10-27 14:23:03 +08:00
|
|
|
include::config/gpg.txt[]
|
2018-07-17 20:50:11 +08:00
|
|
|
|
2018-10-27 14:23:04 +08:00
|
|
|
include::config/gui.txt[]
|
2008-11-14 01:28:49 +08:00
|
|
|
|
2018-10-27 14:23:05 +08:00
|
|
|
include::config/guitool.txt[]
|
2008-12-15 03:44:32 +08:00
|
|
|
|
2018-10-27 14:23:06 +08:00
|
|
|
include::config/help.txt[]
|
2013-01-16 04:56:21 +08:00
|
|
|
|
2018-10-27 14:23:08 +08:00
|
|
|
include::config/http.txt[]
|
2013-08-06 04:20:36 +08:00
|
|
|
|
2018-10-27 14:23:09 +08:00
|
|
|
include::config/i18n.txt[]
|
2006-12-28 08:41:33 +08:00
|
|
|
|
2018-10-27 14:23:10 +08:00
|
|
|
include::config/imap.txt[]
|
2008-11-26 16:26:50 +08:00
|
|
|
|
2018-10-27 14:23:11 +08:00
|
|
|
include::config/index.txt[]
|
2014-02-24 04:49:59 +08:00
|
|
|
|
2018-10-27 14:23:12 +08:00
|
|
|
include::config/init.txt[]
|
2010-02-17 07:44:46 +08:00
|
|
|
|
2018-10-27 14:23:13 +08:00
|
|
|
include::config/instaweb.txt[]
|
2008-01-08 11:55:14 +08:00
|
|
|
|
2018-10-27 14:23:14 +08:00
|
|
|
include::config/interactive.txt[]
|
2016-02-27 13:37:06 +08:00
|
|
|
|
2018-10-27 14:23:15 +08:00
|
|
|
include::config/log.txt[]
|
2013-01-06 05:26:46 +08:00
|
|
|
|
2018-10-27 14:23:16 +08:00
|
|
|
include::config/mailinfo.txt[]
|
2015-02-21 03:32:20 +08:00
|
|
|
|
2018-10-27 14:23:17 +08:00
|
|
|
include::config/mailmap.txt[]
|
2012-12-12 19:04:04 +08:00
|
|
|
|
2018-10-27 14:23:18 +08:00
|
|
|
include::config/man.txt[]
|
2008-04-25 14:24:41 +08:00
|
|
|
|
2018-10-27 14:23:19 +08:00
|
|
|
include::config/merge.txt[]
|
2008-08-30 01:49:56 +08:00
|
|
|
|
2018-10-27 14:23:20 +08:00
|
|
|
include::config/mergetool.txt[]
|
2008-11-13 20:41:14 +08:00
|
|
|
|
2018-10-27 14:23:21 +08:00
|
|
|
include::config/notes.txt[]
|
2010-03-13 01:04:32 +08:00
|
|
|
|
2018-10-27 14:23:22 +08:00
|
|
|
include::config/pack.txt[]
|
pack-bitmap: implement optional name_hash cache
When we use pack bitmaps rather than walking the object
graph, we end up with the list of objects to include in the
packfile, but we do not know the path at which any tree or
blob objects would be found.
In a recently packed repository, this is fine. A fetch would
use the paths only as a heuristic in the delta compression
phase, and a fully packed repository should not need to do
much delta compression.
As time passes, though, we may acquire more objects on top
of our large bitmapped pack. If clients fetch frequently,
then they never even look at the bitmapped history, and all
works as usual. However, a client who has not fetched since
the last bitmap repack will have "have" tips in the
bitmapped history, but "want" newer objects.
The bitmaps themselves degrade gracefully in this
circumstance. We manually walk the more recent bits of
history, and then use bitmaps when we hit them.
But we would also like to perform delta compression between
the newer objects and the bitmapped objects (both to delta
against what we know the user already has, but also between
"new" and "old" objects that the user is fetching). The lack
of pathnames makes our delta heuristics much less effective.
This patch adds an optional cache of the 32-bit name_hash
values to the end of the bitmap file. If present, a reader
can use it to match bitmapped and non-bitmapped names during
delta compression.
Here are perf results for p5310:
Test origin/master HEAD^ HEAD
-------------------------------------------------------------------------------------------------
5310.2: repack to disk 36.81(37.82+1.43) 47.70(48.74+1.41) +29.6% 47.75(48.70+1.51) +29.7%
5310.3: simulated clone 30.78(29.70+2.14) 1.08(0.97+0.10) -96.5% 1.07(0.94+0.12) -96.5%
5310.4: simulated fetch 3.16(6.10+0.08) 3.54(10.65+0.06) +12.0% 1.70(3.07+0.06) -46.2%
5310.6: partial bitmap 36.76(43.19+1.81) 6.71(11.25+0.76) -81.7% 4.08(6.26+0.46) -88.9%
You can see that the time spent on an incremental fetch goes
down, as our delta heuristics are able to do their work.
And we save time on the partial bitmap clone for the same
reason.
Signed-off-by: Vicent Marti <tanoku@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-12-21 22:00:45 +08:00
|
|
|
|
2018-10-27 14:23:23 +08:00
|
|
|
include::config/pager.txt[]
|
2008-08-16 10:14:33 +08:00
|
|
|
|
2018-10-27 14:23:24 +08:00
|
|
|
include::config/pretty.txt[]
|
2010-05-02 19:00:44 +08:00
|
|
|
|
2018-10-27 14:23:25 +08:00
|
|
|
include::config/protocol.txt[]
|
2017-10-17 01:55:24 +08:00
|
|
|
|
2018-10-27 14:23:26 +08:00
|
|
|
include::config/pull.txt[]
|
2017-10-23 19:44:49 +08:00
|
|
|
|
2018-10-27 14:23:27 +08:00
|
|
|
include::config/push.txt[]
|
2015-11-17 19:05:56 +08:00
|
|
|
|
2018-10-27 14:23:28 +08:00
|
|
|
include::config/rebase.txt[]
|
2015-06-14 00:26:58 +08:00
|
|
|
|
2018-10-27 14:23:29 +08:00
|
|
|
include::config/receive.txt[]
|
2013-12-05 21:02:47 +08:00
|
|
|
|
2018-10-27 14:23:30 +08:00
|
|
|
include::config/remote.txt[]
|
2013-07-13 17:36:24 +08:00
|
|
|
|
2018-10-27 14:23:31 +08:00
|
|
|
include::config/remotes.txt[]
|
2007-02-21 04:13:43 +08:00
|
|
|
|
2018-10-27 14:23:32 +08:00
|
|
|
include::config/repack.txt[]
|
repack: add `repack.packKeptObjects` config var
The git-repack command always passes `--honor-pack-keep`
to pack-objects. This has traditionally been a good thing,
as we do not want to duplicate those objects in a new pack,
and we are not going to delete the old pack.
However, when bitmaps are in use, it is important for a full
repack to include all reachable objects, even if they may be
duplicated in a .keep pack. Otherwise, we cannot generate
the bitmaps, as the on-disk format requires the set of
objects in the pack to be fully closed.
Even if the repository does not generally have .keep files,
a simultaneous push could cause a race condition in which a
.keep file exists at the moment of a repack. The repack may
try to include those objects in one of two situations:
1. The pushed .keep pack contains objects that were
already in the repository (e.g., blobs due to a revert of
an old commit).
2. Receive-pack updates the refs, making the objects
reachable, but before it removes the .keep file, the
repack runs.
In either case, we may prefer to duplicate some objects in
the new, full pack, and let the next repack (after the .keep
file is cleaned up) take care of removing them.
This patch introduces both a command-line and config option
to disable the `--honor-pack-keep` option. By default, it
is triggered when pack.writeBitmaps (or `--write-bitmap-index`
is turned on), but specifying it explicitly can override the
behavior (e.g., in cases where you prefer .keep files to
bitmaps, but only when they are present).
Note that this option just disables the pack-objects
behavior. We still leave packs with a .keep in place, as we
do not necessarily know that we have duplicated all of their
objects.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-03-04 04:04:20 +08:00
|
|
|
|
2018-10-27 14:23:33 +08:00
|
|
|
include::config/rerere.txt[]
|
2008-11-26 16:26:50 +08:00
|
|
|
|
2018-10-27 14:23:34 +08:00
|
|
|
include::config/reset.txt[]
|
2018-10-24 03:04:22 +08:00
|
|
|
|
2018-10-27 14:23:35 +08:00
|
|
|
include::config/sendemail.txt[]
|
2017-05-21 20:59:50 +08:00
|
|
|
|
2018-10-27 14:23:36 +08:00
|
|
|
include::config/sequencer.txt[]
|
2018-08-23 00:06:04 +08:00
|
|
|
|
2018-10-27 14:23:37 +08:00
|
|
|
include::config/showbranch.txt[]
|
2006-04-25 06:59:33 +08:00
|
|
|
|
2018-10-27 14:23:38 +08:00
|
|
|
include::config/splitindex.txt[]
|
2017-03-06 17:42:02 +08:00
|
|
|
|
2018-10-27 14:23:07 +08:00
|
|
|
include::config/ssh.txt[]
|
|
|
|
|
2007-12-08 05:26:07 +08:00
|
|
|
status.relativePaths::
|
2007-12-29 14:20:38 +08:00
|
|
|
By default, linkgit:git-status[1] shows paths relative to the
|
2007-12-08 05:26:07 +08:00
|
|
|
current directory. Setting this variable to `false` shows paths
|
2013-01-22 03:17:53 +08:00
|
|
|
relative to the repository root (this was the default for Git
|
2007-12-08 05:26:07 +08:00
|
|
|
prior to v1.5.4).
|
|
|
|
|
2013-06-11 21:34:04 +08:00
|
|
|
status.short::
|
|
|
|
Set to true to enable --short by default in linkgit:git-status[1].
|
|
|
|
The option --no-short takes precedence over this variable.
|
|
|
|
|
2013-06-11 21:34:05 +08:00
|
|
|
status.branch::
|
|
|
|
Set to true to enable --branch by default in linkgit:git-status[1].
|
|
|
|
The option --no-branch takes precedence over this variable.
|
|
|
|
|
2013-09-07 01:43:07 +08:00
|
|
|
status.displayCommentPrefix::
|
|
|
|
If set to true, linkgit:git-status[1] will insert a comment
|
|
|
|
prefix before each output line (starting with
|
|
|
|
`core.commentChar`, i.e. `#` by default). This was the
|
|
|
|
behavior of linkgit:git-status[1] in Git 1.8.4 and previous.
|
|
|
|
Defaults to false.
|
|
|
|
|
2018-05-11 23:38:58 +08:00
|
|
|
status.renameLimit::
|
|
|
|
The number of files to consider when performing rename detection
|
|
|
|
in linkgit:git-status[1] and linkgit:git-commit[1]. Defaults to
|
|
|
|
the value of diff.renameLimit.
|
|
|
|
|
|
|
|
status.renames::
|
|
|
|
Whether and how Git detects renames in linkgit:git-status[1] and
|
|
|
|
linkgit:git-commit[1] . If set to "false", rename detection is
|
|
|
|
disabled. If set to "true", basic rename detection is enabled.
|
|
|
|
If set to "copies" or "copy", Git will detect copies, as well.
|
|
|
|
Defaults to the value of diff.renames.
|
|
|
|
|
2017-06-18 06:30:51 +08:00
|
|
|
status.showStash::
|
|
|
|
If set to true, linkgit:git-status[1] will display the number of
|
|
|
|
entries currently stashed away.
|
|
|
|
Defaults to false.
|
|
|
|
|
2008-06-05 20:47:50 +08:00
|
|
|
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
|
2014-11-10 00:19:33 +08:00
|
|
|
the files in the whole repository, which might be slow on some
|
2008-06-05 20:47:50 +08:00
|
|
|
systems. So, this variable controls how the commands displays
|
|
|
|
the untracked files. Possible values are:
|
|
|
|
+
|
|
|
|
--
|
2010-10-18 11:10:45 +08:00
|
|
|
* `no` - Show no untracked files.
|
|
|
|
* `normal` - Show untracked files and directories.
|
|
|
|
* `all` - Show also individual files in untracked directories.
|
2008-06-05 20:47:50 +08:00
|
|
|
--
|
|
|
|
+
|
|
|
|
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].
|
|
|
|
|
2015-03-12 04:32:45 +08:00
|
|
|
status.submoduleSummary::
|
2010-05-20 23:55:42 +08:00
|
|
|
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
|
2013-09-12 03:07:15 +08:00
|
|
|
--summary-limit option of linkgit:git-submodule[1]). Please note
|
|
|
|
that the summary output command will be suppressed for all
|
|
|
|
submodules when `diff.ignoreSubmodules` is set to 'all' or only
|
2014-04-06 00:59:03 +08:00
|
|
|
for those submodules where `submodule.<name>.ignore=all`. The only
|
|
|
|
exception to that rule is that status and commit will show staged
|
|
|
|
submodule changes. To
|
2013-09-12 03:07:15 +08:00
|
|
|
also view the summary for ignored submodules you can either use
|
2014-05-22 02:52:26 +08:00
|
|
|
the --ignore-submodules=dirty command-line option or the 'git
|
2013-09-12 03:07:15 +08:00
|
|
|
submodule summary' command, which shows a similar output but does
|
|
|
|
not honor these settings.
|
2010-05-20 23:55:42 +08:00
|
|
|
|
2015-08-29 23:25:57 +08:00
|
|
|
stash.showPatch::
|
|
|
|
If this is set to true, the `git stash show` command without an
|
2017-06-18 06:30:50 +08:00
|
|
|
option will show the stash entry in patch form. Defaults to false.
|
2015-08-29 23:25:57 +08:00
|
|
|
See description of 'show' command in linkgit:git-stash[1].
|
|
|
|
|
|
|
|
stash.showStat::
|
|
|
|
If this is set to true, the `git stash show` command without an
|
2017-06-18 06:30:50 +08:00
|
|
|
option will show diffstat of the stash entry. Defaults to true.
|
2015-08-29 23:25:57 +08:00
|
|
|
See description of 'show' command in linkgit:git-stash[1].
|
|
|
|
|
2018-08-23 00:06:05 +08:00
|
|
|
include::submodule-config.txt[]
|
2016-08-18 06:45:35 +08:00
|
|
|
|
2016-03-23 04:41:26 +08:00
|
|
|
tag.forceSignAnnotated::
|
|
|
|
A boolean to specify whether annotated tags created should be GPG signed.
|
|
|
|
If `--annotate` is specified on the command line, it takes
|
|
|
|
precedence over this option.
|
|
|
|
|
2014-07-17 05:48:02 +08:00
|
|
|
tag.sort::
|
|
|
|
This variable controls the sort ordering of tags when displayed by
|
|
|
|
linkgit:git-tag[1]. Without the "--sort=<value>" option provided, the
|
|
|
|
value of this variable will be used as the default.
|
|
|
|
|
2006-07-20 17:30:44 +08:00
|
|
|
tar.umask::
|
2007-08-22 02:01:16 +08:00
|
|
|
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
|
2007-12-29 14:20:38 +08:00
|
|
|
linkgit:git-archive[1].
|
2006-07-20 17:30:44 +08:00
|
|
|
|
2011-09-05 03:37:45 +08:00
|
|
|
transfer.fsckObjects::
|
|
|
|
When `fetch.fsckObjects` or `receive.fsckObjects` are
|
|
|
|
not set, the value of this variable is used instead.
|
|
|
|
Defaults to false.
|
2018-07-27 22:37:12 +08:00
|
|
|
+
|
|
|
|
When set, the fetch or receive will abort in the case of a malformed
|
2018-07-27 22:37:14 +08:00
|
|
|
object or a link to a nonexistent object. In addition, various other
|
|
|
|
issues are checked for, including legacy issues (see `fsck.<msg-id>`),
|
|
|
|
and potential security issues like the existence of a `.GIT` directory
|
|
|
|
or a malicious `.gitmodules` file (see the release notes for v2.2.1
|
|
|
|
and v2.17.1 for details). Other sanity and security checks may be
|
|
|
|
added in future releases.
|
|
|
|
+
|
|
|
|
On the receiving side, failing fsckObjects will make those objects
|
|
|
|
unreachable, see "QUARANTINE ENVIRONMENT" in
|
|
|
|
linkgit:git-receive-pack[1]. On the fetch side, malformed objects will
|
|
|
|
instead be left unreferenced in the repository.
|
2018-07-27 22:37:15 +08:00
|
|
|
+
|
|
|
|
Due to the non-quarantine nature of the `fetch.fsckObjects`
|
|
|
|
implementation it can not be relied upon to leave the object store
|
|
|
|
clean like `receive.fsckObjects` can.
|
|
|
|
+
|
|
|
|
As objects are unpacked they're written to the object store, so there
|
|
|
|
can be cases where malicious objects get introduced even though the
|
|
|
|
"fetch" failed, only to have a subsequent "fetch" succeed because only
|
|
|
|
new incoming objects are checked, not those that have already been
|
|
|
|
written to the object store. That difference in behavior should not be
|
|
|
|
relied upon. In the future, such objects may be quarantined for
|
|
|
|
"fetch" as well.
|
|
|
|
+
|
|
|
|
For now, the paranoid need to find some way to emulate the quarantine
|
|
|
|
environment if they'd like the same protection as "push". E.g. in the
|
|
|
|
case of an internal mirror do the mirroring in two steps, one to fetch
|
|
|
|
the untrusted objects, and then do a second "push" (which will use the
|
|
|
|
quarantine) to another internal repo, and have internal clients
|
|
|
|
consume this pushed-to repository, or embargo internal fetches and
|
|
|
|
only allow them once a full "fsck" has run (and no new fetches have
|
|
|
|
happened in the meantime).
|
2011-09-05 03:37:45 +08:00
|
|
|
|
2015-03-12 04:32:45 +08:00
|
|
|
transfer.hideRefs::
|
2015-07-29 03:59:11 +08:00
|
|
|
String(s) `receive-pack` and `upload-pack` use to decide which
|
|
|
|
refs to omit from their initial advertisements. Use more than
|
|
|
|
one definition to specify multiple prefix strings. A ref that is
|
|
|
|
under the hierarchies listed in the value of this variable is
|
|
|
|
excluded, and is hidden when responding to `git push` or `git
|
|
|
|
fetch`. See `receive.hideRefs` and `uploadpack.hideRefs` for
|
|
|
|
program-specific versions of this config.
|
refs: support negative transfer.hideRefs
If you hide a hierarchy of refs using the transfer.hideRefs
config, there is no way to later override that config to
"unhide" it. This patch implements a "negative" hide which
causes matches to immediately be marked as unhidden, even if
another match would hide it. We take care to apply the
matches in reverse-order from how they are fed to us by the
config machinery, as that lets our usual "last one wins"
config precedence work (and entries in .git/config, for
example, will override /etc/gitconfig).
So you can now do:
$ git config --system transfer.hideRefs refs/secret
$ git config transfer.hideRefs '!refs/secret/not-so-secret'
to hide refs/secret in all repos, except for one public bit
in one specific repo. Or you can even do:
$ git clone \
-u "git -c transfer.hiderefs="!refs/foo" upload-pack" \
remote:repo.git
to clone remote:repo.git, overriding any hiding it has
configured.
There are two alternatives that were considered and
rejected:
1. A generic config mechanism for removing an item from a
list. E.g.: (e.g., "[transfer] hideRefs -= refs/foo").
This is nice because it could apply to other
multi-valued config, as well. But it is not nearly as
flexible. There is no way to say:
[transfer]
hideRefs = refs/secret
hideRefs = refs/secret/not-so-secret
Having explicit negative specifications means we can
override previous entries, even if they are not the
same literal string.
2. Adding another variable to override some parts of
hideRefs (e.g., "exposeRefs").
This solves the problem from alternative (1), but it
cannot easily obey the normal config precedence,
because it would use two separate lists. For example:
[transfer]
hideRefs = refs/secret
exposeRefs = refs/secret/not-so-secret
hideRefs = refs/secret/not-so-secret/no-really-its-secret
With two lists, we have to apply the "expose" rules
first, and only then apply the "hide" rules. But that
does not match what the above config intends.
Of course we could internally parse that to a single
list, respecting the ordering, which saves us having to
invent the new "!" syntax. But using a single name
communicates to the user that the ordering _is_
important. And "!" is well-known for negation, and
should not appear at the beginning of a ref (it is
actually valid in a ref-name, but all entries here
should be fully-qualified, starting with "refs/").
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-07-29 04:23:26 +08:00
|
|
|
+
|
|
|
|
You may also include a `!` in front of the ref name to negate the entry,
|
|
|
|
explicitly exposing it, even if an earlier entry marked it as hidden.
|
|
|
|
If you have multiple hideRefs values, later entries override earlier ones
|
|
|
|
(and entries in more-specific config files override less-specific ones).
|
2015-11-03 15:58:14 +08:00
|
|
|
+
|
|
|
|
If a namespace is in use, the namespace prefix is stripped from each
|
|
|
|
reference before it is matched against `transfer.hiderefs` patterns.
|
|
|
|
For example, if `refs/heads/master` is specified in `transfer.hideRefs` and
|
|
|
|
the current namespace is `foo`, then `refs/namespaces/foo/refs/heads/master`
|
|
|
|
is omitted from the advertisements but `refs/heads/master` and
|
|
|
|
`refs/namespaces/bar/refs/heads/master` are still advertised as so-called
|
2015-11-03 15:58:16 +08:00
|
|
|
"have" lines. In order to match refs before stripping, add a `^` in front of
|
|
|
|
the ref name. If you combine `!` and `^`, `!` must be specified first.
|
2016-11-15 02:20:24 +08:00
|
|
|
+
|
|
|
|
Even if you hide refs, a client may still be able to steal the target
|
|
|
|
objects via the techniques described in the "SECURITY" section of the
|
|
|
|
linkgit:gitnamespaces[7] man page; it's best to keep private data in a
|
|
|
|
separate repository.
|
upload/receive-pack: allow hiding ref hierarchies
A repository may have refs that are only used for its internal
bookkeeping purposes that should not be exposed to the others that
come over the network.
Teach upload-pack to omit some refs from its initial advertisement
by paying attention to the uploadpack.hiderefs multi-valued
configuration variable. Do the same to receive-pack via the
receive.hiderefs variable. As a convenient short-hand, allow using
transfer.hiderefs to set the value to both of these variables.
Any ref that is under the hierarchies listed on the value of these
variable is excluded from responses to requests made by "ls-remote",
"fetch", etc. (for upload-pack) and "push" (for receive-pack).
Because these hidden refs do not count as OUR_REF, an attempt to
fetch objects at the tip of them will be rejected, and because these
refs do not get advertised, "git push :" will not see local branches
that have the same name as them as "matching" ones to be sent.
An attempt to update/delete these hidden refs with an explicit
refspec, e.g. "git push origin :refs/hidden/22", is rejected. This
is not a new restriction. To the pusher, it would appear that there
is no such ref, so its push request will conclude with "Now that I
sent you all the data, it is time for you to update the refs. I saw
that the ref did not exist when I started pushing, and I want the
result to point at this commit". The receiving end will apply the
compare-and-swap rule to this request and rejects the push with
"Well, your update request conflicts with somebody else; I see there
is such a ref.", which is the right thing to do. Otherwise a push to
a hidden ref will always be "the last one wins", which is not a good
default.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-01-19 08:08:30 +08:00
|
|
|
|
2008-11-26 16:26:50 +08:00
|
|
|
transfer.unpackLimit::
|
|
|
|
When `fetch.unpackLimit` or `receive.unpackLimit` are
|
|
|
|
not set, the value of this variable is used instead.
|
|
|
|
The default value is 100.
|
|
|
|
|
add uploadarchive.allowUnreachable option
In commit ee27ca4, we started restricting remote git-archive
invocations to only accessing reachable commits. This
matches what upload-pack allows, but does restrict some
useful cases (e.g., HEAD:foo). We loosened this in 0f544ee,
which allows `foo:bar` as long as `foo` is a ref tip.
However, that still doesn't allow many useful things, like:
1. Commits accessible from a ref, like `foo^:bar`, which
are reachable
2. Arbitrary sha1s, even if they are reachable.
We can do a full object-reachability check for these cases,
but it can be quite expensive if the client has sent us the
sha1 of a tree; we have to visit every sub-tree of every
commit in the worst case.
Let's instead give site admins an escape hatch, in case they
prefer the more liberal behavior. For many sites, the full
object database is public anyway (e.g., if you allow dumb
walker access), or the site admin may simply decide the
security/convenience tradeoff is not worth it.
This patch adds a new config option to disable the
restrictions added in ee27ca4. It defaults to off, meaning
there is no change in behavior by default.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-02-28 18:04:19 +08:00
|
|
|
uploadarchive.allowUnreachable::
|
|
|
|
If true, allow clients to use `git archive --remote` to request
|
|
|
|
any tree, whether reachable from the ref tips or not. See the
|
2016-11-15 02:20:24 +08:00
|
|
|
discussion in the "SECURITY" section of
|
add uploadarchive.allowUnreachable option
In commit ee27ca4, we started restricting remote git-archive
invocations to only accessing reachable commits. This
matches what upload-pack allows, but does restrict some
useful cases (e.g., HEAD:foo). We loosened this in 0f544ee,
which allows `foo:bar` as long as `foo` is a ref tip.
However, that still doesn't allow many useful things, like:
1. Commits accessible from a ref, like `foo^:bar`, which
are reachable
2. Arbitrary sha1s, even if they are reachable.
We can do a full object-reachability check for these cases,
but it can be quite expensive if the client has sent us the
sha1 of a tree; we have to visit every sub-tree of every
commit in the worst case.
Let's instead give site admins an escape hatch, in case they
prefer the more liberal behavior. For many sites, the full
object database is public anyway (e.g., if you allow dumb
walker access), or the site admin may simply decide the
security/convenience tradeoff is not worth it.
This patch adds a new config option to disable the
restrictions added in ee27ca4. It defaults to off, meaning
there is no change in behavior by default.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-02-28 18:04:19 +08:00
|
|
|
linkgit:git-upload-archive[1] for more details. Defaults to
|
|
|
|
`false`.
|
|
|
|
|
2015-03-12 04:32:45 +08:00
|
|
|
uploadpack.hideRefs::
|
2015-07-29 03:59:11 +08:00
|
|
|
This variable is the same as `transfer.hideRefs`, but applies
|
|
|
|
only to `upload-pack` (and so affects only fetches, not pushes).
|
|
|
|
An attempt to fetch a hidden ref by `git fetch` will fail. See
|
|
|
|
also `uploadpack.allowTipSHA1InWant`.
|
2013-01-29 13:49:57 +08:00
|
|
|
|
2015-05-22 04:23:37 +08:00
|
|
|
uploadpack.allowTipSHA1InWant::
|
2015-03-12 04:32:45 +08:00
|
|
|
When `uploadpack.hideRefs` is in effect, allow `upload-pack`
|
2013-01-29 13:49:57 +08:00
|
|
|
to accept a fetch request that asks for an object at the tip
|
|
|
|
of a hidden ref (by default, such a request is rejected).
|
2016-11-15 02:20:24 +08:00
|
|
|
See also `uploadpack.hideRefs`. Even if this is false, a client
|
|
|
|
may be able to steal objects via the techniques described in the
|
|
|
|
"SECURITY" section of the linkgit:gitnamespaces[7] man page; it's
|
|
|
|
best to keep private data in a separate repository.
|
upload/receive-pack: allow hiding ref hierarchies
A repository may have refs that are only used for its internal
bookkeeping purposes that should not be exposed to the others that
come over the network.
Teach upload-pack to omit some refs from its initial advertisement
by paying attention to the uploadpack.hiderefs multi-valued
configuration variable. Do the same to receive-pack via the
receive.hiderefs variable. As a convenient short-hand, allow using
transfer.hiderefs to set the value to both of these variables.
Any ref that is under the hierarchies listed on the value of these
variable is excluded from responses to requests made by "ls-remote",
"fetch", etc. (for upload-pack) and "push" (for receive-pack).
Because these hidden refs do not count as OUR_REF, an attempt to
fetch objects at the tip of them will be rejected, and because these
refs do not get advertised, "git push :" will not see local branches
that have the same name as them as "matching" ones to be sent.
An attempt to update/delete these hidden refs with an explicit
refspec, e.g. "git push origin :refs/hidden/22", is rejected. This
is not a new restriction. To the pusher, it would appear that there
is no such ref, so its push request will conclude with "Now that I
sent you all the data, it is time for you to update the refs. I saw
that the ref did not exist when I started pushing, and I want the
result to point at this commit". The receiving end will apply the
compare-and-swap rule to this request and rejects the push with
"Well, your update request conflicts with somebody else; I see there
is such a ref.", which is the right thing to do. Otherwise a push to
a hidden ref will always be "the last one wins", which is not a good
default.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-01-19 08:08:30 +08:00
|
|
|
|
2015-05-22 04:23:39 +08:00
|
|
|
uploadpack.allowReachableSHA1InWant::
|
|
|
|
Allow `upload-pack` to accept a fetch request that asks for an
|
|
|
|
object that is reachable from any ref tip. However, note that
|
|
|
|
calculating object reachability is computationally expensive.
|
2016-11-15 02:20:24 +08:00
|
|
|
Defaults to `false`. Even if this is false, a client may be able
|
|
|
|
to steal objects via the techniques described in the "SECURITY"
|
|
|
|
section of the linkgit:gitnamespaces[7] man page; it's best to
|
|
|
|
keep private data in a separate repository.
|
2015-05-22 04:23:39 +08:00
|
|
|
|
2016-11-12 01:23:48 +08:00
|
|
|
uploadpack.allowAnySHA1InWant::
|
|
|
|
Allow `upload-pack` to accept a fetch request that asks for any
|
|
|
|
object at all.
|
|
|
|
Defaults to `false`.
|
|
|
|
|
2015-03-12 04:32:45 +08:00
|
|
|
uploadpack.keepAlive::
|
2013-09-08 17:01:31 +08:00
|
|
|
When `upload-pack` has started `pack-objects`, there may be a
|
|
|
|
quiet period while `pack-objects` prepares the pack. Normally
|
|
|
|
it would output progress information, but if `--quiet` was used
|
|
|
|
for the fetch, `pack-objects` will output nothing at all until
|
|
|
|
the pack data begins. Some clients and networks may consider
|
|
|
|
the server to be hung and give up. Setting this option instructs
|
|
|
|
`upload-pack` to send an empty keepalive packet every
|
2015-03-12 04:32:45 +08:00
|
|
|
`uploadpack.keepAlive` seconds. Setting this option to 0
|
2013-09-08 17:02:06 +08:00
|
|
|
disables keepalive packets entirely. The default is 5 seconds.
|
2013-09-08 17:01:31 +08:00
|
|
|
|
upload-pack: provide a hook for running pack-objects
When upload-pack serves a client request, it turns to
pack-objects to do the heavy lifting of creating a
packfile. There's no easy way to intercept the call to
pack-objects, but there are a few good reasons to want to do
so:
1. If you're debugging a client or server issue with
fetching, you may want to store a copy of the generated
packfile.
2. If you're gathering data from real-world fetches for
performance analysis or debugging, storing a copy of
the arguments and stdin lets you replay the pack
generation at your leisure.
3. You may want to insert a caching layer around
pack-objects; it is the most CPU- and memory-intensive
part of serving a fetch, and its output is a pure
function[1] of its input, making it an ideal place to
consolidate identical requests.
This patch adds a simple "hook" interface to intercept calls
to pack-objects. The new test demonstrates how it can be
used for debugging (using it for caching is a
straightforward extension; the tricky part is writing the
actual caching layer).
This hook is unlike the normal hook scripts found in the
"hooks/" directory of a repository. Because we promise that
upload-pack is safe to run in an untrusted repository, we
cannot execute arbitrary code or commands found in the
repository (neither in hooks/, nor in the config). So
instead, this hook is triggered from a config variable that
is explicitly ignored in the per-repo config.
The config variable holds the actual shell command to run as
the hook. Another approach would be to simply treat it as a
boolean: "should I respect the upload-pack hooks in this
repo?", and then run the script from "hooks/" as we usually
do. However, that isn't as flexible; there's no way to run a
hook approved by the site administrator (e.g., in
"/etc/gitconfig") on a repository whose contents are not
trusted. The approach taken by this patch is more
fine-grained, if a little less conventional for git hooks
(it does behave similar to other configured commands like
diff.external, etc).
[1] Pack-objects isn't _actually_ a pure function. Its
output depends on the exact packing of the object
database, and if multi-threading is used for delta
compression, can even differ racily. But for the
purposes of caching, that's OK; of the many possible
outputs for a given input, it is sufficient only that we
output one of them.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-05-19 06:45:37 +08:00
|
|
|
uploadpack.packObjectsHook::
|
|
|
|
If this option is set, when `upload-pack` would run
|
|
|
|
`git pack-objects` to create a packfile for a client, it will
|
|
|
|
run this shell command instead. The `pack-objects` command and
|
|
|
|
arguments it _would_ have run (including the `git pack-objects`
|
|
|
|
at the beginning) are appended to the shell command. The stdin
|
|
|
|
and stdout of the hook are treated as if `pack-objects` itself
|
|
|
|
was run. I.e., `upload-pack` will feed input intended for
|
|
|
|
`pack-objects` to the hook, and expects a completed packfile on
|
|
|
|
stdout.
|
|
|
|
+
|
|
|
|
Note that this configuration variable is ignored if it is seen in the
|
|
|
|
repository-level config (this is a safety measure against fetching from
|
|
|
|
untrusted repositories).
|
|
|
|
|
2018-09-29 14:50:56 +08:00
|
|
|
uploadpack.allowFilter::
|
|
|
|
If this option is set, `upload-pack` will support partial
|
|
|
|
clone and partial fetch object filtering.
|
|
|
|
|
2018-06-28 06:30:17 +08:00
|
|
|
uploadpack.allowRefInWant::
|
|
|
|
If this option is set, `upload-pack` will support the `ref-in-want`
|
|
|
|
feature of the protocol version 2 `fetch` command. This feature
|
|
|
|
is intended for the benefit of load-balanced servers which may
|
|
|
|
not have the same view of what OIDs their refs point to due to
|
|
|
|
replication delay.
|
|
|
|
|
2008-02-21 02:43:53 +08:00
|
|
|
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
|
2013-01-22 03:17:53 +08:00
|
|
|
equivalent URLs and have Git automatically rewrite the URL to
|
2008-02-21 02:43:53 +08:00
|
|
|
the best alternative for the particular user, even for a
|
2008-02-25 14:25:04 +08:00
|
|
|
never-before-seen repository on the site. When more than one
|
|
|
|
insteadOf strings match a given URL, the longest match is used.
|
2017-05-31 13:18:04 +08:00
|
|
|
+
|
|
|
|
Note that any protocol restrictions will be applied to the rewritten
|
|
|
|
URL. If the rewrite changes the URL to use a custom protocol or remote
|
|
|
|
helper, you may need to adjust the `protocol.*.allow` config to permit
|
|
|
|
the request. In particular, protocols you expect to use for submodules
|
|
|
|
must be set to `always` rather than the default of `user`. See the
|
|
|
|
description of `protocol.allow` above.
|
2008-02-21 02:43:53 +08:00
|
|
|
|
2009-09-07 16:56:33 +08:00
|
|
|
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
|
2013-01-22 03:17:53 +08:00
|
|
|
allows people to specify a pull-only URL and have Git
|
2009-09-07 16:56:33 +08:00
|
|
|
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
|
2013-01-22 03:17:53 +08:00
|
|
|
used. If a remote has an explicit pushurl, Git will ignore this
|
2009-09-07 16:56:33 +08:00
|
|
|
setting for that remote.
|
|
|
|
|
2006-04-25 06:59:33 +08:00
|
|
|
user.email::
|
|
|
|
Your email address to be recorded in any newly created commits.
|
2016-06-08 06:35:06 +08:00
|
|
|
Can be overridden by the `GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_EMAIL`, and
|
2016-06-08 06:35:07 +08:00
|
|
|
`EMAIL` environment variables. See linkgit:git-commit-tree[1].
|
2006-04-25 06:59:33 +08:00
|
|
|
|
|
|
|
user.name::
|
|
|
|
Your full name to be recorded in any newly created commits.
|
2016-06-08 06:35:06 +08:00
|
|
|
Can be overridden by the `GIT_AUTHOR_NAME` and `GIT_COMMITTER_NAME`
|
2007-12-29 14:20:38 +08:00
|
|
|
environment variables. See linkgit:git-commit-tree[1].
|
2006-04-25 06:59:33 +08:00
|
|
|
|
2016-02-06 14:23:36 +08:00
|
|
|
user.useConfigOnly::
|
2016-06-09 01:23:16 +08:00
|
|
|
Instruct Git to avoid trying to guess defaults for `user.email`
|
|
|
|
and `user.name`, and instead retrieve the values only from the
|
2016-02-06 14:23:36 +08:00
|
|
|
configuration. For example, if you have multiple email addresses
|
|
|
|
and would like to use a different one for each repository, then
|
|
|
|
with this configuration option set to `true` in the global config
|
|
|
|
along with a name, Git will prompt you to set up an email before
|
|
|
|
making new commits in a newly cloned repository.
|
|
|
|
Defaults to `false`.
|
|
|
|
|
2015-03-12 04:32:45 +08:00
|
|
|
user.signingKey::
|
2013-10-15 01:04:36 +08:00
|
|
|
If linkgit:git-tag[1] or linkgit:git-commit[1] is not selecting the
|
|
|
|
key you want it to automatically when creating a signed tag or
|
|
|
|
commit, 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.
|
2007-01-26 22:13:46 +08:00
|
|
|
|
versioncmp: generalize version sort suffix reordering
The 'versionsort.prereleaseSuffix' configuration variable, as its name
suggests, is supposed to only deal with tagnames with prerelease
suffixes, and allows sorting those prerelease tags in a user-defined
order before the suffixless main release tag, instead of sorting them
simply lexicographically.
However, the previous changes in this series resulted in an
interesting and useful property of version sort:
- The empty string as a configured suffix matches all tagnames,
including tagnames without any suffix, but
- tagnames containing a "real" configured suffix are still ordered
according to that real suffix, because any longer suffix takes
precedence over the empty string.
Exploiting this property we can easily generalize suffix reordering
and specify the order of tags with given suffixes not only before but
even after a main release tag by using the empty suffix to denote the
position of the main release tag, without any algorithm changes:
$ git -c versionsort.prereleaseSuffix=-alpha \
-c versionsort.prereleaseSuffix=-beta \
-c versionsort.prereleaseSuffix="" \
-c versionsort.prereleaseSuffix=-gamma \
-c versionsort.prereleaseSuffix=-delta \
tag -l --sort=version:refname 'v3.0*'
v3.0-alpha1
v3.0-beta1
v3.0
v3.0-gamma1
v3.0-delta1
Since 'versionsort.prereleaseSuffix' is not a fitting name for a
configuration variable to control this more general suffix reordering,
introduce the new variable 'versionsort.suffix'. Still keep the old
configuration variable name as a deprecated alias, though, to avoid
suddenly breaking setups already using it. Ignore the old variable if
both old and new configuration variables are set, but emit a warning
so users will be aware of it and can fix their configuration. Extend
the documentation to describe and add a test to check this more
general behavior.
Note: since the empty suffix matches all tagnames, tagnames with
suffixes not included in the configuration are listed together with
the suffixless main release tag, ordered lexicographically right after
that, i.e. before tags with suffixes listed in the configuration
following the empty suffix.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-12-08 22:24:01 +08:00
|
|
|
versionsort.prereleaseSuffix (deprecated)::
|
|
|
|
Deprecated alias for `versionsort.suffix`. Ignored if
|
|
|
|
`versionsort.suffix` is set.
|
|
|
|
|
|
|
|
versionsort.suffix::
|
|
|
|
Even when version sort is used in linkgit:git-tag[1], tagnames
|
|
|
|
with the same base version but different suffixes are still sorted
|
|
|
|
lexicographically, resulting e.g. in prerelease tags appearing
|
|
|
|
after the main release (e.g. "1.0-rc1" after "1.0"). This
|
|
|
|
variable can be specified to determine the sorting order of tags
|
|
|
|
with different suffixes.
|
|
|
|
+
|
|
|
|
By specifying a single suffix in this variable, any tagname containing
|
|
|
|
that suffix will appear before the corresponding main release. E.g. if
|
|
|
|
the variable is set to "-rc", then all "1.0-rcX" tags will appear before
|
|
|
|
"1.0". If specified multiple times, once per suffix, then the order of
|
|
|
|
suffixes in the configuration will determine the sorting order of tagnames
|
|
|
|
with those suffixes. E.g. if "-pre" appears before "-rc" in the
|
|
|
|
configuration, then all "1.0-preX" tags will be listed before any
|
|
|
|
"1.0-rcX" tags. The placement of the main release tag relative to tags
|
|
|
|
with various suffixes can be determined by specifying the empty suffix
|
|
|
|
among those other suffixes. E.g. if the suffixes "-rc", "", "-ck" and
|
|
|
|
"-bfs" appear in the configuration in this order, then all "v4.8-rcX" tags
|
|
|
|
are listed first, followed by "v4.8", then "v4.8-ckX" and finally
|
|
|
|
"v4.8-bfsX".
|
|
|
|
+
|
versioncmp: cope with common part overlapping with prerelease suffix
Version sort with prerelease reordering sometimes puts tagnames in the
wrong order, when the common part of two compared tagnames overlaps
with the leading character(s) of one or more configured prerelease
suffixes. Note the position of "v2.1.0-beta-1":
$ git -c versionsort.prereleaseSuffix=-beta \
tag -l --sort=version:refname v2.1.*
v2.1.0-beta-2
v2.1.0-beta-3
v2.1.0
v2.1.0-RC1
v2.1.0-RC2
v2.1.0-beta-1
v2.1.1
v2.1.2
The reason is that when comparing a pair of tagnames, first
versioncmp() looks for the first different character in a pair of
tagnames, and then the swap_prereleases() helper function looks for a
configured prerelease suffix _starting at_ that character. Thus, when
in the above example the sorting algorithm happens to compare the
tagnames "v2.1.0-beta-1" and "v2.1.0-RC2", swap_prereleases() tries to
match the suffix "-beta" against "beta-1" to no avail, and the two
tagnames erroneously end up being ordered lexicographically.
To fix this issue change swap_prereleases() to look for configured
prerelease suffixes _containing_ the position of that first different
character.
Care must be taken, when a configured suffix is longer than the
tagnames' common part up to the first different character, to avoid
reading memory before the beginning of the tagnames. Add a test that
uses an exceptionally long prerelease suffix to check for this, in the
hope that in case of a regression the illegal memory access causes a
segfault in 'git tag' on one of the commonly used platforms (the test
happens to pass successfully on my Linux system with the safety check
removed), or at least makes valgrind complain.
Under some circumstances it's possible that more than one prerelease
suffixes can be found in the same tagname around that first different
character. With this simple bugfix patch such a tagname is sorted
according to the contained suffix that comes first in the
configuration for now. This is less than ideal in some cases, and the
following patch will take care of those.
Reported-by: Leho Kraav <leho@conversionready.com>
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-12-08 22:23:59 +08:00
|
|
|
If more than one suffixes match the same tagname, then that tagname will
|
versioncmp: use earliest-longest contained suffix to determine sorting order
When comparing tagnames, it is possible that a tagname contains more
than one of the configured prerelease suffixes around the first
different character. After fixing a bug in the previous commit such a
tagname is sorted according to the contained suffix which comes first
in the configuration. This is, however, not quite the right thing to
do in the following corner cases:
1. $ git -c versionsort.suffix=-bar
-c versionsort.suffix=-foo-baz
-c versionsort.suffix=-foo-bar
tag -l --sort=version:refname 'v1*'
v1.0-foo-bar
v1.0-foo-baz
The suffix of the tagname 'v1.0-foo-bar' is clearly '-foo-bar',
so it should be listed last. However, as it also contains '-bar'
around the first different character, it is listed first instead,
because that '-bar' suffix comes first the configuration.
2. One of the configured suffixes starts with the other:
$ git -c versionsort.prereleasesuffix=-pre \
-c versionsort.prereleasesuffix=-prerelease \
tag -l --sort=version:refname 'v2*'
v2.0-prerelease1
v2.0-pre1
v2.0-pre2
Here the tagname 'v2.0-prerelease1' should be the last. When
comparing 'v2.0-pre1' and 'v2.0-prerelease1' the first different
characters are '1' and 'r', respectively. Since this first
different character must be part of the configured suffix, the
'-pre' suffix is not recognized in the first tagname. OTOH, the
'-prerelease' suffix is properly recognized in
'v2.0-prerelease1', thus it is listed first.
Improve version sort in these corner cases, and
- look for a configured prerelease suffix containing the first
different character or ending right before it, so the '-pre'
suffixes are recognized in case (2). This also means that
when comparing tagnames 'v2.0-pre1' and 'v2.0-pre2',
swap_prereleases() would find the '-pre' suffix in both, but then
it will return "undecided" and the caller will do the right thing
by sorting based in '1' and '2'.
- If the tagname contains more than one suffix, then give precedence
to the contained suffix that starts at the earliest offset in the
tagname to address (1).
- If there are more than one suffixes starting at that earliest
position, then give precedence to the longest of those suffixes,
thus ensuring that in (2) the tagname 'v2.0-prerelease1' won't be
sorted based on the '-pre' suffix.
Add tests for these corner cases and adjust the documentation
accordingly.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-12-08 22:24:00 +08:00
|
|
|
be sorted according to the suffix which starts at the earliest position in
|
|
|
|
the tagname. If more than one different matching suffixes start at
|
|
|
|
that earliest position, then that tagname will be sorted according to the
|
|
|
|
longest of those suffixes.
|
versioncmp: cope with common part overlapping with prerelease suffix
Version sort with prerelease reordering sometimes puts tagnames in the
wrong order, when the common part of two compared tagnames overlaps
with the leading character(s) of one or more configured prerelease
suffixes. Note the position of "v2.1.0-beta-1":
$ git -c versionsort.prereleaseSuffix=-beta \
tag -l --sort=version:refname v2.1.*
v2.1.0-beta-2
v2.1.0-beta-3
v2.1.0
v2.1.0-RC1
v2.1.0-RC2
v2.1.0-beta-1
v2.1.1
v2.1.2
The reason is that when comparing a pair of tagnames, first
versioncmp() looks for the first different character in a pair of
tagnames, and then the swap_prereleases() helper function looks for a
configured prerelease suffix _starting at_ that character. Thus, when
in the above example the sorting algorithm happens to compare the
tagnames "v2.1.0-beta-1" and "v2.1.0-RC2", swap_prereleases() tries to
match the suffix "-beta" against "beta-1" to no avail, and the two
tagnames erroneously end up being ordered lexicographically.
To fix this issue change swap_prereleases() to look for configured
prerelease suffixes _containing_ the position of that first different
character.
Care must be taken, when a configured suffix is longer than the
tagnames' common part up to the first different character, to avoid
reading memory before the beginning of the tagnames. Add a test that
uses an exceptionally long prerelease suffix to check for this, in the
hope that in case of a regression the illegal memory access causes a
segfault in 'git tag' on one of the commonly used platforms (the test
happens to pass successfully on my Linux system with the safety check
removed), or at least makes valgrind complain.
Under some circumstances it's possible that more than one prerelease
suffixes can be found in the same tagname around that first different
character. With this simple bugfix patch such a tagname is sorted
according to the contained suffix that comes first in the
configuration for now. This is less than ideal in some cases, and the
following patch will take care of those.
Reported-by: Leho Kraav <leho@conversionready.com>
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-12-08 22:23:59 +08:00
|
|
|
The sorting order between different suffixes is undefined if they are
|
|
|
|
in multiple config files.
|
2015-02-26 18:44:01 +08:00
|
|
|
|
2008-01-08 11:55:14 +08:00
|
|
|
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.
|
2017-11-30 04:04:51 +08:00
|
|
|
|
|
|
|
worktree.guessRemote::
|
|
|
|
With `add`, if no branch argument, and neither of `-b` nor
|
|
|
|
`-B` nor `--detach` are given, the command defaults to
|
|
|
|
creating a new branch from HEAD. If `worktree.guessRemote` is
|
|
|
|
set to true, `worktree add` tries to find a remote-tracking
|
|
|
|
branch whose name uniquely matches the new branch name. If
|
|
|
|
such a branch exists, it is checked out and set as "upstream"
|
|
|
|
for the new branch. If no such match can be found, it falls
|
|
|
|
back to creating a new branch from the current HEAD.
|