I want to force git to checkout files under Windows using just LF
not CR+LF
. I checked the two configuration options but I was not able to find the right combination of settings.
I want it to convert all files to LF
and keep the LF
on the files.
Remark: I used autocrlf = input
but this just repairs the files when you commit them. I want to force it to get them using LF
.
Probably I wasn't so clear: the repository is already using LF
but the files checked out using msysgit are using CR+LF
and I want to force msysgit to get them with LF
: forcing Unix line endings.
>git config --list | grep crlf
core.autocrlf=input
The OP added in his question:
A first simple step would still be in a
.gitattributes
file:, to avoid any crlf conversion for files with correct eol.
See Best practices for cross platform git config?
But a second more powerful step involves a gitattribute filter driver and add a smudge step
Whenever you would update your working tree, a script could, only for the files you have specified in the
.gitattributes
, force theLF eol
and any other formatting option you want to enforce.If the "
clear
" script doesn't do anything, you will have (after commit) transformed your files, applying exactly the format you need them to follow.Context
If you
you can do that starting with git 2.10. 2.10 or later is required, because 2.10 fixed the behavior of text=auto together with eol=lf. Source.
Solution
Put a
.gitattributes
file in the root of your git repository having following contents:Commit it.
Optional tweaks
You can also add an
.editorconfig
in the root of your repository to ensure that modern tooling creates new files with the desired line endings.I come back to this answer fairly often, though none of these are quite right for me. That said, the right answer for me is a mixture of the others.
What I find works is the following:
For repos that were checked out after those global settings were set, everything will be checked out as whatever it is in the repo – hopefully
LF
(\n
). AnyCRLF
will be converted to justLF
on checkin.With an existing repo that you have already checked out – that has the correct line endings in the repo but not your working copy – you can run the following commands to fix it:
This will delete (
rm
) recursively (r
) without prompt (-f
), all files except those that you have edited (--cached
), from the current directory (.
). Thereset
then returns all of those files to a state where they have their true line endings (matching what's in the repo).If you need to fix the line endings of files in a repo, I recommend grabbing an editor that will let you do that in bulk like IntelliJ or Sublime Text, but I'm sure any good one will likely support this.
core.autocrlf=input
is the right setting for what you want, but you might have to do agit update-index --refresh
and/or agit reset --hard
for the change to take effect.With
core.autocrlf
set toinput
, git will not apply newline-conversion on check-out (so if you have LF in the repo, you'll get LF), but it will make sure that in case you mess up and introduce some CRLFs in the working copy somehow, they won't make their way into the repo.The proper way to get LF endings in Windows is to first set
core.autocrlf
tofalse
:You need to do this if you are using msysgit, because it sets it to
true
in its system settings.Now git won’t do any line ending normalization. If you want files you check in to be normalized, do this: Set
text=auto
in your.gitattributes
for all files:And set
core.eol
tolf
:Now you can also switch single repos to crlf (in the working directory!) by running
After you have done the configuration, you might want git to normalize all the files in the repo. To do this, go to to the root of your repo and run these commands:
If you now want git to also normalize the files in your working directory, run these commands: