Explore Courses Blog Tutorials Interview Questions
0 votes
in DevOps and Agile by (19.4k points)

In a project where some of the files contains ^M as newline separators. Diffing these files are apparently impossible since git-diff sees it as the entire file is just a single line.

How does one diff with the previous version?

Is there an option like "treat ^M as newline when diffing"?

prompt> git-diff "HEAD^" -- 

diff --git a/myproject/ b/myproject/

index be78321..a393ba3 100644

--- a/myproject/MyFile.cpp

+++ b/myproject/MyFile.cpp

@@ -1 +1 @@

-<U+FEFF>import;^Mimport mx.controls.*;^Mimport mx.utils.Delegate

\ No newline at end of file

+<U+FEFF>import;^Mimport mx.controls.*;^Mimport mx.utils.Delegate

\ No newline at end of file



Now I have written a script that checks out the latest 10 revisions and converts CR to LF.

require 'fileutils'

if ARGV.size != 3

  puts "a git-path must be provided"

  puts "a filename must be provided"

  puts "a result-dir must be provided"

  puts "example:"

  puts "ruby gitcrdiff.rb project/dir1/dir2/dir3/ SomeFile.cpp tmp_somefile"



gitpath = ARGV[0]

filename = ARGV[1]

resultdir = ARGV[2]

unless FileTest.exist?(".git")

  puts "this command must be run in the same dir as where .git resides"



if FileTest.exist?(resultdir)

  puts "the result dir must not exist"




10.times do |i|

  revision = "^" * i

  cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr '\\r' '\\n' > #{resultdir}/#{filename}_rev#{i}"

  puts cmd 

  system cmd


1 Answer

0 votes
by (27.5k points)

According to GitHub only use \n as a newline character in git-handled repos. There's an option to auto-convert:

$ git config --global core.autocrlf true

Of course, this is said to convert crlf to lf, while you want to convert cr to lf. I hope this still works. And then convert your files:

In order to remove everything from the index

$ git rm --cached -r .

In order to re-add all the deleted files to the index 

You should get lot s of messages like: "warning: CRLF will be replaced by LF in <file>."

$ git diff --cached --name-only -z | xargs -0 git add

Now commit

$ git commit -m "Fix CRLF"

Browse Categories