6 gitattributes - defining attributes per path
10 $GIT_DIR/info/attributes, gitattributes
16 A `gitattributes` file is a simple text file that gives
17 `attributes` to pathnames.
19 Each line in `gitattributes` file is of form:
23 That is, a glob pattern followed by an attributes list,
24 separated by whitespaces. When the glob pattern matches the
25 path in question, the attributes listed on the line are given to
28 Each attribute can be in one of these states for a given path:
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.
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.
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
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.
55 When more than one glob pattern matches the path, a later line
56 overrides an earlier line. This overriding is done per
59 When deciding what attributes are assigned to a path, git
60 consults `$GIT_DIR/info/attributes` file (which has the highest
61 precedence), `.gitattributes` file in the same directory as the
62 path in question, and its parent directories (the further the
63 directory that contains `.gitattributes` is from the path in
64 question, the lower its precedence).
66 Sometimes you would need to override an setting of an attribute
67 for a path to `unspecified` state. This can be done by listing
68 the name of the attribute prefixed with an exclamation point `!`.
74 Certain operations by git can be influenced by assigning
75 particular attributes to a path. Currently, three operations
78 Checking-out and checking-in
79 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81 The attribute `crlf` affects how the contents stored in the
82 repository are copied to the working tree files when commands
83 such as `git checkout` and `git merge` run. It also affects how
84 git stores the contents you prepare in the working tree in the
85 repository upon `git add` and `git commit`.
89 Setting the `crlf` attribute on a path is meant to mark
90 the path as a "text" file. 'core.autocrlf' conversion
91 takes place without guessing the content type by
96 Unsetting the `crlf` attribute on a path is meant to
97 mark the path as a "binary" file. The path never goes
98 through line endings conversion upon checkin/checkout.
102 Unspecified `crlf` attribute tells git to apply the
103 `core.autocrlf` conversion when the file content looks
106 Set to string value "input"::
108 This is similar to setting the attribute to `true`, but
109 also forces git to act as if `core.autocrlf` is set to
110 `input` for the path.
112 Any other value set to `crlf` attribute is ignored and git acts
113 as if the attribute is left unspecified.
116 The `core.autocrlf` conversion
117 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
119 If the configuration variable `core.autocrlf` is false, no
122 When `core.autocrlf` is true, it means that the platform wants
123 CRLF line endings for files in the working tree, and you want to
124 convert them back to the normal LF line endings when checking
125 in to the repository.
127 When `core.autocrlf` is set to "input", line endings are
128 converted to LF upon checkin, but there is no conversion done
135 The attribute `diff` affects if `git diff` generates textual
136 patch for the path or just says `Binary files differ`.
140 A path to which the `diff` attribute is set is treated
141 as text, even when they contain byte values that
142 normally never appear in text files, such as NUL.
146 A path to which the `diff` attribute is unset will
147 generate `Binary files differ`.
151 A path to which the `diff` attribute is unspecified
152 first gets its contents inspected, and if it looks like
153 text, it is treated as text. Otherwise it would
154 generate `Binary files differ`.
158 Diff is shown using the specified custom diff driver.
159 The driver program is given its input using the same
160 calling convention as used for GIT_EXTERNAL_DIFF
164 Defining a custom diff driver
165 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
167 The definition of a diff driver is done in `gitconfig`, not
168 `gitattributes` file, so strictly speaking this manual page is a
169 wrong place to talk about it. However...
171 To define a custom diff driver `jcdiff`, add a section to your
172 `$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
174 ----------------------------------------------------------------
177 ----------------------------------------------------------------
179 When git needs to show you a diff for the path with `diff`
180 attribute set to `jcdiff`, it calls the command you specified
181 with the above configuration, i.e. `j-c-diff`, with 7
182 parameters, just like `GIT_EXTERNAL_DIFF` program is called.
183 See gitlink:git[7] for details.
186 Performing a three-way merge
187 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
189 The attribute `merge` affects how three versions of a file is
190 merged when a file-level merge is necessary during `git merge`,
191 and other programs such as `git revert` and `git cherry-pick`.
195 Built-in 3-way merge driver is used to merge the
196 contents in a way similar to `merge` command of `RCS`
197 suite. This is suitable for ordinary text files.
201 Take the version from the current branch as the
202 tentative merge result, and declare that the merge has
203 conflicts. This is suitable for binary files that does
204 not have a well-defined merge semantics.
208 By default, this uses the same built-in 3-way merge
209 driver as is the case the `merge` attribute is set.
210 However, `merge.default` configuration variable can name
211 different merge driver to be used for paths to which the
212 `merge` attribute is unspecified.
216 3-way merge is performed using the specified custom
217 merge driver. The built-in 3-way merge driver can be
218 explicitly specified by asking for "text" driver; the
219 built-in "take the current branch" driver can be
220 requested with "binary".
223 Defining a custom merge driver
224 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
226 The definition of a merge driver is done in `gitconfig` not
227 `gitattributes` file, so strictly speaking this manual page is a
228 wrong place to talk about it. However...
230 To define a custom merge driver `filfre`, add a section to your
231 `$GIT_DIR/config` file (or `$HOME/.gitconfig` file) like this:
233 ----------------------------------------------------------------
235 name = feel-free merge driver
236 driver = filfre %O %A %B
238 ----------------------------------------------------------------
240 The `merge.*.name` variable gives the driver a human-readable
243 The `merge.*.driver` variable's value is used to construct a
244 command to run to merge ancestor's version (`%O`), current
245 version (`%A`) and the other branches' version (`%B`). These
246 three tokens are replaced with the names of temporary files that
247 hold the contents of these versions when the command line is
250 The merge driver is expected to leave the result of the merge in
251 the file named with `%A` by overwriting it, and exit with zero
252 status if it managed to merge them cleanly, or non-zero if there
255 The `merge.*.recursive` variable specifies what other merge
256 driver to use when the merge driver is called for an internal
257 merge between common ancestors, when there are more than one.
258 When left unspecified, the driver itself is used for both
259 internal merge and the final merge.
265 If you have these three `gitattributes` file:
267 ----------------------------------------------------------------
268 (in $GIT_DIR/info/attributes)
275 (in t/.gitattributes)
279 ----------------------------------------------------------------
281 the attributes given to path `t/abc` are computed as follows:
283 1. By examining `t/.gitattributes` (which is in the same
284 diretory as the path in question), git finds that the first
285 line matches. `merge` attribute is set. It also finds that
286 the second line matches, and attributes `foo` and `bar`
289 2. Then it examines `.gitattributes` (which is in the parent
290 directory), and finds that the first line matches, but
291 `t/.gitattributes` file already decided how `merge`, `foo`
292 and `bar` attributes should be given to this path, so it
293 leaves `foo` and `bar` unset. Attribute `baz` is set.
295 3. Finally it examines `$GIT_DIR/info/gitattributes`. This file
296 is used to override the in-tree settings. The first line is
297 a match, and `foo` is set, `bar` is reverted to unspecified
298 state, and `baz` is unset.
300 As the result, the attributes assignement to `t/abc` becomes:
302 ----------------------------------------------------------------
306 merge set to string value "filfre"
308 ----------------------------------------------------------------
313 Part of the gitlink:git[7] suite