blob: d47b1ae29637269859bc7f41d0fc49732c8f39aa [file] [log] [blame]
Josh Triplettcedb8d52007-06-02 10:08:54 -07001gitignore(5)
2============
3
4NAME
5----
6gitignore - Specifies intentionally untracked files to ignore
7
8SYNOPSIS
9--------
Todd Zullinger45e851c2018-06-27 00:46:51 -040010$XDG_CONFIG_HOME/git/ignore, $GIT_DIR/info/exclude, .gitignore
Josh Triplettcedb8d52007-06-02 10:08:54 -070011
12DESCRIPTION
13-----------
14
15A `gitignore` file specifies intentionally untracked files that
Thomas Ackermann2de9b712013-01-21 20:17:53 +010016Git should ignore.
17Files already tracked by Git are not affected; see the NOTES
Jonathan Nieder6f02a5a2010-11-10 13:00:48 -060018below for details.
Josh Triplettcedb8d52007-06-02 10:08:54 -070019
Petr Baudis6259ac62008-07-18 16:11:07 +020020Each line in a `gitignore` file specifies a pattern.
Thomas Ackermann2de9b712013-01-21 20:17:53 +010021When deciding whether to ignore a path, Git normally checks
Josh Triplettcedb8d52007-06-02 10:08:54 -070022`gitignore` patterns from multiple sources, with the following
David Kastrup98ec4ad2007-07-22 01:53:49 +020023order of precedence, from highest to lowest (within one level of
24precedence, the last matching pattern decides the outcome):
Josh Triplettcedb8d52007-06-02 10:08:54 -070025
David Kastrup98ec4ad2007-07-22 01:53:49 +020026 * Patterns read from the command line for those commands that support
27 them.
Josh Triplettcedb8d52007-06-02 10:08:54 -070028
29 * Patterns read from a `.gitignore` file in the same directory
David Kastrup98ec4ad2007-07-22 01:53:49 +020030 as the path, or in any parent directory, with patterns in the
Jason Merrill20ff3ec2009-04-06 11:03:36 -040031 higher level files (up to the toplevel of the work tree) being overridden
32 by those in lower level files down to the directory containing the file.
Josh Triplettcedb8d52007-06-02 10:08:54 -070033 These patterns match relative to the location of the
34 `.gitignore` file. A project normally includes such
35 `.gitignore` files in its repository, containing patterns for
36 files generated as part of the project build.
37
David Kastrup98ec4ad2007-07-22 01:53:49 +020038 * Patterns read from `$GIT_DIR/info/exclude`.
39
40 * Patterns read from the file specified by the configuration
Tom Russelloae9f6312016-06-08 19:23:16 +020041 variable `core.excludesFile`.
David Kastrup98ec4ad2007-07-22 01:53:49 +020042
Jeff King90b22902008-03-27 01:31:00 -040043Which file to place a pattern in depends on how the pattern is meant to
Philip Oakley3f8c5a42012-09-19 00:25:31 +010044be used.
45
46 * Patterns which should be version-controlled and distributed to
47 other repositories via clone (i.e., files that all developers will want
48 to ignore) should go into a `.gitignore` file.
49
50 * Patterns which are
51 specific to a particular repository but which do not need to be shared
52 with other related repositories (e.g., auxiliary files that live inside
53 the repository but are specific to one user's workflow) should go into
54 the `$GIT_DIR/info/exclude` file.
55
Thomas Ackermann2de9b712013-01-21 20:17:53 +010056 * Patterns which a user wants Git to
Philip Oakley3f8c5a42012-09-19 00:25:31 +010057 ignore in all situations (e.g., backup or temporary files generated by
58 the user's editor of choice) generally go into a file specified by
Nguyễn Thái Ngọc Duyda0005b2015-03-11 16:32:45 -040059 `core.excludesFile` in the user's `~/.gitconfig`. Its default value is
Philip Oakley3f8c5a42012-09-19 00:25:31 +010060 $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or
61 empty, $HOME/.config/git/ignore is used instead.
Jeff King90b22902008-03-27 01:31:00 -040062
Thomas Ackermann2de9b712013-01-21 20:17:53 +010063The underlying Git plumbing tools, such as
Thomas Rast0b444cd2010-01-10 00:33:00 +010064'git ls-files' and 'git read-tree', read
Josh Triplettcedb8d52007-06-02 10:08:54 -070065`gitignore` patterns specified by command-line options, or from
Thomas Ackermann2de9b712013-01-21 20:17:53 +010066files specified by command-line options. Higher-level Git
Thomas Rast0b444cd2010-01-10 00:33:00 +010067tools, such as 'git status' and 'git add',
Josh Triplettcedb8d52007-06-02 10:08:54 -070068use patterns from the sources specified above.
69
Jonathan Nieder0b803a62010-11-10 12:57:39 -060070PATTERN FORMAT
71--------------
Josh Triplettcedb8d52007-06-02 10:08:54 -070072
73 - A blank line matches no files, so it can serve as a separator
74 for readability.
75
76 - A line starting with # serves as a comment.
Nguyễn Thái Ngọc Duy866f5f82012-10-07 10:13:54 +070077 Put a backslash ("`\`") in front of the first hash for patterns
78 that begin with a hash.
Josh Triplettcedb8d52007-06-02 10:08:54 -070079
Ben North03af7cd2014-11-04 22:18:33 +000080 - Trailing spaces are ignored unless they are quoted with backslash
Nguyễn Thái Ngọc Duy7e2e4b32014-02-09 07:26:38 +070081 ("`\`").
82
Nguyễn Thái Ngọc Duy866f5f82012-10-07 10:13:54 +070083 - An optional prefix "`!`" which negates the pattern; any
Josh Triplettcedb8d52007-06-02 10:08:54 -070084 matching file excluded by a previous pattern will become
Junio C Hamano5cee3492016-03-18 11:06:15 -070085 included again. It is not possible to re-include a file if a parent
86 directory of that file is excluded. Git doesn't list excluded
87 directories for performance reasons, so any patterns on contained
88 files have no effect, no matter where they are defined.
Nguyễn Thái Ngọc Duy866f5f82012-10-07 10:13:54 +070089 Put a backslash ("`\`") in front of the first "`!`" for patterns
90 that begin with a literal "`!`", for example, "`\!important!.txt`".
Josh Triplettcedb8d52007-06-02 10:08:54 -070091
Dr. Adam Nielsen1a58bad2019-06-04 19:34:46 +020092 - The slash '/' is used as the directory separator. Separators may
93 occur at the beginning, middle or end of the `.gitignore` search pattern.
Junio C Hamanod6b8fc32008-01-31 01:17:48 -080094
Dr. Adam Nielsen1a58bad2019-06-04 19:34:46 +020095 - If there is a separator at the beginning or middle (or both) of the
96 pattern, then the pattern is relative to the directory level of the
97 particular `.gitignore` file itself. Otherwise the pattern may also
98 match at any level below the `.gitignore` level.
Josh Triplettcedb8d52007-06-02 10:08:54 -070099
Dr. Adam Nielsen1a58bad2019-06-04 19:34:46 +0200100 - If there is a separator at the end of the pattern then the pattern
101 will only match directories, otherwise the pattern can match both
102 files and directories.
Jonathan Nieder81c13fd2010-03-05 09:56:39 -0600103
Dr. Adam Nielsen1a58bad2019-06-04 19:34:46 +0200104 - For example, a pattern `doc/frotz/` matches `doc/frotz` directory,
105 but not `a/doc/frotz` directory; however `frotz/` matches `frotz`
106 and `a/frotz` that is a directory (all paths are relative from
107 the `.gitignore` file).
108
109 - An asterisk "`*`" matches anything except a slash.
110 The character "`?`" matches any one character except "`/`".
111 The range notation, e.g. `[a-zA-Z]`, can be used to match
112 one of the characters in a range. See fnmatch(3) and the
113 FNM_PATHNAME flag for a more detailed description.
Josh Triplettcedb8d52007-06-02 10:08:54 -0700114
Nguyễn Thái Ngọc Duy237ec6e2012-10-15 13:26:02 +0700115Two consecutive asterisks ("`**`") in patterns matched against
116full pathname may have special meaning:
117
118 - A leading "`**`" followed by a slash means match in all
119 directories. For example, "`**/foo`" matches file or directory
Karsten Blees8447dc82013-11-07 17:30:47 +0100120 "`foo`" anywhere, the same as pattern "`foo`". "`**/foo/bar`"
Nguyễn Thái Ngọc Duy237ec6e2012-10-15 13:26:02 +0700121 matches file or directory "`bar`" anywhere that is directly
122 under directory "`foo`".
123
Karsten Blees8447dc82013-11-07 17:30:47 +0100124 - A trailing "`/**`" matches everything inside. For example,
125 "`abc/**`" matches all files inside directory "`abc`", relative
Nguyễn Thái Ngọc Duy237ec6e2012-10-15 13:26:02 +0700126 to the location of the `.gitignore` file, with infinite depth.
127
128 - A slash followed by two consecutive asterisks then a slash
129 matches zero or more directories. For example, "`a/**/b`"
130 matches "`a/b`", "`a/x/b`", "`a/x/y/b`" and so on.
131
Nguyễn Thái Ngọc Duye5bbe092018-10-27 10:48:23 +0200132 - Other consecutive asterisks are considered regular asterisks and
133 will match according to the previous rules.
Nguyễn Thái Ngọc Duy237ec6e2012-10-15 13:26:02 +0700134
Denton Liuaf91b022019-03-07 00:25:30 -0800135CONFIGURATION
136-------------
137
138The optional configuration variable `core.excludesFile` indicates a path to a
139file containing patterns of file names to exclude, similar to
140`$GIT_DIR/info/exclude`. Patterns in the exclude file are used in addition to
141those in `$GIT_DIR/info/exclude`.
142
Jonathan Nieder6f02a5a2010-11-10 13:00:48 -0600143NOTES
144-----
145
146The purpose of gitignore files is to ensure that certain files
Thomas Ackermann2de9b712013-01-21 20:17:53 +0100147not tracked by Git remain untracked.
Jonathan Nieder6f02a5a2010-11-10 13:00:48 -0600148
Jonathan Nieder6f02a5a2010-11-10 13:00:48 -0600149To stop tracking a file that is currently tracked, use
150'git rm --cached'.
151
Jonathan Nieder0b803a62010-11-10 12:57:39 -0600152EXAMPLES
153--------
Josh Triplettcedb8d52007-06-02 10:08:54 -0700154
Dr. Adam Nielsen1a58bad2019-06-04 19:34:46 +0200155 - The pattern `hello.*` matches any file or folder
156 whose name begins with `hello`. If one wants to restrict
157 this only to the directory and not in its subdirectories,
158 one can prepend the pattern with a slash, i.e. `/hello.*`;
159 the pattern now matches `hello.txt`, `hello.c` but not
160 `a/hello.java`.
161
162 - The pattern `foo/` will match a directory `foo` and
163 paths underneath it, but will not match a regular file
164 or a symbolic link `foo` (this is consistent with the
165 way how pathspec works in general in Git)
166
167 - The pattern `doc/frotz` and `/doc/frotz` have the same effect
168 in any `.gitignore` file. In other words, a leading slash
169 is not relevant if there is already a middle slash in
170 the pattern.
171
172 - The pattern "foo/*", matches "foo/test.json"
173 (a regular file), "foo/bar" (a directory), but it does not match
174 "foo/bar/hello.c" (a regular file), as the asterisk in the
175 pattern does not match "bar/hello.c" which has a slash in it.
176
Josh Triplettcedb8d52007-06-02 10:08:54 -0700177--------------------------------------------------------------
Jonathan Niederb1889c32008-06-30 01:09:04 -0500178 $ git status
Josh Triplettcedb8d52007-06-02 10:08:54 -0700179 [...]
180 # Untracked files:
181 [...]
182 # Documentation/foo.html
183 # Documentation/gitignore.html
184 # file.o
185 # lib.a
186 # src/internal.o
187 [...]
188 $ cat .git/info/exclude
189 # ignore objects and archives, anywhere in the tree.
190 *.[oa]
191 $ cat Documentation/.gitignore
192 # ignore generated html files,
193 *.html
194 # except foo.html which is maintained by hand
195 !foo.html
Jonathan Niederb1889c32008-06-30 01:09:04 -0500196 $ git status
Josh Triplettcedb8d52007-06-02 10:08:54 -0700197 [...]
198 # Untracked files:
199 [...]
200 # Documentation/foo.html
201 [...]
202--------------------------------------------------------------
203
204Another example:
205
206--------------------------------------------------------------
207 $ cat .gitignore
208 vmlinux*
209 $ ls arch/foo/kernel/vm*
210 arch/foo/kernel/vmlinux.lds.S
211 $ echo '!/vmlinux*' >arch/foo/kernel/.gitignore
212--------------------------------------------------------------
213
Thomas Ackermann2de9b712013-01-21 20:17:53 +0100214The second .gitignore prevents Git from ignoring
Josh Triplettcedb8d52007-06-02 10:08:54 -0700215`arch/foo/kernel/vmlinux.lds.S`.
216
Karsten Blees59856de2013-11-07 22:36:29 +0100217Example to exclude everything except a specific directory `foo/bar`
218(note the `/*` - without the slash, the wildcard would also exclude
219everything within `foo/bar`):
220
221--------------------------------------------------------------
222 $ cat .gitignore
223 # exclude everything except directory foo/bar
224 /*
225 !/foo
226 /foo/*
227 !/foo/bar
228--------------------------------------------------------------
229
Jonathan Nieder6f02a5a2010-11-10 13:00:48 -0600230SEE ALSO
231--------
Adam Spiers368aa522013-01-06 16:58:13 +0000232linkgit:git-rm[1],
Adam Spiers368aa522013-01-06 16:58:13 +0000233linkgit:gitrepository-layout[5],
234linkgit:git-check-ignore[1]
Jonathan Nieder6f02a5a2010-11-10 13:00:48 -0600235
Josh Triplettcedb8d52007-06-02 10:08:54 -0700236GIT
237---
Christian Couder9e1f0a82008-06-06 09:07:32 +0200238Part of the linkgit:git[1] suite