Documentation / gitattributes.txton commit Sync with maint (04f4262)
   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        pattern attr1 attr2 ...
  22
  23That is, a pattern followed by an attributes list,
  24separated by whitespaces.  When the 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 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 pattern matches the path, a later line
  56overrides an earlier line.  This overriding is done per
  57attribute.  The rules how the pattern matches paths are the
  58same as in `.gitignore` files; see linkgit:gitignore[5].
  59
  60When deciding what attributes are assigned to a path, git
  61consults `$GIT_DIR/info/attributes` file (which has the highest
  62precedence), `.gitattributes` file in the same directory as the
  63path in question, and its parent directories up to the toplevel of the
  64work tree (the further the directory that contains `.gitattributes`
  65is from the path in question, the lower its precedence). Finally
  66global and system-wide files are considered (they have the lowest
  67precedence).
  68
  69If you wish to affect only a single repository (i.e., to assign
  70attributes to files that are particular to
  71one user's workflow for that repository), then
  72attributes should be placed in the `$GIT_DIR/info/attributes` file.
  73Attributes which should be version-controlled and distributed to other
  74repositories (i.e., attributes of interest to all users) should go into
  75`.gitattributes` files. Attributes that should affect all repositories
  76for a single user should be placed in a file specified by the
  77`core.attributesfile` configuration option (see linkgit:git-config[1]).
  78Its default value is $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME
  79is either not set or empty, $HOME/.config/git/attributes is used instead.
  80Attributes for all users on a system should be placed in the
  81`$(prefix)/etc/gitattributes` file.
  82
  83Sometimes you would need to override an setting of an attribute
  84for a path to `Unspecified` state.  This can be done by listing
  85the name of the attribute prefixed with an exclamation point `!`.
  86
  87
  88EFFECTS
  89-------
  90
  91Certain operations by git can be influenced by assigning
  92particular attributes to a path.  Currently, the following
  93operations are attributes-aware.
  94
  95Checking-out and checking-in
  96~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  97
  98These attributes affect how the contents stored in the
  99repository are copied to the working tree files when commands
 100such as 'git checkout' and 'git merge' run.  They also affect how
 101git stores the contents you prepare in the working tree in the
 102repository upon 'git add' and 'git commit'.
 103
 104`text`
 105^^^^^^
 106
 107This attribute enables and controls end-of-line normalization.  When a
 108text file is normalized, its line endings are converted to LF in the
 109repository.  To control what line ending style is used in the working
 110directory, use the `eol` attribute for a single file and the
 111`core.eol` configuration variable for all text files.
 112
 113Set::
 114
 115        Setting the `text` attribute on a path enables end-of-line
 116        normalization and marks the path as a text file.  End-of-line
 117        conversion takes place without guessing the content type.
 118
 119Unset::
 120
 121        Unsetting the `text` attribute on a path tells git not to
 122        attempt any end-of-line conversion upon checkin or checkout.
 123
 124Set to string value "auto"::
 125
 126        When `text` is set to "auto", the path is marked for automatic
 127        end-of-line normalization.  If git decides that the content is
 128        text, its line endings are normalized to LF on checkin.
 129
 130Unspecified::
 131
 132        If the `text` attribute is unspecified, git uses the
 133        `core.autocrlf` configuration variable to determine if the
 134        file should be converted.
 135
 136Any other value causes git to act as if `text` has been left
 137unspecified.
 138
 139`eol`
 140^^^^^
 141
 142This attribute sets a specific line-ending style to be used in the
 143working directory.  It enables end-of-line normalization without any
 144content checks, effectively setting the `text` attribute.
 145
 146Set to string value "crlf"::
 147
 148        This setting forces git to normalize line endings for this
 149        file on checkin and convert them to CRLF when the file is
 150        checked out.
 151
 152Set to string value "lf"::
 153
 154        This setting forces git to normalize line endings to LF on
 155        checkin and prevents conversion to CRLF when the file is
 156        checked out.
 157
 158Backwards compatibility with `crlf` attribute
 159^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 160
 161For backwards compatibility, the `crlf` attribute is interpreted as
 162follows:
 163
 164------------------------
 165crlf            text
 166-crlf           -text
 167crlf=input      eol=lf
 168------------------------
 169
 170End-of-line conversion
 171^^^^^^^^^^^^^^^^^^^^^^
 172
 173While git normally leaves file contents alone, it can be configured to
 174normalize line endings to LF in the repository and, optionally, to
 175convert them to CRLF when files are checked out.
 176
 177Here is an example that will make git normalize .txt, .vcproj and .sh
 178files, ensure that .vcproj files have CRLF and .sh files have LF in
 179the working directory, and prevent .jpg files from being normalized
 180regardless of their content.
 181
 182------------------------
 183*.txt           text
 184*.vcproj        eol=crlf
 185*.sh            eol=lf
 186*.jpg           -text
 187------------------------
 188
 189Other source code management systems normalize all text files in their
 190repositories, and there are two ways to enable similar automatic
 191normalization in git.
 192
 193If you simply want to have CRLF line endings in your working directory
 194regardless of the repository you are working with, you can set the
 195config variable "core.autocrlf" without changing any attributes.
 196
 197------------------------
 198[core]
 199        autocrlf = true
 200------------------------
 201
 202This does not force normalization of all text files, but does ensure
 203that text files that you introduce to the repository have their line
 204endings normalized to LF when they are added, and that files that are
 205already normalized in the repository stay normalized.
 206
 207If you want to interoperate with a source code management system that
 208enforces end-of-line normalization, or you simply want all text files
 209in your repository to be normalized, you should instead set the `text`
 210attribute to "auto" for _all_ files.
 211
 212------------------------
 213*       text=auto
 214------------------------
 215
 216This ensures that all files that git considers to be text will have
 217normalized (LF) line endings in the repository.  The `core.eol`
 218configuration variable controls which line endings git will use for
 219normalized files in your working directory; the default is to use the
 220native line ending for your platform, or CRLF if `core.autocrlf` is
 221set.
 222
 223NOTE: When `text=auto` normalization is enabled in an existing
 224repository, any text files containing CRLFs should be normalized.  If
 225they are not they will be normalized the next time someone tries to
 226change them, causing unfortunate misattribution.  From a clean working
 227directory:
 228
 229-------------------------------------------------
 230$ echo "* text=auto" >>.gitattributes
 231$ rm .git/index     # Remove the index to force git to
 232$ git reset         # re-scan the working directory
 233$ git status        # Show files that will be normalized
 234$ git add -u
 235$ git add .gitattributes
 236$ git commit -m "Introduce end-of-line normalization"
 237-------------------------------------------------
 238
 239If any files that should not be normalized show up in 'git status',
 240unset their `text` attribute before running 'git add -u'.
 241
 242------------------------
 243manual.pdf      -text
 244------------------------
 245
 246Conversely, text files that git does not detect can have normalization
 247enabled manually.
 248
 249------------------------
 250weirdchars.txt  text
 251------------------------
 252
 253If `core.safecrlf` is set to "true" or "warn", git verifies if
 254the conversion is reversible for the current setting of
 255`core.autocrlf`.  For "true", git rejects irreversible
 256conversions; for "warn", git only prints a warning but accepts
 257an irreversible conversion.  The safety triggers to prevent such
 258a conversion done to the files in the work tree, but there are a
 259few exceptions.  Even though...
 260
 261- 'git add' itself does not touch the files in the work tree, the
 262  next checkout would, so the safety triggers;
 263
 264- 'git apply' to update a text file with a patch does touch the files
 265  in the work tree, but the operation is about text files and CRLF
 266  conversion is about fixing the line ending inconsistencies, so the
 267  safety does not trigger;
 268
 269- 'git diff' itself does not touch the files in the work tree, it is
 270  often run to inspect the changes you intend to next 'git add'.  To
 271  catch potential problems early, safety triggers.
 272
 273
 274`ident`
 275^^^^^^^
 276
 277When the attribute `ident` is set for a path, git replaces
 278`$Id$` in the blob object with `$Id:`, followed by the
 27940-character hexadecimal blob object name, followed by a dollar
 280sign `$` upon checkout.  Any byte sequence that begins with
 281`$Id:` and ends with `$` in the worktree file is replaced
 282with `$Id$` upon check-in.
 283
 284
 285`filter`
 286^^^^^^^^
 287
 288A `filter` attribute can be set to a string value that names a
 289filter driver specified in the configuration.
 290
 291A filter driver consists of a `clean` command and a `smudge`
 292command, either of which can be left unspecified.  Upon
 293checkout, when the `smudge` command is specified, the command is
 294fed the blob object from its standard input, and its standard
 295output is used to update the worktree file.  Similarly, the
 296`clean` command is used to convert the contents of worktree file
 297upon checkin.
 298
 299One use of the content filtering is to massage the content into a shape
 300that is more convenient for the platform, filesystem, and the user to use.
 301For this mode of operation, the key phrase here is "more convenient" and
 302not "turning something unusable into usable".  In other words, the intent
 303is that if someone unsets the filter driver definition, or does not have
 304the appropriate filter program, the project should still be usable.
 305
 306Another use of the content filtering is to store the content that cannot
 307be directly used in the repository (e.g. a UUID that refers to the true
 308content stored outside git, or an encrypted content) and turn it into a
 309usable form upon checkout (e.g. download the external content, or decrypt
 310the encrypted content).
 311
 312These two filters behave differently, and by default, a filter is taken as
 313the former, massaging the contents into more convenient shape.  A missing
 314filter driver definition in the config, or a filter driver that exits with
 315a non-zero status, is not an error but makes the filter a no-op passthru.
 316
 317You can declare that a filter turns a content that by itself is unusable
 318into a usable content by setting the filter.<driver>.required configuration
 319variable to `true`.
 320
 321For example, in .gitattributes, you would assign the `filter`
 322attribute for paths.
 323
 324------------------------
 325*.c     filter=indent
 326------------------------
 327
 328Then you would define a "filter.indent.clean" and "filter.indent.smudge"
 329configuration in your .git/config to specify a pair of commands to
 330modify the contents of C programs when the source files are checked
 331in ("clean" is run) and checked out (no change is made because the
 332command is "cat").
 333
 334------------------------
 335[filter "indent"]
 336        clean = indent
 337        smudge = cat
 338------------------------
 339
 340For best results, `clean` should not alter its output further if it is
 341run twice ("clean->clean" should be equivalent to "clean"), and
 342multiple `smudge` commands should not alter `clean`'s output
 343("smudge->smudge->clean" should be equivalent to "clean").  See the
 344section on merging below.
 345
 346The "indent" filter is well-behaved in this regard: it will not modify
 347input that is already correctly indented.  In this case, the lack of a
 348smudge filter means that the clean filter _must_ accept its own output
 349without modifying it.
 350
 351If a filter _must_ succeed in order to make the stored contents usable,
 352you can declare that the filter is `required`, in the configuration:
 353
 354------------------------
 355[filter "crypt"]
 356        clean = openssl enc ...
 357        smudge = openssl enc -d ...
 358        required
 359------------------------
 360
 361Sequence "%f" on the filter command line is replaced with the name of
 362the file the filter is working on.  A filter might use this in keyword
 363substitution.  For example:
 364
 365------------------------
 366[filter "p4"]
 367        clean = git-p4-filter --clean %f
 368        smudge = git-p4-filter --smudge %f
 369------------------------
 370
 371
 372Interaction between checkin/checkout attributes
 373^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 374
 375In the check-in codepath, the worktree file is first converted
 376with `filter` driver (if specified and corresponding driver
 377defined), then the result is processed with `ident` (if
 378specified), and then finally with `text` (again, if specified
 379and applicable).
 380
 381In the check-out codepath, the blob content is first converted
 382with `text`, and then `ident` and fed to `filter`.
 383
 384
 385Merging branches with differing checkin/checkout attributes
 386^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 387
 388If you have added attributes to a file that cause the canonical
 389repository format for that file to change, such as adding a
 390clean/smudge filter or text/eol/ident attributes, merging anything
 391where the attribute is not in place would normally cause merge
 392conflicts.
 393
 394To prevent these unnecessary merge conflicts, git can be told to run a
 395virtual check-out and check-in of all three stages of a file when
 396resolving a three-way merge by setting the `merge.renormalize`
 397configuration variable.  This prevents changes caused by check-in
 398conversion from causing spurious merge conflicts when a converted file
 399is merged with an unconverted file.
 400
 401As long as a "smudge->clean" results in the same output as a "clean"
 402even on files that are already smudged, this strategy will
 403automatically resolve all filter-related conflicts.  Filters that do
 404not act in this way may cause additional merge conflicts that must be
 405resolved manually.
 406
 407
 408Generating diff text
 409~~~~~~~~~~~~~~~~~~~~
 410
 411`diff`
 412^^^^^^
 413
 414The attribute `diff` affects how 'git' generates diffs for particular
 415files. It can tell git whether to generate a textual patch for the path
 416or to treat the path as a binary file.  It can also affect what line is
 417shown on the hunk header `@@ -k,l +n,m @@` line, tell git to use an
 418external command to generate the diff, or ask git to convert binary
 419files to a text format before generating the diff.
 420
 421Set::
 422
 423        A path to which the `diff` attribute is set is treated
 424        as text, even when they contain byte values that
 425        normally never appear in text files, such as NUL.
 426
 427Unset::
 428
 429        A path to which the `diff` attribute is unset will
 430        generate `Binary files differ` (or a binary patch, if
 431        binary patches are enabled).
 432
 433Unspecified::
 434
 435        A path to which the `diff` attribute is unspecified
 436        first gets its contents inspected, and if it looks like
 437        text, it is treated as text.  Otherwise it would
 438        generate `Binary files differ`.
 439
 440String::
 441
 442        Diff is shown using the specified diff driver.  Each driver may
 443        specify one or more options, as described in the following
 444        section. The options for the diff driver "foo" are defined
 445        by the configuration variables in the "diff.foo" section of the
 446        git config file.
 447
 448
 449Defining an external diff driver
 450^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 451
 452The definition of a diff driver is done in `gitconfig`, not
 453`gitattributes` file, so strictly speaking this manual page is a
 454wrong place to talk about it.  However...
 455
 456To define an external diff driver `jcdiff`, add a section to your
 457`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
 458
 459----------------------------------------------------------------
 460[diff "jcdiff"]
 461        command = j-c-diff
 462----------------------------------------------------------------
 463
 464When git needs to show you a diff for the path with `diff`
 465attribute set to `jcdiff`, it calls the command you specified
 466with the above configuration, i.e. `j-c-diff`, with 7
 467parameters, just like `GIT_EXTERNAL_DIFF` program is called.
 468See linkgit:git[1] for details.
 469
 470
 471Defining a custom hunk-header
 472^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 473
 474Each group of changes (called a "hunk") in the textual diff output
 475is prefixed with a line of the form:
 476
 477        @@ -k,l +n,m @@ TEXT
 478
 479This is called a 'hunk header'.  The "TEXT" portion is by default a line
 480that begins with an alphabet, an underscore or a dollar sign; this
 481matches what GNU 'diff -p' output uses.  This default selection however
 482is not suited for some contents, and you can use a customized pattern
 483to make a selection.
 484
 485First, in .gitattributes, you would assign the `diff` attribute
 486for paths.
 487
 488------------------------
 489*.tex   diff=tex
 490------------------------
 491
 492Then, you would define a "diff.tex.xfuncname" configuration to
 493specify a regular expression that matches a line that you would
 494want to appear as the hunk header "TEXT". Add a section to your
 495`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
 496
 497------------------------
 498[diff "tex"]
 499        xfuncname = "^(\\\\(sub)*section\\{.*)$"
 500------------------------
 501
 502Note.  A single level of backslashes are eaten by the
 503configuration file parser, so you would need to double the
 504backslashes; the pattern above picks a line that begins with a
 505backslash, and zero or more occurrences of `sub` followed by
 506`section` followed by open brace, to the end of line.
 507
 508There are a few built-in patterns to make this easier, and `tex`
 509is one of them, so you do not have to write the above in your
 510configuration file (you still need to enable this with the
 511attribute mechanism, via `.gitattributes`).  The following built in
 512patterns are available:
 513
 514- `bibtex` suitable for files with BibTeX coded references.
 515
 516- `cpp` suitable for source code in the C and C++ languages.
 517
 518- `csharp` suitable for source code in the C# language.
 519
 520- `fortran` suitable for source code in the Fortran language.
 521
 522- `html` suitable for HTML/XHTML documents.
 523
 524- `java` suitable for source code in the Java language.
 525
 526- `matlab` suitable for source code in the MATLAB language.
 527
 528- `objc` suitable for source code in the Objective-C language.
 529
 530- `pascal` suitable for source code in the Pascal/Delphi language.
 531
 532- `perl` suitable for source code in the Perl language.
 533
 534- `php` suitable for source code in the PHP language.
 535
 536- `python` suitable for source code in the Python language.
 537
 538- `ruby` suitable for source code in the Ruby language.
 539
 540- `tex` suitable for source code for LaTeX documents.
 541
 542
 543Customizing word diff
 544^^^^^^^^^^^^^^^^^^^^^
 545
 546You can customize the rules that `git diff --word-diff` uses to
 547split words in a line, by specifying an appropriate regular expression
 548in the "diff.*.wordRegex" configuration variable.  For example, in TeX
 549a backslash followed by a sequence of letters forms a command, but
 550several such commands can be run together without intervening
 551whitespace.  To separate them, use a regular expression in your
 552`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
 553
 554------------------------
 555[diff "tex"]
 556        wordRegex = "\\\\[a-zA-Z]+|[{}]|\\\\.|[^\\{}[:space:]]+"
 557------------------------
 558
 559A built-in pattern is provided for all languages listed in the
 560previous section.
 561
 562
 563Performing text diffs of binary files
 564^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 565
 566Sometimes it is desirable to see the diff of a text-converted
 567version of some binary files. For example, a word processor
 568document can be converted to an ASCII text representation, and
 569the diff of the text shown. Even though this conversion loses
 570some information, the resulting diff is useful for human
 571viewing (but cannot be applied directly).
 572
 573The `textconv` config option is used to define a program for
 574performing such a conversion. The program should take a single
 575argument, the name of a file to convert, and produce the
 576resulting text on stdout.
 577
 578For example, to show the diff of the exif information of a
 579file instead of the binary information (assuming you have the
 580exif tool installed), add the following section to your
 581`$GIT_DIR/config` file (or `$HOME/.gitconfig` file):
 582
 583------------------------
 584[diff "jpg"]
 585        textconv = exif
 586------------------------
 587
 588NOTE: The text conversion is generally a one-way conversion;
 589in this example, we lose the actual image contents and focus
 590just on the text data. This means that diffs generated by
 591textconv are _not_ suitable for applying. For this reason,
 592only `git diff` and the `git log` family of commands (i.e.,
 593log, whatchanged, show) will perform text conversion. `git
 594format-patch` will never generate this output. If you want to
 595send somebody a text-converted diff of a binary file (e.g.,
 596because it quickly conveys the changes you have made), you
 597should generate it separately and send it as a comment _in
 598addition to_ the usual binary diff that you might send.
 599
 600Because text conversion can be slow, especially when doing a
 601large number of them with `git log -p`, git provides a mechanism
 602to cache the output and use it in future diffs.  To enable
 603caching, set the "cachetextconv" variable in your diff driver's
 604config. For example:
 605
 606------------------------
 607[diff "jpg"]
 608        textconv = exif
 609        cachetextconv = true
 610------------------------
 611
 612This will cache the result of running "exif" on each blob
 613indefinitely. If you change the textconv config variable for a
 614diff driver, git will automatically invalidate the cache entries
 615and re-run the textconv filter. If you want to invalidate the
 616cache manually (e.g., because your version of "exif" was updated
 617and now produces better output), you can remove the cache
 618manually with `git update-ref -d refs/notes/textconv/jpg` (where
 619"jpg" is the name of the diff driver, as in the example above).
 620
 621Choosing textconv versus external diff
 622^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 623
 624If you want to show differences between binary or specially-formatted
 625blobs in your repository, you can choose to use either an external diff
 626command, or to use textconv to convert them to a diff-able text format.
 627Which method you choose depends on your exact situation.
 628
 629The advantage of using an external diff command is flexibility. You are
 630not bound to find line-oriented changes, nor is it necessary for the
 631output to resemble unified diff. You are free to locate and report
 632changes in the most appropriate way for your data format.
 633
 634A textconv, by comparison, is much more limiting. You provide a
 635transformation of the data into a line-oriented text format, and git
 636uses its regular diff tools to generate the output. There are several
 637advantages to choosing this method:
 638
 6391. Ease of use. It is often much simpler to write a binary to text
 640   transformation than it is to perform your own diff. In many cases,
 641   existing programs can be used as textconv filters (e.g., exif,
 642   odt2txt).
 643
 6442. Git diff features. By performing only the transformation step
 645   yourself, you can still utilize many of git's diff features,
 646   including colorization, word-diff, and combined diffs for merges.
 647
 6483. Caching. Textconv caching can speed up repeated diffs, such as those
 649   you might trigger by running `git log -p`.
 650
 651
 652Marking files as binary
 653^^^^^^^^^^^^^^^^^^^^^^^
 654
 655Git usually guesses correctly whether a blob contains text or binary
 656data by examining the beginning of the contents. However, sometimes you
 657may want to override its decision, either because a blob contains binary
 658data later in the file, or because the content, while technically
 659composed of text characters, is opaque to a human reader. For example,
 660many postscript files contain only ascii characters, but produce noisy
 661and meaningless diffs.
 662
 663The simplest way to mark a file as binary is to unset the diff
 664attribute in the `.gitattributes` file:
 665
 666------------------------
 667*.ps -diff
 668------------------------
 669
 670This will cause git to generate `Binary files differ` (or a binary
 671patch, if binary patches are enabled) instead of a regular diff.
 672
 673However, one may also want to specify other diff driver attributes. For
 674example, you might want to use `textconv` to convert postscript files to
 675an ascii representation for human viewing, but otherwise treat them as
 676binary files. You cannot specify both `-diff` and `diff=ps` attributes.
 677The solution is to use the `diff.*.binary` config option:
 678
 679------------------------
 680[diff "ps"]
 681  textconv = ps2ascii
 682  binary = true
 683------------------------
 684
 685Performing a three-way merge
 686~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 687
 688`merge`
 689^^^^^^^
 690
 691The attribute `merge` affects how three versions of a file are
 692merged when a file-level merge is necessary during `git merge`,
 693and other commands such as `git revert` and `git cherry-pick`.
 694
 695Set::
 696
 697        Built-in 3-way merge driver is used to merge the
 698        contents in a way similar to 'merge' command of `RCS`
 699        suite.  This is suitable for ordinary text files.
 700
 701Unset::
 702
 703        Take the version from the current branch as the
 704        tentative merge result, and declare that the merge has
 705        conflicts.  This is suitable for binary files that do
 706        not have a well-defined merge semantics.
 707
 708Unspecified::
 709
 710        By default, this uses the same built-in 3-way merge
 711        driver as is the case when the `merge` attribute is set.
 712        However, the `merge.default` configuration variable can name
 713        different merge driver to be used with paths for which the
 714        `merge` attribute is unspecified.
 715
 716String::
 717
 718        3-way merge is performed using the specified custom
 719        merge driver.  The built-in 3-way merge driver can be
 720        explicitly specified by asking for "text" driver; the
 721        built-in "take the current branch" driver can be
 722        requested with "binary".
 723
 724
 725Built-in merge drivers
 726^^^^^^^^^^^^^^^^^^^^^^
 727
 728There are a few built-in low-level merge drivers defined that
 729can be asked for via the `merge` attribute.
 730
 731text::
 732
 733        Usual 3-way file level merge for text files.  Conflicted
 734        regions are marked with conflict markers `<<<<<<<`,
 735        `=======` and `>>>>>>>`.  The version from your branch
 736        appears before the `=======` marker, and the version
 737        from the merged branch appears after the `=======`
 738        marker.
 739
 740binary::
 741
 742        Keep the version from your branch in the work tree, but
 743        leave the path in the conflicted state for the user to
 744        sort out.
 745
 746union::
 747
 748        Run 3-way file level merge for text files, but take
 749        lines from both versions, instead of leaving conflict
 750        markers.  This tends to leave the added lines in the
 751        resulting file in random order and the user should
 752        verify the result. Do not use this if you do not
 753        understand the implications.
 754
 755
 756Defining a custom merge driver
 757^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 758
 759The definition of a merge driver is done in the `.git/config`
 760file, not in the `gitattributes` file, so strictly speaking this
 761manual page is a wrong place to talk about it.  However...
 762
 763To define a custom merge driver `filfre`, add a section to your
 764`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
 765
 766----------------------------------------------------------------
 767[merge "filfre"]
 768        name = feel-free merge driver
 769        driver = filfre %O %A %B
 770        recursive = binary
 771----------------------------------------------------------------
 772
 773The `merge.*.name` variable gives the driver a human-readable
 774name.
 775
 776The `merge.*.driver` variable's value is used to construct a
 777command to run to merge ancestor's version (`%O`), current
 778version (`%A`) and the other branches' version (`%B`).  These
 779three tokens are replaced with the names of temporary files that
 780hold the contents of these versions when the command line is
 781built. Additionally, %L will be replaced with the conflict marker
 782size (see below).
 783
 784The merge driver is expected to leave the result of the merge in
 785the file named with `%A` by overwriting it, and exit with zero
 786status if it managed to merge them cleanly, or non-zero if there
 787were conflicts.
 788
 789The `merge.*.recursive` variable specifies what other merge
 790driver to use when the merge driver is called for an internal
 791merge between common ancestors, when there are more than one.
 792When left unspecified, the driver itself is used for both
 793internal merge and the final merge.
 794
 795
 796`conflict-marker-size`
 797^^^^^^^^^^^^^^^^^^^^^^
 798
 799This attribute controls the length of conflict markers left in
 800the work tree file during a conflicted merge.  Only setting to
 801the value to a positive integer has any meaningful effect.
 802
 803For example, this line in `.gitattributes` can be used to tell the merge
 804machinery to leave much longer (instead of the usual 7-character-long)
 805conflict markers when merging the file `Documentation/git-merge.txt`
 806results in a conflict.
 807
 808------------------------
 809Documentation/git-merge.txt     conflict-marker-size=32
 810------------------------
 811
 812
 813Checking whitespace errors
 814~~~~~~~~~~~~~~~~~~~~~~~~~~
 815
 816`whitespace`
 817^^^^^^^^^^^^
 818
 819The `core.whitespace` configuration variable allows you to define what
 820'diff' and 'apply' should consider whitespace errors for all paths in
 821the project (See linkgit:git-config[1]).  This attribute gives you finer
 822control per path.
 823
 824Set::
 825
 826        Notice all types of potential whitespace errors known to git.
 827        The tab width is taken from the value of the `core.whitespace`
 828        configuration variable.
 829
 830Unset::
 831
 832        Do not notice anything as error.
 833
 834Unspecified::
 835
 836        Use the value of the `core.whitespace` configuration variable to
 837        decide what to notice as error.
 838
 839String::
 840
 841        Specify a comma separate list of common whitespace problems to
 842        notice in the same format as the `core.whitespace` configuration
 843        variable.
 844
 845
 846Creating an archive
 847~~~~~~~~~~~~~~~~~~~
 848
 849`export-ignore`
 850^^^^^^^^^^^^^^^
 851
 852Files and directories with the attribute `export-ignore` won't be added to
 853archive files.
 854
 855`export-subst`
 856^^^^^^^^^^^^^^
 857
 858If the attribute `export-subst` is set for a file then git will expand
 859several placeholders when adding this file to an archive.  The
 860expansion depends on the availability of a commit ID, i.e., if
 861linkgit:git-archive[1] has been given a tree instead of a commit or a
 862tag then no replacement will be done.  The placeholders are the same
 863as those for the option `--pretty=format:` of linkgit:git-log[1],
 864except that they need to be wrapped like this: `$Format:PLACEHOLDERS$`
 865in the file.  E.g. the string `$Format:%H$` will be replaced by the
 866commit hash.
 867
 868
 869Packing objects
 870~~~~~~~~~~~~~~~
 871
 872`delta`
 873^^^^^^^
 874
 875Delta compression will not be attempted for blobs for paths with the
 876attribute `delta` set to false.
 877
 878
 879Viewing files in GUI tools
 880~~~~~~~~~~~~~~~~~~~~~~~~~~
 881
 882`encoding`
 883^^^^^^^^^^
 884
 885The value of this attribute specifies the character encoding that should
 886be used by GUI tools (e.g. linkgit:gitk[1] and linkgit:git-gui[1]) to
 887display the contents of the relevant file. Note that due to performance
 888considerations linkgit:gitk[1] does not use this attribute unless you
 889manually enable per-file encodings in its options.
 890
 891If this attribute is not set or has an invalid value, the value of the
 892`gui.encoding` configuration variable is used instead
 893(See linkgit:git-config[1]).
 894
 895
 896USING MACRO ATTRIBUTES
 897----------------------
 898
 899You do not want any end-of-line conversions applied to, nor textual diffs
 900produced for, any binary file you track.  You would need to specify e.g.
 901
 902------------
 903*.jpg -text -diff
 904------------
 905
 906but that may become cumbersome, when you have many attributes.  Using
 907macro attributes, you can define an attribute that, when set, also
 908sets or unsets a number of other attributes at the same time.  The
 909system knows a built-in macro attribute, `binary`:
 910
 911------------
 912*.jpg binary
 913------------
 914
 915Setting the "binary" attribute also unsets the "text" and "diff"
 916attributes as above.  Note that macro attributes can only be "Set",
 917though setting one might have the effect of setting or unsetting other
 918attributes or even returning other attributes to the "Unspecified"
 919state.
 920
 921
 922DEFINING MACRO ATTRIBUTES
 923-------------------------
 924
 925Custom macro attributes can be defined only in the `.gitattributes`
 926file at the toplevel (i.e. not in any subdirectory).  The built-in
 927macro attribute "binary" is equivalent to:
 928
 929------------
 930[attr]binary -diff -text
 931------------
 932
 933
 934EXAMPLE
 935-------
 936
 937If you have these three `gitattributes` file:
 938
 939----------------------------------------------------------------
 940(in $GIT_DIR/info/attributes)
 941
 942a*      foo !bar -baz
 943
 944(in .gitattributes)
 945abc     foo bar baz
 946
 947(in t/.gitattributes)
 948ab*     merge=filfre
 949abc     -foo -bar
 950*.c     frotz
 951----------------------------------------------------------------
 952
 953the attributes given to path `t/abc` are computed as follows:
 954
 9551. By examining `t/.gitattributes` (which is in the same
 956   directory as the path in question), git finds that the first
 957   line matches.  `merge` attribute is set.  It also finds that
 958   the second line matches, and attributes `foo` and `bar`
 959   are unset.
 960
 9612. Then it examines `.gitattributes` (which is in the parent
 962   directory), and finds that the first line matches, but
 963   `t/.gitattributes` file already decided how `merge`, `foo`
 964   and `bar` attributes should be given to this path, so it
 965   leaves `foo` and `bar` unset.  Attribute `baz` is set.
 966
 9673. Finally it examines `$GIT_DIR/info/attributes`.  This file
 968   is used to override the in-tree settings.  The first line is
 969   a match, and `foo` is set, `bar` is reverted to unspecified
 970   state, and `baz` is unset.
 971
 972As the result, the attributes assignment to `t/abc` becomes:
 973
 974----------------------------------------------------------------
 975foo     set to true
 976bar     unspecified
 977baz     set to false
 978merge   set to string value "filfre"
 979frotz   unspecified
 980----------------------------------------------------------------
 981
 982
 983SEE ALSO
 984--------
 985linkgit:git-check-attr[1].
 986
 987GIT
 988---
 989Part of the linkgit:git[1] suite