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