A gitattributes file is a simple text file that gives attributes
       to pathnames.
       Each line in gitattributes file is of form:
           pattern attr1 attr2 ...
       That is, a pattern followed by an attributes list, separated by
       whitespaces. Leading and trailing whitespaces are ignored. Lines
       that begin with # are ignored. Patterns that begin with a double
       quote are quoted in C style. When the pattern matches the path in
       question, the attributes listed on the line are given to the
       path.
       Each attribute can be in one of these states for a given path:
       Set
           The path has the attribute with special value "true"; this is
           specified by listing only the name of the attribute in the
           attribute list.
       Unset
           The path has the attribute with special value "false"; this
           is specified by listing the name of the attribute prefixed
           with a dash - in the attribute list.
       Set to a value
           The path has the attribute with specified string value; this
           is specified by listing the name of the attribute followed by
           an equal sign = and its value in the attribute list.
       Unspecified
           No pattern matches the path, and nothing says if the path has
           or does not have the attribute, the attribute for the path is
           said to be Unspecified.
       When more than one pattern matches the path, a later line
       overrides an earlier line. This overriding is done per attribute.
       The rules by which the pattern matches paths are the same as in
       .gitignore files (see gitignore(5)), with a few exceptions:
       •   negative patterns are forbidden
       •   patterns that match a directory do not recursively match
           paths inside that directory (so using the trailing-slash
           path/ syntax is pointless in an attributes file; use path/**
           instead)
       When deciding what attributes are assigned to a path, Git
       consults $GIT_DIR/info/attributes file (which has the highest
       precedence), .gitattributes file in the same directory as the
       path in question, and its parent directories up to the toplevel
       of the work tree (the further the directory that contains
       .gitattributes is from the path in question, the lower its
       precedence). Finally global and system-wide files are considered
       (they have the lowest precedence).
       When the .gitattributes file is missing from the work tree, the
       path in the index is used as a fall-back. During checkout
       process, .gitattributes in the index is used and then the file in
       the working tree is used as a fall-back.
       If you wish to affect only a single repository (i.e., to assign
       attributes to files that are particular to one user's workflow
       for that repository), then attributes should be placed in the
       $GIT_DIR/info/attributes file. Attributes which should be
       version-controlled and distributed to other repositories (i.e.,
       attributes of interest to all users) should go into
       .gitattributes files. Attributes that should affect all
       repositories for a single user should be placed in a file
       specified by the core.attributesFile configuration option (see
       git-config(1)). Its default value is
       $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either
       not set or empty, $HOME/.config/git/attributes is used instead.
       Attributes for all users on a system should be placed in the
       $(prefix)/etc/gitattributes file.
       Sometimes you would need to override a setting of an attribute
       for a path to Unspecified state. This can be done by listing the
       name of the attribute prefixed with an exclamation point !.