2007-06-03 01:08:54 +08:00
|
|
|
gitignore(5)
|
|
|
|
============
|
|
|
|
|
|
|
|
NAME
|
|
|
|
----
|
|
|
|
gitignore - Specifies intentionally untracked files to ignore
|
|
|
|
|
|
|
|
SYNOPSIS
|
|
|
|
--------
|
2018-06-27 12:46:51 +08:00
|
|
|
$XDG_CONFIG_HOME/git/ignore, $GIT_DIR/info/exclude, .gitignore
|
2007-06-03 01:08:54 +08:00
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
-----------
|
|
|
|
|
|
|
|
A `gitignore` file specifies intentionally untracked files that
|
2013-01-22 03:17:53 +08:00
|
|
|
Git should ignore.
|
|
|
|
Files already tracked by Git are not affected; see the NOTES
|
2010-11-11 03:00:48 +08:00
|
|
|
below for details.
|
2007-06-03 01:08:54 +08:00
|
|
|
|
2008-07-18 22:11:07 +08:00
|
|
|
Each line in a `gitignore` file specifies a pattern.
|
2013-01-22 03:17:53 +08:00
|
|
|
When deciding whether to ignore a path, Git normally checks
|
2007-06-03 01:08:54 +08:00
|
|
|
`gitignore` patterns from multiple sources, with the following
|
2007-07-22 07:53:49 +08:00
|
|
|
order of precedence, from highest to lowest (within one level of
|
|
|
|
precedence, the last matching pattern decides the outcome):
|
2007-06-03 01:08:54 +08:00
|
|
|
|
2007-07-22 07:53:49 +08:00
|
|
|
* Patterns read from the command line for those commands that support
|
|
|
|
them.
|
2007-06-03 01:08:54 +08:00
|
|
|
|
|
|
|
* Patterns read from a `.gitignore` file in the same directory
|
2007-07-22 07:53:49 +08:00
|
|
|
as the path, or in any parent directory, with patterns in the
|
2009-04-06 23:03:36 +08:00
|
|
|
higher level files (up to the toplevel of the work tree) being overridden
|
|
|
|
by those in lower level files down to the directory containing the file.
|
2007-06-03 01:08:54 +08:00
|
|
|
These patterns match relative to the location of the
|
|
|
|
`.gitignore` file. A project normally includes such
|
|
|
|
`.gitignore` files in its repository, containing patterns for
|
|
|
|
files generated as part of the project build.
|
|
|
|
|
2007-07-22 07:53:49 +08:00
|
|
|
* Patterns read from `$GIT_DIR/info/exclude`.
|
|
|
|
|
|
|
|
* Patterns read from the file specified by the configuration
|
2016-06-09 01:23:16 +08:00
|
|
|
variable `core.excludesFile`.
|
2007-07-22 07:53:49 +08:00
|
|
|
|
2008-03-27 13:31:00 +08:00
|
|
|
Which file to place a pattern in depends on how the pattern is meant to
|
2012-09-19 07:25:31 +08:00
|
|
|
be used.
|
|
|
|
|
|
|
|
* Patterns which should be version-controlled and distributed to
|
|
|
|
other repositories via clone (i.e., files that all developers will want
|
|
|
|
to ignore) should go into a `.gitignore` file.
|
|
|
|
|
|
|
|
* Patterns which are
|
|
|
|
specific to a particular repository but which do not need to be shared
|
|
|
|
with other related repositories (e.g., auxiliary files that live inside
|
|
|
|
the repository but are specific to one user's workflow) should go into
|
|
|
|
the `$GIT_DIR/info/exclude` file.
|
|
|
|
|
2013-01-22 03:17:53 +08:00
|
|
|
* Patterns which a user wants Git to
|
2012-09-19 07:25:31 +08:00
|
|
|
ignore in all situations (e.g., backup or temporary files generated by
|
|
|
|
the user's editor of choice) generally go into a file specified by
|
2015-03-12 04:32:45 +08:00
|
|
|
`core.excludesFile` in the user's `~/.gitconfig`. Its default value is
|
2012-09-19 07:25:31 +08:00
|
|
|
$XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or
|
|
|
|
empty, $HOME/.config/git/ignore is used instead.
|
2008-03-27 13:31:00 +08:00
|
|
|
|
2013-01-22 03:17:53 +08:00
|
|
|
The underlying Git plumbing tools, such as
|
2010-01-10 07:33:00 +08:00
|
|
|
'git ls-files' and 'git read-tree', read
|
2007-06-03 01:08:54 +08:00
|
|
|
`gitignore` patterns specified by command-line options, or from
|
2013-01-22 03:17:53 +08:00
|
|
|
files specified by command-line options. Higher-level Git
|
2010-01-10 07:33:00 +08:00
|
|
|
tools, such as 'git status' and 'git add',
|
2007-06-03 01:08:54 +08:00
|
|
|
use patterns from the sources specified above.
|
|
|
|
|
2010-11-11 02:57:39 +08:00
|
|
|
PATTERN FORMAT
|
|
|
|
--------------
|
2007-06-03 01:08:54 +08:00
|
|
|
|
|
|
|
- A blank line matches no files, so it can serve as a separator
|
|
|
|
for readability.
|
|
|
|
|
|
|
|
- A line starting with # serves as a comment.
|
2012-10-07 11:13:54 +08:00
|
|
|
Put a backslash ("`\`") in front of the first hash for patterns
|
|
|
|
that begin with a hash.
|
2007-06-03 01:08:54 +08:00
|
|
|
|
2014-11-05 06:18:33 +08:00
|
|
|
- Trailing spaces are ignored unless they are quoted with backslash
|
2014-02-09 08:26:38 +08:00
|
|
|
("`\`").
|
|
|
|
|
2012-10-07 11:13:54 +08:00
|
|
|
- An optional prefix "`!`" which negates the pattern; any
|
2007-06-03 01:08:54 +08:00
|
|
|
matching file excluded by a previous pattern will become
|
2016-03-19 02:06:15 +08:00
|
|
|
included again. It is not possible to re-include a file if a parent
|
|
|
|
directory of that file is excluded. Git doesn't list excluded
|
|
|
|
directories for performance reasons, so any patterns on contained
|
|
|
|
files have no effect, no matter where they are defined.
|
2012-10-07 11:13:54 +08:00
|
|
|
Put a backslash ("`\`") in front of the first "`!`" for patterns
|
|
|
|
that begin with a literal "`!`", for example, "`\!important!.txt`".
|
2007-06-03 01:08:54 +08:00
|
|
|
|
2019-06-05 01:34:46 +08:00
|
|
|
- The slash '/' is used as the directory separator. Separators may
|
|
|
|
occur at the beginning, middle or end of the `.gitignore` search pattern.
|
|
|
|
|
|
|
|
- If there is a separator at the beginning or middle (or both) of the
|
|
|
|
pattern, then the pattern is relative to the directory level of the
|
|
|
|
particular `.gitignore` file itself. Otherwise the pattern may also
|
|
|
|
match at any level below the `.gitignore` level.
|
|
|
|
|
|
|
|
- If there is a separator at the end of the pattern then the pattern
|
|
|
|
will only match directories, otherwise the pattern can match both
|
|
|
|
files and directories.
|
|
|
|
|
|
|
|
- For example, a pattern `doc/frotz/` matches `doc/frotz` directory,
|
|
|
|
but not `a/doc/frotz` directory; however `frotz/` matches `frotz`
|
|
|
|
and `a/frotz` that is a directory (all paths are relative from
|
|
|
|
the `.gitignore` file).
|
|
|
|
|
|
|
|
- An asterisk "`*`" matches anything except a slash.
|
|
|
|
The character "`?`" matches any one character except "`/`".
|
|
|
|
The range notation, e.g. `[a-zA-Z]`, can be used to match
|
|
|
|
one of the characters in a range. See fnmatch(3) and the
|
|
|
|
FNM_PATHNAME flag for a more detailed description.
|
2007-06-03 01:08:54 +08:00
|
|
|
|
2012-10-15 14:26:02 +08:00
|
|
|
Two consecutive asterisks ("`**`") in patterns matched against
|
|
|
|
full pathname may have special meaning:
|
|
|
|
|
|
|
|
- A leading "`**`" followed by a slash means match in all
|
|
|
|
directories. For example, "`**/foo`" matches file or directory
|
2013-11-08 00:30:47 +08:00
|
|
|
"`foo`" anywhere, the same as pattern "`foo`". "`**/foo/bar`"
|
2012-10-15 14:26:02 +08:00
|
|
|
matches file or directory "`bar`" anywhere that is directly
|
|
|
|
under directory "`foo`".
|
|
|
|
|
2013-11-08 00:30:47 +08:00
|
|
|
- A trailing "`/**`" matches everything inside. For example,
|
|
|
|
"`abc/**`" matches all files inside directory "`abc`", relative
|
2012-10-15 14:26:02 +08:00
|
|
|
to the location of the `.gitignore` file, with infinite depth.
|
|
|
|
|
|
|
|
- A slash followed by two consecutive asterisks then a slash
|
|
|
|
matches zero or more directories. For example, "`a/**/b`"
|
|
|
|
matches "`a/b`", "`a/x/b`", "`a/x/y/b`" and so on.
|
|
|
|
|
2018-10-27 16:48:23 +08:00
|
|
|
- Other consecutive asterisks are considered regular asterisks and
|
|
|
|
will match according to the previous rules.
|
2012-10-15 14:26:02 +08:00
|
|
|
|
2019-03-07 16:25:30 +08:00
|
|
|
CONFIGURATION
|
|
|
|
-------------
|
|
|
|
|
|
|
|
The optional configuration variable `core.excludesFile` indicates a path to a
|
|
|
|
file containing patterns of file names to exclude, similar to
|
|
|
|
`$GIT_DIR/info/exclude`. Patterns in the exclude file are used in addition to
|
|
|
|
those in `$GIT_DIR/info/exclude`.
|
|
|
|
|
2010-11-11 03:00:48 +08:00
|
|
|
NOTES
|
|
|
|
-----
|
|
|
|
|
|
|
|
The purpose of gitignore files is to ensure that certain files
|
2013-01-22 03:17:53 +08:00
|
|
|
not tracked by Git remain untracked.
|
2010-11-11 03:00:48 +08:00
|
|
|
|
|
|
|
To stop tracking a file that is currently tracked, use
|
|
|
|
'git rm --cached'.
|
|
|
|
|
2021-05-04 04:43:28 +08:00
|
|
|
Git does not follow symbolic links when accessing a `.gitignore` file in
|
|
|
|
the working tree. This keeps behavior consistent when the file is
|
|
|
|
accessed from the index or a tree versus from the filesystem.
|
|
|
|
|
2010-11-11 02:57:39 +08:00
|
|
|
EXAMPLES
|
|
|
|
--------
|
2007-06-03 01:08:54 +08:00
|
|
|
|
2019-06-05 01:34:46 +08:00
|
|
|
- The pattern `hello.*` matches any file or folder
|
2021-03-03 20:40:54 +08:00
|
|
|
whose name begins with `hello.`. If one wants to restrict
|
2019-06-05 01:34:46 +08:00
|
|
|
this only to the directory and not in its subdirectories,
|
|
|
|
one can prepend the pattern with a slash, i.e. `/hello.*`;
|
|
|
|
the pattern now matches `hello.txt`, `hello.c` but not
|
|
|
|
`a/hello.java`.
|
|
|
|
|
|
|
|
- The pattern `foo/` will match a directory `foo` and
|
|
|
|
paths underneath it, but will not match a regular file
|
|
|
|
or a symbolic link `foo` (this is consistent with the
|
|
|
|
way how pathspec works in general in Git)
|
|
|
|
|
|
|
|
- The pattern `doc/frotz` and `/doc/frotz` have the same effect
|
|
|
|
in any `.gitignore` file. In other words, a leading slash
|
|
|
|
is not relevant if there is already a middle slash in
|
|
|
|
the pattern.
|
|
|
|
|
|
|
|
- The pattern "foo/*", matches "foo/test.json"
|
|
|
|
(a regular file), "foo/bar" (a directory), but it does not match
|
|
|
|
"foo/bar/hello.c" (a regular file), as the asterisk in the
|
|
|
|
pattern does not match "bar/hello.c" which has a slash in it.
|
|
|
|
|
2007-06-03 01:08:54 +08:00
|
|
|
--------------------------------------------------------------
|
2008-06-30 14:09:04 +08:00
|
|
|
$ git status
|
2007-06-03 01:08:54 +08:00
|
|
|
[...]
|
|
|
|
# Untracked files:
|
|
|
|
[...]
|
|
|
|
# Documentation/foo.html
|
|
|
|
# Documentation/gitignore.html
|
|
|
|
# file.o
|
|
|
|
# lib.a
|
|
|
|
# src/internal.o
|
|
|
|
[...]
|
|
|
|
$ cat .git/info/exclude
|
|
|
|
# ignore objects and archives, anywhere in the tree.
|
|
|
|
*.[oa]
|
|
|
|
$ cat Documentation/.gitignore
|
|
|
|
# ignore generated html files,
|
|
|
|
*.html
|
|
|
|
# except foo.html which is maintained by hand
|
|
|
|
!foo.html
|
2008-06-30 14:09:04 +08:00
|
|
|
$ git status
|
2007-06-03 01:08:54 +08:00
|
|
|
[...]
|
|
|
|
# Untracked files:
|
|
|
|
[...]
|
|
|
|
# Documentation/foo.html
|
|
|
|
[...]
|
|
|
|
--------------------------------------------------------------
|
|
|
|
|
|
|
|
Another example:
|
|
|
|
|
|
|
|
--------------------------------------------------------------
|
|
|
|
$ cat .gitignore
|
|
|
|
vmlinux*
|
|
|
|
$ ls arch/foo/kernel/vm*
|
|
|
|
arch/foo/kernel/vmlinux.lds.S
|
|
|
|
$ echo '!/vmlinux*' >arch/foo/kernel/.gitignore
|
|
|
|
--------------------------------------------------------------
|
|
|
|
|
2013-01-22 03:17:53 +08:00
|
|
|
The second .gitignore prevents Git from ignoring
|
2007-06-03 01:08:54 +08:00
|
|
|
`arch/foo/kernel/vmlinux.lds.S`.
|
|
|
|
|
2013-11-08 05:36:29 +08:00
|
|
|
Example to exclude everything except a specific directory `foo/bar`
|
|
|
|
(note the `/*` - without the slash, the wildcard would also exclude
|
|
|
|
everything within `foo/bar`):
|
|
|
|
|
|
|
|
--------------------------------------------------------------
|
|
|
|
$ cat .gitignore
|
|
|
|
# exclude everything except directory foo/bar
|
|
|
|
/*
|
|
|
|
!/foo
|
|
|
|
/foo/*
|
|
|
|
!/foo/bar
|
|
|
|
--------------------------------------------------------------
|
|
|
|
|
2010-11-11 03:00:48 +08:00
|
|
|
SEE ALSO
|
|
|
|
--------
|
2013-01-07 00:58:13 +08:00
|
|
|
linkgit:git-rm[1],
|
|
|
|
linkgit:gitrepository-layout[5],
|
|
|
|
linkgit:git-check-ignore[1]
|
2010-11-11 03:00:48 +08:00
|
|
|
|
2007-06-03 01:08:54 +08:00
|
|
|
GIT
|
|
|
|
---
|
2008-06-06 15:07:32 +08:00
|
|
|
Part of the linkgit:git[1] suite
|