在项目中,其中一些文件包含^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
在Windows上开发时,我在使用git tfs时遇到了这个问题。我是这样解决的:
git config --global core.whitespace cr-at-eol
这基本上告诉Git行尾CR不是错误。因此,那些恼人的^M字符不再出现在git diff, git show等的行尾。
它似乎保持其他设置不变;例如,行尾的额外空格仍然在diff中显示为错误(用红色突出显示)。
(其他回答都提到了这一点,但上面说的正是如何设置设置。若要仅为一个项目设置该设置,请省略——global。)
编辑:
在经历了许多行结束的痛苦之后,当我在.NET团队中工作时,我有了最好的运气,通过以下设置:
没有核心。终点设置
没有核心。空白设置
没有核心。autocrlf设置
当运行Windows Git安装程序时,你会得到这三个选项:
签出windows样式,提交unix样式的行结束符<——选择这个
按原样签出,提交unix风格的行结束符
按原样签出,按原样提交
如果您需要使用空白设置,那么如果您需要与TFS交互,则应该仅在每个项目上启用它。只需省略——global:
git config core.whitespace cr-at-eol
如果你需要去核的话。*设置,最简单的方法是运行这个命令:
git config --global -e
这将在文本编辑器中打开全局.gitconfig文件,您可以轻松删除想要删除的行。(或者你可以在它们前面加上“#”来注释掉它们。)
正如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'
但它不使用配置的寻呼机设置,这就是为什么我更喜欢前者。
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"
核心。在手册页中有描述。