Skip to content

Commit

Permalink
docs: rewrite the documentation of the text and eol attributes
Browse files Browse the repository at this point in the history
These two sentences are confusing because the description of the text
attribute sounds exactly the same as the description of the text=auto
attribute:

"Setting the text attribute on a path enables end-of-line normalization"

"When text is set to "auto", the path is marked for automatic
end-of-line conversion"

Unless the reader is already familiar with the two variants, there's a
high probability that they will think that "end-of-line normalization"
is the same thing as "automatic end-of-line conversion".

It's also not clear that the phrase "When the file has been committed
with CRLF, no conversion is done" in the paragraph for text=auto does
not apply equally to the bare text attribute which is described earlier.
Moreover, it falsely implies that normalization is only suppressed if
the file has been committed. In fact, running `git add` on a CRLF file,
adding the text=auto attribute to the file, and running `git add` again
does not do anything to the line endings either.

On top of that, in several places the documentation for the eol
attribute sounds like either it does not affect normalization on checkin
or it forces normalization on checkin. It also sounds like setting eol
(or setting a config variable) is required to turn on conversion on
checkout, but the text attribute can turn on conversion on checkout by
itself if eol is unspecified.

Rephrase the documentation of text, text=auto, eol, eol=crlf, and eol=lf
to be clear about how they are the same, how they are different, and in
what cases conversion is performed.

Helped-by: Torsten Bögershausen <tboegi@web.de>
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
alexhenrie authored and gitster committed May 3, 2023
1 parent 0d1bd1d commit 6696077
Showing 1 changed file with 31 additions and 28 deletions.
59 changes: 31 additions & 28 deletions Documentation/gitattributes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -120,20 +120,19 @@ repository upon 'git add' and 'git commit'.
`text`
^^^^^^

This attribute enables and controls end-of-line normalization. When a
text file is normalized, its line endings are converted to LF in the
repository. To control what line ending style is used in the working
directory, use the `eol` attribute for a single file and the
`core.eol` configuration variable for all text files.
Note that setting `core.autocrlf` to `true` or `input` overrides
`core.eol` (see the definitions of those options in
linkgit:git-config[1]).
This attribute marks the path as a text file, which enables end-of-line
conversion: When a matching file is added to the index, the file's line
endings are normalized to LF in the index. Conversely, when the file is
copied from the index to the working directory, its line endings may be
converted from LF to CRLF depending on the `eol` attribute, the Git
config, and the platform (see explanation of `eol` below).

Set::

Setting the `text` attribute on a path enables end-of-line
normalization and marks the path as a text file. End-of-line
conversion takes place without guessing the content type.
conversion on checkin and checkout as described above. Line endings
are normalized to LF in the index every time the file is checked in,
even if the file was previously added to Git with CRLF line endings.

Unset::

Expand All @@ -142,10 +141,11 @@ Unset::

Set to string value "auto"::

When `text` is set to "auto", the path is marked for automatic
end-of-line conversion. If Git decides that the content is
text, its line endings are converted to LF on checkin.
When the file has been committed with CRLF, no conversion is done.
When `text` is set to "auto", Git decides by itself whether the file
is text or binary. If it is text and the file was not already in
Git with CRLF endings, line endings are converted on checkin and
checkout as described above. Otherwise, no conversion is done on
checkin or checkout.

Unspecified::

Expand All @@ -159,26 +159,29 @@ unspecified.
`eol`
^^^^^

This attribute sets a specific line-ending style to be used in the
working directory. This attribute has effect only if the `text`
attribute is set or unspecified, or if it is set to `auto`, the file is
detected as text, and it is stored with LF endings in the index. Note
that setting this attribute on paths which are in the index with CRLF
line endings may make the paths to be considered dirty unless
`text=auto` is set. Adding the path to the index again will normalize
the line endings in the index.
This attribute marks a path to use a specific line-ending style in the
working tree when it is checked out. It has effect only if `text` or
`text=auto` is set (see above), but specifying `eol` automatically sets
`text` if `text` was left unspecified.

Set to string value "crlf"::

This setting forces Git to normalize line endings for this
file on checkin and convert them to CRLF when the file is
checked out.
This setting converts the file's line endings in the working
directory to CRLF when the file is checked out.

Set to string value "lf"::

This setting forces Git to normalize line endings to LF on
checkin and prevents conversion to CRLF when the file is
checked out.
This setting uses the same line endings in the working directory as
in the index when the file is checked out.

Unspecified::

If the `eol` attribute is unspecified for a file, its line endings
in the working directory are determined by the `core.autocrlf` or
`core.eol` configuration variable (see the definitions of those
options in linkgit:git-config[1]). If `text` is set but neither of
those variables is, the default is `eol=crlf` on Windows and
`eol=lf` on all other platforms.

Backwards compatibility with `crlf` attribute
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down

0 comments on commit 6696077

Please sign in to comment.