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