User Tools

Site Tools


git_ignore

Overview

How to identify untracked files that Git should intentionally ignore when running numerous commands, such as git add -u, git status, git clean and many more.

Some links:

Introductory .gitignore

Basic .gitignore file

Excerpts from the Linux kernel source top-level .gitignore file, which forces ignoring of all these file patterns recursively:

.*                               [all hidden files/directories]
*.a
*.asn1.[ch]
*.bz2
*.c.[012]*.*
*.dt.yaml
*.dtb
*.dtb.S
*.dwo
*.elf
*.gz
*.ko
...
Module.symvers                    [specific filename]
...
#
# Top-level generic files
#
/tags
/TAGS
/linux
/vmlinux
/vmlinux.32
/vmlinux-gdb.py
...
/debian/                           [top-level directory only]
...
#
# Exceptions: git files that we don't want to ignore even if they are dot-files
#
!.gitignore
!.mailmap
!.cocciconfig
!.clang-format
...
#
# Generated include files
#
include/config
include/generated
include/ksym
arch/*/include/generated
...

Recursive .gitignore

Subdirectories can have more specific .gitignore files that take precedence in those subdirectories. For the Linux kernel source, the top-level directory scripts/ has the .gitignore file:

#
# Generated files
#
bin2c
conmakehash
kallsyms
pnmtologo
unifdef
recordmcount
sortextable
asn1_compiler
extract-cert
sign-file
insert-sys-cert

The Linux kernel source repo has over 200 .gitignore files.

Advanced ignoring

Four levels of ignoring files

Each line in a gitignore/exclude 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 (see man git-clean),
  • Patterns read from a .gitignore file in the same directory as the path, or in any parent directory, with patterns in the 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. 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 (repository-specific) $GIT_DIR/info/exclude,
  • Patterns read from the file specified by the configuration variable core.excludesFile (possibly ~/.my_ignorefile).

Rationale for different levels of gitignore files

  • 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 that comes with the repository.
  • Patterns which are both specific to a particular repository and specific to an individual user’s workflow should go into the $GIT_DIR/info/exclude file for that repository after the user has cloned it.
  • 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.
$ git config --global core.excludesfile ~/.my_ignorefile

Debugging gitignore files

$ man git-check-ignore

gitignore gotchas

  • Since .gitignore is a versioned file, checking out a different commit might result in a different .gitignore file, causing unexpected behaviour.
git_ignore.txt · Last modified: 2019/02/22 18:18 by rpjday