Is it possible for git merge
to ignore line-ending differences?
Maybe I'm asking the wrong question ... but:
I tried uisng config.crlf input
but things got a bit messy and out of control, specially when I applied it after the fact.
For one thing, applying this config after the fact doesn't seem to affect files that were committed to the repository before applying this option. Another thing is that suddenly all commits now result in lots of annoying warning messages about CRLF being converted to LF.
To be honest, I don't really care what line-ending is used, I personally prefer the Unix style \n
, but whatever. All I care about, is for git merge
to be a bit smarter and ignore the differences in line-endings.
Sometimes I have two identical files, but git would mark them as being in conflict (and the conflict is the whole file) simply because they use a different line ending character.
Update:
I found out that git diff
accepts a --ignore-space-at-eol
option, would it be possible to let git merge
use this option as well?
I was looking for the same answer and I found out this
So running this command in any repository will do the trick:
What I did was leave everything as default (i.e. autocrlf=true), touch all files (find . -exec touch {} \;), let git see them as 'modified' and commit them back, and be done with it. Otherwise you'll always either be plagued by annoying messages or surprising differences, or have to turn off all of git's whitespace features.
You'll lose blame information, but it's better to do it sooner rather than later :)
however i suggest to use tool like sed to achieve correct line endings, and then diff files. I spent couple hours on diffing projects with various line endings.
The best way was to:
.git
directory) to another directory create repository in it, then add files and commit them (should be on master branch in new repository).dev
(git checkout -b dev
), commit files on this branch and run (if first project is in master):git diff master..dev --names-only
to see names of changed files onlyIt seems to me now that the best way is to normalized the line endings on both branches (and commit) before merging them.
I googled "convert crlf to lf" and found this as the first results:
http://stahlforce.com/dev/index.php?tool=remcrlf
I downloaded it and used, seems like a nice tool.
Be sure though to specify a directory and a file type (e.g. .py) otherwise it might try to mess with the contents of the
.git
directory!Update 2013:
More recent git versions authorize using merge with strategy
recursive
and strategy option (-X
):But using "
-Xignore-space-change
" is also a possibilityjakub.g also comments that the strategies work also with cherry-picking:
This works much better than
ignore-all-space
.Original answer (May 2009)
The patch for ignoring eol style has been proposed in June 2007, but it only concerns
git diff --ignore-space-at-eol
, notgit merge
.At the time, the question has been askeed:
Julio C Hamano was not exactly enthusiastic:
The general idea, when it comes to
git merge
, is to rely on the third-party merge tool.For instance, I have setup DiffMerge to be the tool for Git merge, setting a ruleset which allow that merge tool to ignore eol for certain type of files.
Setup on Windows, with MSysGit1.6.3, either for DOS or Git bash session, with DiffMerge or KDiff3:
c:\HOMEWARE\cmd
).merge.sh:
Git config commands:
git config at system level:
DOS script (note: the dos2unix command comes from here, and is used to simulate a Unix eol-style. That command has been copied in the directory mentioned at the beginning of this answer.):
C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):
At this point (Hitting "return"), DiffMerge or KDiff3 will open, and you will see for yourself what lines are actually merged, and what lines are ignored.
Warning: the result file will always be in Windows eol mode (CRLF) with DiffMerge...
KDiff3 offers to save in one way or another.
As in this answer: https://stackoverflow.com/a/5262473/943928
You could try:
git merge -s recursive -Xignore-space-at-eol