How to normalize working tree line endings in Git?
Solution 1:
For those using v2.16 or better, you can simply use:
git add --renormalize . # Update index with renormalized files
git status # Show the files that will be normalized
git commit -m "Introduce end-of-line normalization"
These directions are straight out of the gitattributes. For older versions, the docs (prior to v2.12) provide a different answer:
rm .git/index # Remove the index to force git to
git reset # re-scan the working directory
git status # Show files that will be normalized
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"
Do this sequence after you have edited .gitattributes
.
Update
It appears some users have had trouble with the above instructions. Updated docs for gitattributes (2.12 to 2.14) shows a new set of instructions (after editing the .gitattributes files):
git read-tree --empty # Clean index, force re-scan of working directory
git add .
git status # Show files that will be normalized
git commit -m "Introduce end-of-line normalization"
Thanks to @vossad01 for pointing this out.
Also, with either solution the files in your working copy still retain their old line endings. If you want to update them, make sure your working tree is clean and use:
git rm --cached -r .
git reset --hard
Now the line endings will be correct in your working tree.
Solution 2:
With Git client 2.16 and higher there is now a much simpler way to do this. Just use:
git add --renormalize .
Note: it's better to do this with a clean workspace. For details, see:
- https://git-scm.com/docs/gitattributes#_end_of_line_conversion
- https://help.github.com/en/github/using-git/configuring-git-to-handle-line-endings#refreshing-a-repository-after-changing-line-endings
Solution 3:
Alternative approach (differs only in command used)
Make sure you have no any pending changes in repository:
$ git status
$ git stash
Modify .gitattributes
so CRLF interpretation will changed:
$ echo "*.txt text" >>.gitattributes
$ git commit -m "Made .txt files a subject to CRLF normalization." -- .gitattributes
Remove data from index and refresh working directory:
$ git rm --cached -r .
$ git reset --hard
Review CRLF fixes that Git proposes:
$ git ls-files --eol
$ git status
$ git diff
Agree with Git decision:
$ git add -u
$ git commit -m "Normalized CRLF for .txt files"
Reload changes as if clean clone was done:
$ git rm --cached -r .
$ git reset --hard
Solution 4:
The .gitattributes
settings will only affect new commits. If this repository has no history published (no others depending on it), you might want to go through the whole history. In Unix/Linux, you can use dos2unix(1)
to fix all files in combination with find(1)
, and using the history rewriting of filter-branch
(see the discussion in the git book) you can even clean up the full history of the project.
Use with utmost care, on a fresh clone. Get in contact with anybody who might have a clone, and advise them what you want to do.