]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/gitattributes.txt
Merge branch 'maint' of git://github.com/git-l10n/git-po into maint
[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]).
684e40f6
HKNN
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.
6df42ab9
PO
80Attributes for all users on a system should be placed in the
81`$(prefix)/etc/gitattributes` file.
90b22907 82
88e7fdf2 83Sometimes you would need to override an setting of an attribute
0922570c 84for a path to `Unspecified` state. This can be done by listing
88e7fdf2
JH
85the name of the attribute prefixed with an exclamation point `!`.
86
87
88EFFECTS
89-------
90
91Certain operations by git can be influenced by assigning
ae7aa499
JH
92particular attributes to a path. Currently, the following
93operations are attributes-aware.
88e7fdf2
JH
94
95Checking-out and checking-in
96~~~~~~~~~~~~~~~~~~~~~~~~~~~~
97
3fed15f5 98These attributes affect how the contents stored in the
88e7fdf2 99repository are copied to the working tree files when commands
0b444cdb 100such as 'git checkout' and 'git merge' run. They also affect how
88e7fdf2 101git stores the contents you prepare in the working tree in the
0b444cdb 102repository upon 'git add' and 'git commit'.
88e7fdf2 103
5ec3e670 104`text`
3fed15f5
JH
105^^^^^^
106
fd6cce9e
EB
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
942e7747 111`core.eol` configuration variable for all text files.
3fed15f5 112
88e7fdf2
JH
113Set::
114
5ec3e670 115 Setting the `text` attribute on a path enables end-of-line
fd6cce9e
EB
116 normalization and marks the path as a text file. End-of-line
117 conversion takes place without guessing the content type.
88e7fdf2
JH
118
119Unset::
120
5ec3e670 121 Unsetting the `text` attribute on a path tells git not to
bbb896d8 122 attempt any end-of-line conversion upon checkin or checkout.
88e7fdf2 123
fd6cce9e 124Set to string value "auto"::
88e7fdf2 125
5ec3e670 126 When `text` is set to "auto", the path is marked for automatic
fd6cce9e
EB
127 end-of-line normalization. If git decides that the content is
128 text, its line endings are normalized to LF on checkin.
88e7fdf2 129
88e7fdf2
JH
130Unspecified::
131
942e7747
EB
132 If the `text` attribute is unspecified, git uses the
133 `core.autocrlf` configuration variable to determine if the
134 file should be converted.
88e7fdf2 135
5ec3e670 136Any other value causes git to act as if `text` has been left
fd6cce9e 137unspecified.
88e7fdf2 138
fd6cce9e
EB
139`eol`
140^^^^^
88e7fdf2 141
fd6cce9e
EB
142This attribute sets a specific line-ending style to be used in the
143working directory. It enables end-of-line normalization without any
942e7747 144content checks, effectively setting the `text` attribute.
88e7fdf2 145
fd6cce9e 146Set to string value "crlf"::
88e7fdf2 147
942e7747
EB
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.
fd6cce9e
EB
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
942e7747 156 checked out.
5ec3e670
EB
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------------------------
fd6cce9e
EB
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------------------------
5ec3e670 183*.txt text
fd6cce9e
EB
184*.vcproj eol=crlf
185*.sh eol=lf
5ec3e670 186*.jpg -text
fd6cce9e
EB
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
942e7747 205already normalized in the repository stay normalized.
fd6cce9e
EB
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
5ec3e670 209in your repository to be normalized, you should instead set the `text`
fd6cce9e 210attribute to "auto" for _all_ files.
88e7fdf2 211
fd6cce9e 212------------------------
5ec3e670 213* text=auto
fd6cce9e
EB
214------------------------
215
216This ensures that all files that git considers to be text will have
942e7747
EB
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.
fd6cce9e 222
5ec3e670 223NOTE: When `text=auto` normalization is enabled in an existing
fd6cce9e
EB
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-------------------------------------------------
5ec3e670 230$ echo "* text=auto" >>.gitattributes
fd6cce9e
EB
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',
5ec3e670 240unset their `text` attribute before running 'git add -u'.
fd6cce9e
EB
241
242------------------------
5ec3e670 243manual.pdf -text
fd6cce9e 244------------------------
88e7fdf2 245
fd6cce9e
EB
246Conversely, text files that git does not detect can have normalization
247enabled manually.
88e7fdf2 248
fd6cce9e 249------------------------
5ec3e670 250weirdchars.txt text
fd6cce9e 251------------------------
88e7fdf2 252
21e5ad50
SP
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
0b444cdb 261- 'git add' itself does not touch the files in the work tree, the
21e5ad50
SP
262 next checkout would, so the safety triggers;
263
0b444cdb 264- 'git apply' to update a text file with a patch does touch the files
21e5ad50
SP
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
0b444cdb
TR
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
21e5ad50
SP
271 catch potential problems early, safety triggers.
272
88e7fdf2 273
3fed15f5
JH
274`ident`
275^^^^^^^
276
2c850f12
JK
277When the attribute `ident` is set for a path, git replaces
278`$Id$` in the blob object with `$Id:`, followed by the
3fed15f5
JH
27940-character hexadecimal blob object name, followed by a dollar
280sign `$` upon checkout. Any byte sequence that begins with
af9b54bb
AP
281`$Id:` and ends with `$` in the worktree file is replaced
282with `$Id$` upon check-in.
3fed15f5
JH
283
284
aa4ed402
JH
285`filter`
286^^^^^^^^
287
c05ef938 288A `filter` attribute can be set to a string value that names a
aa4ed402
JH
289filter driver specified in the configuration.
290
c05ef938 291A filter driver consists of a `clean` command and a `smudge`
aa4ed402 292command, either of which can be left unspecified. Upon
c05ef938
WC
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.
aa4ed402 298
36daaaca
JB
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`.
aa4ed402 320
d79f5d17
NS
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
f217f0e8
EB
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
36daaaca
JB
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
a2b665de
PW
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
aa4ed402
JH
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
5ec3e670 378specified), and then finally with `text` (again, if specified
aa4ed402
JH
379and applicable).
380
381In the check-out codepath, the blob content is first converted
5ec3e670 382with `text`, and then `ident` and fed to `filter`.
aa4ed402
JH
383
384
f217f0e8
EB
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
88e7fdf2
JH
408Generating diff text
409~~~~~~~~~~~~~~~~~~~~
410
4f73e240
JN
411`diff`
412^^^^^^
413
678852d9
JK
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.
88e7fdf2
JH
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
678852d9
JK
430 generate `Binary files differ` (or a binary patch, if
431 binary patches are enabled).
88e7fdf2
JH
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
2cc3167c
JH
440String::
441
678852d9
JK
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.
2cc3167c
JH
447
448
678852d9
JK
449Defining an external diff driver
450^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2cc3167c
JH
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
678852d9 456To define an external diff driver `jcdiff`, add a section to your
2cc3167c
JH
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.
9e1f0a85 468See linkgit:git[1] for details.
88e7fdf2
JH
469
470
ae7aa499
JH
471Defining a custom hunk-header
472^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
473
c882c01e 474Each group of changes (called a "hunk") in the textual diff output
ae7aa499
JH
475is prefixed with a line of the form:
476
477 @@ -k,l +n,m @@ TEXT
478
c882c01e
GD
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.
ae7aa499 484
c882c01e 485First, in .gitattributes, you would assign the `diff` attribute
ae7aa499
JH
486for paths.
487
488------------------------
489*.tex diff=tex
490------------------------
491
edb7e82f 492Then, you would define a "diff.tex.xfuncname" configuration to
ae7aa499 493specify a regular expression that matches a line that you would
c4c86d23
JK
494want to appear as the hunk header "TEXT". Add a section to your
495`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
ae7aa499
JH
496
497------------------------
498[diff "tex"]
45d9414f 499 xfuncname = "^(\\\\(sub)*section\\{.*)$"
ae7aa499
JH
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
02783075 505backslash, and zero or more occurrences of `sub` followed by
ae7aa499
JH
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
d08ed6d6
GH
511attribute mechanism, via `.gitattributes`). The following built in
512patterns are available:
513
23b5beb2
GH
514- `bibtex` suitable for files with BibTeX coded references.
515
80c49c3d
TR
516- `cpp` suitable for source code in the C and C++ languages.
517
b221207d
PO
518- `csharp` suitable for source code in the C# language.
519
909a5494
BC
520- `fortran` suitable for source code in the Fortran language.
521
af9ce1ff
AE
522- `html` suitable for HTML/XHTML documents.
523
b66e00f1 524- `java` suitable for source code in the Java language.
d08ed6d6 525
53b10a14
GH
526- `matlab` suitable for source code in the MATLAB language.
527
5d1e958e
JS
528- `objc` suitable for source code in the Objective-C language.
529
d08ed6d6
GH
530- `pascal` suitable for source code in the Pascal/Delphi language.
531
71a5d4bc
JN
532- `perl` suitable for source code in the Perl language.
533
af9ce1ff
AE
534- `php` suitable for source code in the PHP language.
535
7c17205b
KS
536- `python` suitable for source code in the Python language.
537
d08ed6d6
GH
538- `ruby` suitable for source code in the Ruby language.
539
540- `tex` suitable for source code for LaTeX documents.
ae7aa499
JH
541
542
80c49c3d
TR
543Customizing word diff
544^^^^^^^^^^^^^^^^^^^^^
545
882749a0 546You can customize the rules that `git diff --word-diff` uses to
80c49c3d 547split words in a line, by specifying an appropriate regular expression
ae3b970a 548in the "diff.*.wordRegex" configuration variable. For example, in TeX
80c49c3d
TR
549a backslash followed by a sequence of letters forms a command, but
550several such commands can be run together without intervening
c4c86d23
JK
551whitespace. To separate them, use a regular expression in your
552`$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
80c49c3d
TR
553
554------------------------
555[diff "tex"]
ae3b970a 556 wordRegex = "\\\\[a-zA-Z]+|[{}]|\\\\.|[^\\{}[:space:]]+"
80c49c3d
TR
557------------------------
558
559A built-in pattern is provided for all languages listed in the
560previous section.
561
562
678852d9
JK
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
c4c86d23
JK
580exif tool installed), add the following section to your
581`$GIT_DIR/config` file (or `$HOME/.gitconfig` file):
678852d9
JK
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
d9bae1a1
JK
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).
678852d9 620
55601c6a
JK
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
ab435611
JK
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
88e7fdf2
JH
685Performing a three-way merge
686~~~~~~~~~~~~~~~~~~~~~~~~~~~~
687
4f73e240
JN
688`merge`
689^^^^^^^
690
b547ce0b 691The attribute `merge` affects how three versions of a file are
88e7fdf2 692merged when a file-level merge is necessary during `git merge`,
57f6ec02 693and other commands such as `git revert` and `git cherry-pick`.
88e7fdf2
JH
694
695Set::
696
697 Built-in 3-way merge driver is used to merge the
2fd02c92 698 contents in a way similar to 'merge' command of `RCS`
88e7fdf2
JH
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
b547ce0b 705 conflicts. This is suitable for binary files that do
88e7fdf2
JH
706 not have a well-defined merge semantics.
707
708Unspecified::
709
710 By default, this uses the same built-in 3-way merge
b547ce0b
AS
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
88e7fdf2
JH
714 `merge` attribute is unspecified.
715
2cc3167c 716String::
88e7fdf2
JH
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
b9d14ffb 722 requested with "binary".
88e7fdf2
JH
723
724
0e545f75
JH
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
88e7fdf2
JH
756Defining a custom merge driver
757^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
758
0e545f75
JH
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...
88e7fdf2
JH
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
16758621
BW
781built. Additionally, %L will be replaced with the conflict marker
782size (see below).
88e7fdf2
JH
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
4c734803
JH
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
cf1b7869
JH
813Checking whitespace errors
814~~~~~~~~~~~~~~~~~~~~~~~~~~
815
816`whitespace`
817^^^^^^^^^^^^
818
819The `core.whitespace` configuration variable allows you to define what
2fd02c92 820'diff' and 'apply' should consider whitespace errors for all paths in
5162e697 821the project (See linkgit:git-config[1]). This attribute gives you finer
cf1b7869
JH
822control per path.
823
824Set::
825
826 Notice all types of potential whitespace errors known to git.
f4b05a49
JS
827 The tab width is taken from the value of the `core.whitespace`
828 configuration variable.
cf1b7869
JH
829
830Unset::
831
832 Do not notice anything as error.
833
834Unspecified::
835
f4b05a49 836 Use the value of the `core.whitespace` configuration variable to
cf1b7869
JH
837 decide what to notice as error.
838
839String::
840
841 Specify a comma separate list of common whitespace problems to
f4b05a49 842 notice in the same format as the `core.whitespace` configuration
cf1b7869
JH
843 variable.
844
845
8a33dd8b
JH
846Creating an archive
847~~~~~~~~~~~~~~~~~~~
848
08b51f51
JH
849`export-ignore`
850^^^^^^^^^^^^^^^
851
852Files and directories with the attribute `export-ignore` won't be added to
853archive files.
854
8a33dd8b
JH
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
08b51f51 860expansion depends on the availability of a commit ID, i.e., if
8a33dd8b
JH
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
975457f1
NG
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
a2df1fb2
AG
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
0922570c 896USING MACRO ATTRIBUTES
bbb896d8
JH
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------------
5ec3e670 903*.jpg -text -diff
bbb896d8
JH
904------------
905
906but that may become cumbersome, when you have many attributes. Using
0922570c 907macro attributes, you can define an attribute that, when set, also
98e84066 908sets or unsets a number of other attributes at the same time. The
0922570c 909system knows a built-in macro attribute, `binary`:
bbb896d8
JH
910
911------------
912*.jpg binary
913------------
914
98e84066 915Setting the "binary" attribute also unsets the "text" and "diff"
0922570c 916attributes as above. Note that macro attributes can only be "Set",
98e84066
MH
917though setting one might have the effect of setting or unsetting other
918attributes or even returning other attributes to the "Unspecified"
919state.
bbb896d8
JH
920
921
0922570c 922DEFINING MACRO ATTRIBUTES
bbb896d8
JH
923-------------------------
924
0922570c
MH
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:
bbb896d8
JH
928
929------------
5ec3e670 930[attr]binary -diff -text
bbb896d8
JH
931------------
932
933
88e7fdf2
JH
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
02783075 956 directory as the path in question), git finds that the first
88e7fdf2
JH
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
5c759f96 9673. Finally it examines `$GIT_DIR/info/attributes`. This file
88e7fdf2
JH
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
02783075 972As the result, the attributes assignment to `t/abc` becomes:
88e7fdf2
JH
973
974----------------------------------------------------------------
975foo set to true
976bar unspecified
977baz set to false
978merge set to string value "filfre"
979frotz unspecified
980----------------------------------------------------------------
981
982
cde15181
MH
983SEE ALSO
984--------
985linkgit:git-check-attr[1].
8460b2fc 986
88e7fdf2
JH
987GIT
988---
9e1f0a85 989Part of the linkgit:git[1] suite