Git gitignore
Links: 106 Git Index
.gitignore¶
The .gitignore file specifies what untracked files Git should ignore.
.gitignoreis a plain text file in which each line contains a pattern for files or directories to ignore.- Lines starting with a hash mark (
#) are comments and are ignored. - Empty lines can be used to improve the readability of the file and to group related lines of patterns.
Slash¶
- The slash symbol (
/) represents a directory separator. - The slash at the beginning of a pattern is relative to the directory where the
.gitignoreresides.- If the pattern starts with a slash, it matches files and directories only in the repository root.
- If the pattern doesn’t start with a slash, it matches files and directories in any directory or subdirectory.
- If the pattern ends with a slash, it matches only directories.
-
When a directory is ignored, all of its files and subdirectories are also ignored.
-
Pattern example matches:
/access.log:access.logaccess.log:access.log,logs/access.log,var/logs/access.logbuild/:build,test/build
-
Examples:
- Notice the
Iaround the file/folder which means ignored.UTmeans untracked - Folders/files with the same name are also ignored recursively
- By giving a slash we are ignoring only folders
- By giving a slash at the beginning we are only looking for files in the current directory and not recursively
- Files are matches without forward slash
- Notice the
Wildcard symbols¶
*- The asterisk symbol matches zero or more characters.*.log:error.log,logs/debug.log,build/logs/error.log- The wildcard character (
*) will match anything except for a slash. That is it won't match directories. Documentation/*.htmlmatchesDocumentation/git.htmlbut notDocumentation/ppc/ppc.htmlortools/perf/Documentation/perf.html
**- Two adjacent asterisk symbols match any file or zero or more directories.logs/**: Matches anything inside thelogsdirectory.
- When followed by a slash (
/), it matches only directories.**/build:var/build,pub/build,buildfoo/**/bar:foo/bar,foo/a/bar,foo/a/b/c/bar
Negating Patterns¶
- A pattern that starts with an exclamation mark (
!) negates (re-include) any file that is ignored by the previous pattern.
error.logorlogs/error.logwill not be ignored
Multiple .gitignore¶
- A local
.gitignorefile is usually placed in the repository’s root directory. - However, you can create multiple
.gitignorefiles in different subdirectories in your repository. - The patterns in the
.gitignorefiles are matched relative to the directory where the file resides.
Patterns defined in the files that reside in lower-level directories (sub-directories) have precedence over those in higher-level directories.
Ignoring a Previously Committed Files¶
- The files in your working copy can be either tracked or untracked.
To ignore a file that has been previously committed, you’ll need to unstage and remove the file from the index, and then add a rule for the file in .gitignore
git rm --cached filename
- The
--cachedoption tells git not to delete the file from the working tree but only to remove it from the index. - To recursively remove a directory, use the
-roption:git rm -r --cached filename - If you want to remove the file from both the index and local filesystem, omit the
--cachedoption.
When recursively deleting files, use the -n option that will perform a dry run and show you what files will be deleted
git rm -r -n directory
Debugging .gitignore files¶
- Sometimes it can be challenging to determine why a specific file is being ignored, especially when you are are using multiple
.gitignorefiles or complex patterns. - This is where the
git check-ignorecommand with the-voption, which tells git to display details about the matching pattern, comes handy.- For example, to check why the
www/yarn.lockfile is ignored you would run:git check-ignore -v www/yarn.lock
- For example, to check why the
- The output shows the path to the
gitignorefile, the number of the matching line, and the actual pattern.www/.gitignore:31:/yarn.lock www/yarn.lock
- The command also accepts more than one filename as arguments, and the file doesn’t have to exist in your working tree.
Displaying all the ignored files
git status --ignored
Committing ignored files¶
- Let's say you have an exception you want to make for a file that's usually ignored, but for whatever reason this project in particular needs it.
- In cases like this you have a few options:
- Tell Git to not ignore this file by prefixing the file name with a
!in .gitignore, i.e.!.env. This will override any global ignore files or ignore files in parent directories. - Use the
--forceoption (or-fflag) when staging your files, i.e.git add .env --force
- Tell Git to not ignore this file by prefixing the file name with a
References¶
- Ignoring Files and Directories in Git (.gitignore) | Linuxize
- Git - gitignore Documentation (git-scm.com)
Last updated: 2022-06-25