Documentation / gitattributes.txton commit Merge branch 'maint' (1eaa541)
   1gitattributes(5)
   2================
   3
   4NAME
   5----
   6gitattributes - defining attributes per path
   7
   8SYNOPSIS
   9--------
  10$GIT_DIR/info/attributes, gitattributes
  11
  12
  13DESCRIPTION
  14-----------
  15
  16A `gitattributes` file is a simple text file that gives
  17`attributes` to pathnames.
  18
  19Each line in `gitattributes` file is of form:
  20
  21        glob    attr1 attr2 ...
  22
  23That is, a glob pattern followed by an attributes list,
  24separated by whitespaces.  When the glob pattern matches the
  25path in question, the attributes listed on the line are given to
  26the path.
  27
  28Each attribute can be in one of these states for a given path:
  29
  30Set::
  31
  32        The path has the attribute with special value "true";
  33        this is specified by listing only the name of the
  34        attribute in the attribute list.
  35
  36Unset::
  37
  38        The path has the attribute with special value "false";
  39        this is specified by listing the name of the attribute
  40        prefixed with a dash `-` in the attribute list.
  41
  42Set to a value::
  43
  44        The path has the attribute with specified string value;
  45        this is specified by listing the name of the attribute
  46        followed by an equal sign `=` and its value in the
  47        attribute list.
  48
  49Unspecified::
  50
  51        No glob pattern matches the path, and nothing says if
  52        the path has or does not have the attribute, the
  53        attribute for the path is said to be Unspecified.
  54
  55When more than one glob pattern matches the path, a later line
  56overrides an earlier line.  This overriding is done per
  57attribute.
  58
  59When deciding what attributes are assigned to a path, git
  60consults `$GIT_DIR/info/attributes` file (which has the highest
  61precedence), `.gitattributes` file in the same directory as the
  62path in question, and its parent directories (the further the
  63directory that contains `.gitattributes` is from the path in
  64question, the lower its precedence).
  65
  66Sometimes you would need to override an setting of an attribute
  67for a path to `unspecified` state.  This can be done by listing
  68the name of the attribute prefixed with an exclamation point `!`.
  69
  70
  71EFFECTS
  72-------
  73
  74Certain operations by git can be influenced by assigning
  75particular attributes to a path.  Currently, the following
  76operations are attributes-aware.
  77
  78Checking-out and checking-in
  79~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  80
  81These attributes affect how the contents stored in the
  82repository are copied to the working tree files when commands
  83such as `git checkout` and `git merge` run.  They also affect how
  84git stores the contents you prepare in the working tree in the
  85repository upon `git add` and `git commit`.
  86
  87`crlf`
  88^^^^^^
  89
  90This attribute controls the line-ending convention.
  91
  92Set::
  93
  94        Setting the `crlf` attribute on a path is meant to mark
  95        the path as a "text" file.  'core.autocrlf' conversion
  96        takes place without guessing the content type by
  97        inspection.
  98
  99Unset::
 100
 101        Unsetting the `crlf` attribute on a path is meant to
 102        mark the path as a "binary" file.  The path never goes
 103        through line endings conversion upon checkin/checkout.
 104
 105Unspecified::
 106
 107        Unspecified `crlf` attribute tells git to apply the
 108        `core.autocrlf` conversion when the file content looks
 109        like text.
 110
 111Set to string value "input"::
 112
 113        This is similar to setting the attribute to `true`, but
 114        also forces git to act as if `core.autocrlf` is set to
 115        `input` for the path.
 116
 117Any other value set to `crlf` attribute is ignored and git acts
 118as if the attribute is left unspecified.
 119
 120
 121The `core.autocrlf` conversion
 122^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 123
 124If the configuration variable `core.autocrlf` is false, no
 125conversion is done.
 126
 127When `core.autocrlf` is true, it means that the platform wants
 128CRLF line endings for files in the working tree, and you want to
 129convert them back to the normal LF line endings when checking
 130in to the repository.
 131
 132When `core.autocrlf` is set to "input", line endings are
 133converted to LF upon checkin, but there is no conversion done
 134upon checkout.
 135
 136If `core.safecrlf` is set to "true" or "warn", git verifies if
 137the conversion is reversible for the current setting of
 138`core.autocrlf`.  For "true", git rejects irreversible
 139conversions; for "warn", git only prints a warning but accepts
 140an irreversible conversion.  The safety triggers to prevent such
 141a conversion done to the files in the work tree, but there are a
 142few exceptions.  Even though...
 143
 144- "git add" itself does not touch the files in the work tree, the
 145  next checkout would, so the safety triggers;
 146
 147- "git apply" to update a text file with a patch does touch the files
 148  in the work tree, but the operation is about text files and CRLF
 149  conversion is about fixing the line ending inconsistencies, so the
 150  safety does not trigger;
 151
 152- "git diff" itself does not touch the files in the work tree, it is
 153  often run to inspect the changes you intend to next "git add".  To
 154  catch potential problems early, safety triggers.
 155
 156
 157`ident`
 158^^^^^^^
 159
 160When the attribute `ident` is set to a path, git replaces
 161`$Id$` in the blob object with `$Id:`, followed by
 16240-character hexadecimal blob object name, followed by a dollar
 163sign `$` upon checkout.  Any byte sequence that begins with
 164`$Id:` and ends with `$` in the worktree file is replaced
 165with `$Id$` upon check-in.
 166
 167
 168`filter`
 169^^^^^^^^
 170
 171A `filter` attribute can be set to a string value that names a
 172filter driver specified in the configuration.
 173
 174A filter driver consists of a `clean` command and a `smudge`
 175command, either of which can be left unspecified.  Upon
 176checkout, when the `smudge` command is specified, the command is
 177fed the blob object from its standard input, and its standard
 178output is used to update the worktree file.  Similarly, the
 179`clean` command is used to convert the contents of worktree file
 180upon checkin.
 181
 182A missing filter driver definition in the config is not an error
 183but makes the filter a no-op passthru.
 184
 185The content filtering is done to massage the content into a
 186shape that is more convenient for the platform, filesystem, and
 187the user to use.  The key phrase here is "more convenient" and not
 188"turning something unusable into usable".  In other words, the
 189intent is that if someone unsets the filter driver definition,
 190or does not have the appropriate filter program, the project
 191should still be usable.
 192
 193
 194Interaction between checkin/checkout attributes
 195^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 196
 197In the check-in codepath, the worktree file is first converted
 198with `filter` driver (if specified and corresponding driver
 199defined), then the result is processed with `ident` (if
 200specified), and then finally with `crlf` (again, if specified
 201and applicable).
 202
 203In the check-out codepath, the blob content is first converted
 204with `crlf`, and then `ident` and fed to `filter`.
 205
 206
 207Generating diff text
 208~~~~~~~~~~~~~~~~~~~~
 209
 210The attribute `diff` affects if `git diff` generates textual
 211patch for the path or just says `Binary files differ`.  It also
 212can affect what line is shown on the hunk header `@@ -k,l +n,m @@`
 213line.
 214
 215Set::
 216
 217        A path to which the `diff` attribute is set is treated
 218        as text, even when they contain byte values that
 219        normally never appear in text files, such as NUL.
 220
 221Unset::
 222
 223        A path to which the `diff` attribute is unset will
 224        generate `Binary files differ`.
 225
 226Unspecified::
 227
 228        A path to which the `diff` attribute is unspecified
 229        first gets its contents inspected, and if it looks like
 230        text, it is treated as text.  Otherwise it would
 231        generate `Binary files differ`.
 232
 233String::
 234
 235        Diff is shown using the specified custom diff driver.
 236        The driver program is given its input using the same
 237        calling convention as used for GIT_EXTERNAL_DIFF
 238        program.  This name is also used for custom hunk header
 239        selection.
 240
 241
 242Defining a custom diff driver
 243^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 244
 245The definition of a diff driver is done in `gitconfig`, not
 246`gitattributes` file, so strictly speaking this manual page is a
 247wrong place to talk about it.  However...
 248
 249To define a custom diff driver `jcdiff`, add a section to your
 250`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
 251
 252----------------------------------------------------------------
 253[diff "jcdiff"]
 254        command = j-c-diff
 255----------------------------------------------------------------
 256
 257When git needs to show you a diff for the path with `diff`
 258attribute set to `jcdiff`, it calls the command you specified
 259with the above configuration, i.e. `j-c-diff`, with 7
 260parameters, just like `GIT_EXTERNAL_DIFF` program is called.
 261See linkgit:git[7] for details.
 262
 263
 264Defining a custom hunk-header
 265^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 266
 267Each group of changes (called "hunk") in the textual diff output
 268is prefixed with a line of the form:
 269
 270        @@ -k,l +n,m @@ TEXT
 271
 272The text is called 'hunk header', and by default a line that
 273begins with an alphabet, an underscore or a dollar sign is used,
 274which matches what GNU `diff -p` output uses.  This default
 275selection however is not suited for some contents, and you can
 276use customized pattern to make a selection.
 277
 278First in .gitattributes, you would assign the `diff` attribute
 279for paths.
 280
 281------------------------
 282*.tex   diff=tex
 283------------------------
 284
 285Then, you would define "diff.tex.funcname" configuration to
 286specify a regular expression that matches a line that you would
 287want to appear as the hunk header, like this:
 288
 289------------------------
 290[diff "tex"]
 291        funcname = "^\\(\\\\\\(sub\\)*section{.*\\)$"
 292------------------------
 293
 294Note.  A single level of backslashes are eaten by the
 295configuration file parser, so you would need to double the
 296backslashes; the pattern above picks a line that begins with a
 297backslash, and zero or more occurrences of `sub` followed by
 298`section` followed by open brace, to the end of line.
 299
 300There are a few built-in patterns to make this easier, and `tex`
 301is one of them, so you do not have to write the above in your
 302configuration file (you still need to enable this with the
 303attribute mechanism, via `.gitattributes`).  Another built-in
 304pattern is defined for `java` that defines a pattern suitable
 305for program text in Java language.
 306
 307
 308Performing a three-way merge
 309~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 310
 311The attribute `merge` affects how three versions of a file is
 312merged when a file-level merge is necessary during `git merge`,
 313and other programs such as `git revert` and `git cherry-pick`.
 314
 315Set::
 316
 317        Built-in 3-way merge driver is used to merge the
 318        contents in a way similar to `merge` command of `RCS`
 319        suite.  This is suitable for ordinary text files.
 320
 321Unset::
 322
 323        Take the version from the current branch as the
 324        tentative merge result, and declare that the merge has
 325        conflicts.  This is suitable for binary files that does
 326        not have a well-defined merge semantics.
 327
 328Unspecified::
 329
 330        By default, this uses the same built-in 3-way merge
 331        driver as is the case the `merge` attribute is set.
 332        However, `merge.default` configuration variable can name
 333        different merge driver to be used for paths to which the
 334        `merge` attribute is unspecified.
 335
 336String::
 337
 338        3-way merge is performed using the specified custom
 339        merge driver.  The built-in 3-way merge driver can be
 340        explicitly specified by asking for "text" driver; the
 341        built-in "take the current branch" driver can be
 342        requested with "binary".
 343
 344
 345Built-in merge drivers
 346^^^^^^^^^^^^^^^^^^^^^^
 347
 348There are a few built-in low-level merge drivers defined that
 349can be asked for via the `merge` attribute.
 350
 351text::
 352
 353        Usual 3-way file level merge for text files.  Conflicted
 354        regions are marked with conflict markers `<<<<<<<`,
 355        `=======` and `>>>>>>>`.  The version from your branch
 356        appears before the `=======` marker, and the version
 357        from the merged branch appears after the `=======`
 358        marker.
 359
 360binary::
 361
 362        Keep the version from your branch in the work tree, but
 363        leave the path in the conflicted state for the user to
 364        sort out.
 365
 366union::
 367
 368        Run 3-way file level merge for text files, but take
 369        lines from both versions, instead of leaving conflict
 370        markers.  This tends to leave the added lines in the
 371        resulting file in random order and the user should
 372        verify the result. Do not use this if you do not
 373        understand the implications.
 374
 375
 376Defining a custom merge driver
 377^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 378
 379The definition of a merge driver is done in the `.git/config`
 380file, not in the `gitattributes` file, so strictly speaking this
 381manual page is a wrong place to talk about it.  However...
 382
 383To define a custom merge driver `filfre`, add a section to your
 384`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
 385
 386----------------------------------------------------------------
 387[merge "filfre"]
 388        name = feel-free merge driver
 389        driver = filfre %O %A %B
 390        recursive = binary
 391----------------------------------------------------------------
 392
 393The `merge.*.name` variable gives the driver a human-readable
 394name.
 395
 396The `merge.*.driver` variable's value is used to construct a
 397command to run to merge ancestor's version (`%O`), current
 398version (`%A`) and the other branches' version (`%B`).  These
 399three tokens are replaced with the names of temporary files that
 400hold the contents of these versions when the command line is
 401built.
 402
 403The merge driver is expected to leave the result of the merge in
 404the file named with `%A` by overwriting it, and exit with zero
 405status if it managed to merge them cleanly, or non-zero if there
 406were conflicts.
 407
 408The `merge.*.recursive` variable specifies what other merge
 409driver to use when the merge driver is called for an internal
 410merge between common ancestors, when there are more than one.
 411When left unspecified, the driver itself is used for both
 412internal merge and the final merge.
 413
 414
 415Checking whitespace errors
 416~~~~~~~~~~~~~~~~~~~~~~~~~~
 417
 418`whitespace`
 419^^^^^^^^^^^^
 420
 421The `core.whitespace` configuration variable allows you to define what
 422`diff` and `apply` should consider whitespace errors for all paths in
 423the project (See linkgit:git-config[1]).  This attribute gives you finer
 424control per path.
 425
 426Set::
 427
 428        Notice all types of potential whitespace errors known to git.
 429
 430Unset::
 431
 432        Do not notice anything as error.
 433
 434Unspecified::
 435
 436        Use the value of `core.whitespace` configuration variable to
 437        decide what to notice as error.
 438
 439String::
 440
 441        Specify a comma separate list of common whitespace problems to
 442        notice in the same format as `core.whitespace` configuration
 443        variable.
 444
 445
 446EXAMPLE
 447-------
 448
 449If you have these three `gitattributes` file:
 450
 451----------------------------------------------------------------
 452(in $GIT_DIR/info/attributes)
 453
 454a*      foo !bar -baz
 455
 456(in .gitattributes)
 457abc     foo bar baz
 458
 459(in t/.gitattributes)
 460ab*     merge=filfre
 461abc     -foo -bar
 462*.c     frotz
 463----------------------------------------------------------------
 464
 465the attributes given to path `t/abc` are computed as follows:
 466
 4671. By examining `t/.gitattributes` (which is in the same
 468   directory as the path in question), git finds that the first
 469   line matches.  `merge` attribute is set.  It also finds that
 470   the second line matches, and attributes `foo` and `bar`
 471   are unset.
 472
 4732. Then it examines `.gitattributes` (which is in the parent
 474   directory), and finds that the first line matches, but
 475   `t/.gitattributes` file already decided how `merge`, `foo`
 476   and `bar` attributes should be given to this path, so it
 477   leaves `foo` and `bar` unset.  Attribute `baz` is set.
 478
 4793. Finally it examines `$GIT_DIR/info/attributes`.  This file
 480   is used to override the in-tree settings.  The first line is
 481   a match, and `foo` is set, `bar` is reverted to unspecified
 482   state, and `baz` is unset.
 483
 484As the result, the attributes assignment to `t/abc` becomes:
 485
 486----------------------------------------------------------------
 487foo     set to true
 488bar     unspecified
 489baz     set to false
 490merge   set to string value "filfre"
 491frotz   unspecified
 492----------------------------------------------------------------
 493
 494
 495Creating an archive
 496~~~~~~~~~~~~~~~~~~~
 497
 498`export-subst`
 499^^^^^^^^^^^^^^
 500
 501If the attribute `export-subst` is set for a file then git will expand
 502several placeholders when adding this file to an archive.  The
 503expansion depends on the availability of a commit ID, i.e. if
 504linkgit:git-archive[1] has been given a tree instead of a commit or a
 505tag then no replacement will be done.  The placeholders are the same
 506as those for the option `--pretty=format:` of linkgit:git-log[1],
 507except that they need to be wrapped like this: `$Format:PLACEHOLDERS$`
 508in the file.  E.g. the string `$Format:%H$` will be replaced by the
 509commit hash.
 510
 511
 512GIT
 513---
 514Part of the linkgit:git[7] suite