在项目中,其中一些文件包含^M作为换行符
分隔器,区分这些文件显然是不可能的,因为
Git diff将整个文件视为一行。
比较当前和以前的git有什么不同
源代码文件的版本?
有一个选项,如“对待^M换行时,差异”?
prompt> git-diff "HEAD^" -- MyFile.as
diff --git a/myproject/MyFile.as b/myproject/MyFile.as
index be78321..a393ba3 100644
--- a/myproject/MyFile.cpp
+++ b/myproject/MyFile.cpp
@@ -1 +1 @@
-<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
+<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
prompt>
更新:
我写了一个Ruby脚本来检查最新的10个修订,并将CR转换为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"
exit(1)
end
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"
exit(1)
end
if FileTest.exist?(resultdir)
puts "the result dir must not exist"
exit(1)
end
FileUtils.mkdir(resultdir)
10.times do |i|
revision = "^" * i
cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr '\\r' '\\n' > #{resultdir}/#{filename}_rev#{i}"
puts cmd
system cmd
end
GitHub建议你应该确保在git处理的repo中只使用\n作为换行符。有一个自动转换的选项:
$ git config --global core.autocrlf true
当然,这是说将crlf转换为lf,而你想要将cr转换为lf。我希望这还能用…
然后转换文件:
# Remove everything from the index
$ git rm --cached -r .
# Re-add all the deleted files to the index
# You should get lots of messages like: "warning: CRLF will be replaced by LF in <file>."
$ git diff --cached --name-only -z | xargs -0 git add
# Commit
$ git commit -m "Fix CRLF"
核心。在手册页中有描述。
博士TL;
改变核心。寻呼机到“tr -d '\r' | less -REX”,不是源代码
这就是为什么
那些讨厌的^M显示是一个人工的着色和寻呼机。
这是由less -R引起的,这是git默认的寻呼机选项。(git的默认寻呼机是less -REX)
首先要注意的是git diff -b不会显示空白的变化(例如\r\n vs \n)
设置:
git clone https://github.com/CipherShed/CipherShed
cd CipherShed
用git diff -b创建一个unix文件并更改行结束符的快速测试将显示没有更改:
echo -e 'The quick brown fox\njumped over the lazy\ndogs.' > test.txt
git add test.txt
unix2dos.exe test.txt
git diff -b test.txt
我们注意到,强制管道less不会显示^M,但启用color和less -R可以:
git diff origin/v0.7.4.0 origin/v0.7.4.1 | less
git -c color.ui=always diff origin/v0.7.4.0 origin/v0.7.4.1 | less -R
修复显示使用管道剥离\r (^M)从输出:
git diff origin/v0.7.4.0 origin/v0.7.4.1
git -c core.pager="tr -d '\r' | less -REX" diff origin/v0.7.4.0 origin/v0.7.4.1
一个不明智的选择是少使用-r,因为它将通过所有的控制代码,而不仅仅是颜色代码。
如果你只想直接编辑你的git配置文件,这是更新/添加的条目:
[core]
pager = tr -d '\\r' | less -REX
正如VonC所指出的,这已经包含在git 2.16+中。不幸的是,该选项的名称(——ignore-cr-at-eol)与我所习惯的GNU diff所使用的名称(——strip- trails -cr)不同。
当我遇到这个问题时,我的解决方案是调用GNU diff而不是git的内置diff,因为我的git已经超过2.16了。我用这个命令行来做:
GIT_EXTERNAL_DIFF='diff -u --strip-trailing-cr "$2" "$5";true;#' git diff --ext-diff
这允许使用——strip-trail -cr和任何其他GNU diff选项。
还有另一种方式:
git difftool -y -x 'diff -u --strip-trailing-cr'
但它不使用配置的寻呼机设置,这就是为什么我更喜欢前者。