| gitignore(5) | |
| ============ | |
| NAME | |
| ---- | |
| gitignore - Specifies intentionally untracked files to ignore | |
| SYNOPSIS | |
| -------- | |
| $XDG_CONFIG_HOME/git/ignore, $GIT_COMMON_DIR/info/exclude, .gitignore | |
| DESCRIPTION | |
| ----------- | |
| A `gitignore` file specifies intentionally untracked files that | |
| Git should ignore. | |
| Files already tracked by Git are not affected; see the NOTES | |
| below for details. | |
| Each line in a `gitignore` file specifies a pattern. | |
| When deciding whether to ignore a path, Git normally checks | |
| `gitignore` patterns from multiple sources, with the following | |
| order of precedence, from highest to lowest (within one level of | |
| precedence, the last matching pattern decides the outcome): | |
| * Patterns read from the command line for those commands that support | |
| them. | |
| * Patterns read from a `.gitignore` file in the same directory | |
| as the path, or in any parent directory (up to the top-level of the working | |
| tree), with patterns in the higher level files being overridden by those in | |
| lower level files down to the directory containing the file. 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. | |
| * Patterns read from `$GIT_COMMON_DIR/info/exclude`. | |
| * Patterns read from the file specified by the configuration | |
| variable `core.excludesFile`. | |
| Which file to place a pattern in depends on how the pattern is meant to | |
| 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_COMMON_DIR/info/exclude` file. | |
| * Patterns which a user wants Git to | |
| 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 | |
| `core.excludesFile` in the user's `~/.gitconfig`. Its default value is | |
| $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or | |
| empty, $HOME/.config/git/ignore is used instead. | |
| The underlying Git plumbing tools, such as | |
| 'git ls-files' and 'git read-tree', read | |
| `gitignore` patterns specified by command-line options, or from | |
| files specified by command-line options. Higher-level Git | |
| tools, such as 'git status' and 'git add', | |
| use patterns from the sources specified above. | |
| PATTERN FORMAT | |
| -------------- | |
| - A blank line matches no files, so it can serve as a separator | |
| for readability. | |
| - A line starting with # serves as a comment. | |
| Put a backslash ("`\`") in front of the first hash for patterns | |
| that begin with a hash. | |
| - Trailing spaces are ignored unless they are quoted with backslash | |
| ("`\`"). | |
| - An optional prefix "`!`" which negates the pattern; any | |
| matching file excluded by a previous pattern will become | |
| 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. | |
| Put a backslash ("`\`") in front of the first "`!`" for patterns | |
| that begin with a literal "`!`", for example, "`\!important!.txt`". | |
| - 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. | |
| - Patterns read from exclude sources that are outside the working tree, | |
| such as $GIT_COMMON_DIR/info/exclude and core.excludesFile, are treated as if | |
| they are specified at the root of the working tree, i.e. a leading "/" | |
| in such patterns anchors the match at the root of the repository. | |
| - 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. | |
| - A backslash ("`\`") can be used to escape any character. E.g., "`\*`" | |
| matches a literal asterisk (and "`\a`" matches "`a`", even though | |
| there is no need for escaping there). As with fnmatch(3), a backslash | |
| at the end of a pattern is an invalid pattern that never matches. | |
| 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 | |
| "`foo`" anywhere, the same as pattern "`foo`". "`**/foo/bar`" | |
| matches file or directory "`bar`" anywhere that is directly | |
| under directory "`foo`". | |
| - A trailing "`/**`" matches everything inside. For example, | |
| "`abc/**`" matches all files inside directory "`abc`", relative | |
| 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. | |
| - Other consecutive asterisks are considered regular asterisks and | |
| will match according to the previous rules. | |
| CONFIGURATION | |
| ------------- | |
| The optional configuration variable `core.excludesFile` indicates a path to a | |
| file containing patterns of file names to exclude, similar to | |
| `$GIT_COMMON_DIR/info/exclude`. Patterns in the exclude file are used in | |
| addition to those in `$GIT_COMMON_DIR/info/exclude`. | |
| NOTES | |
| ----- | |
| The purpose of gitignore files is to ensure that certain files | |
| not tracked by Git remain untracked. | |
| To stop tracking a file that is currently tracked, use | |
| 'git rm --cached' to remove the file from the index. The filename | |
| can then be added to the `.gitignore` file to stop the file from | |
| being reintroduced in later commits. | |
| 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. | |
| EXAMPLES | |
| -------- | |
| - The pattern `hello.*` matches any file or directory | |
| whose name begins with `hello.`. If one wants to restrict | |
| 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. | |
| -------------------------------------------------------------- | |
| $ git status | |
| [...] | |
| # 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 | |
| $ git status | |
| [...] | |
| # 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 | |
| -------------------------------------------------------------- | |
| The second .gitignore prevents Git from ignoring | |
| `arch/foo/kernel/vmlinux.lds.S`. | |
| 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 | |
| -------------------------------------------------------------- | |
| SEE ALSO | |
| -------- | |
| linkgit:git-rm[1], | |
| linkgit:gitrepository-layout[5], | |
| linkgit:git-check-ignore[1] | |
| GIT | |
| --- | |
| Part of the linkgit:git[1] suite |