MSYS2 Git, Git for Windows - line endings and cross platform setup

· by Raghu Rajagopalan · Read in about 3 min · (498 words) ·

I use multiple machines - work machine is Windows 8.1 with Git for Windows and MSYS Git while at home I have Linux. Given that I frequently pull and push from any of these depending on what I’m using at any given moment. Having a setup that works with least surprises is an important quality of life factor. If I can, I prefer linux versions since I can share the same setup with my home machine and it’s easier for muscle memory.

Today, given that I have finally moved from Screen to tmux, I decided to give things a go on MSYS2 on my work laptop. If you’re a git user, then you know where this is heading - what followed is probably 2 hours wasted trying to figure out the right incantation of core.autocrlf, .gitattributes and core.eol to retain my sanity.

So, for the uninitiated (though I doubt anyone here would fall into that group), MSYS2 git by default will do line ending translation. This means that if a file is in the repo with LF, when it checks out, it will be modified to have CRLF as line endings. What this results in is that under MSYS2 git status reports every file as modified.

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   .agignore
        modified:   .config/openbox/lubuntu-rc.xml
        modified:   .conkyrc
        modified:   .ctags
        ....
        ....
        # goes on for pretty much every file

and if you were to check git diff ` you’d just find every line with a `^M showing up as a diff. If you were to commit this, it’d be terrible since every line will show up as a diff.

Now, admittedly, this is a problem if you want MSYS2, Git for Windows and Linux - but the easiest solution I found was to just junk CRLF altogether. Most editors nowadays are end of line aware barring stupid Notepad, but then I’m not going to be using notepad anytime soon.

To turn off all linefeed translation do this

git config --global core.autocrlf input

And if you ever want to enable it for a repository locally, you can always do git config core.autocrlf true.

So that’s about all I’m going to do about it. Note that setting autocrlf=input does not fix files that are already in the repository. If you’d like to normalize all line endings, then you have do quite a bit more work. I’m not the only one who thinks this is a complete PITA - just see this question at SO - asked 7 years ago, a 100K views and the selected answer doesn’t even have the most upvotes! :)

I’m still waiting to get Windows 10 on my work laptop. I’m hoping with ubuntu on WSL I would’nt need to jump through all these hoops.