在项目中,其中一些文件包含^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

当前回答

我为这个问题挣扎了很长一段时间。到目前为止,最简单的解决方案是不用担心^M字符,只需使用一个可以处理它们的视觉差异工具。

而不是打字:

git diff <commitHash> <filename>

try:

git difftool <commitHash> <filename>

其他回答

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"

核心。在手册页中有描述。

为什么要在git diff中加入^M ?

以我为例,我正在开发一个在Windows上开发的项目,我使用的是Linux。当我修改一些代码时,我在git diff中添加的行末尾看到^M。我认为^M出现是因为它们与文件的其他部分不同的行结束符。因为文件的其余部分是在Windows上开发的,所以它使用CRLF行结束符,而在Linux中它使用LF行结束符。

显然,Windows开发人员在安装Git时没有使用“结帐Windows风格,提交unix风格的行尾”选项。

那么我们该怎么做呢?

你可以让Windows用户重新安装git并使用“Checkout Windows style, commit unix style line ending”选项。这是我更喜欢的,因为我认为Windows在行尾字符方面是个例外,Windows用这种方式解决了自己的问题。

如果选择此选项,则应该修复当前文件(因为它们仍在使用CRLF行结束符)。我是通过以下步骤做到的:

Remove all files from the repository, but not from your filesystem. git rm --cached -r . Add a .gitattributes file that enforces certain files to use a LF as line endings. Put this in the file: * text=auto eol=lf Add all the files again. git add . This will show messages like this: warning: CRLF will be replaced by LF in <filename>. The file will have its original line endings in your working directory. You could remove the .gitattributes file unless you have stubborn Windows users that don't want to use the "Checkout Windows-style, commit Unix-style line endings" option. Commit and push it all. Remove and checkout the applicable files on all the systems where they're used. On the Windows systems, make sure they now use the "Checkout Windows-style, commit Unix-style line endings" option. You should also do this on the system where you executed these tasks because when you added the files git said: The file will have its original line endings in your working directory. You can do something like this to remove the files: git ls | grep ".ext$" | xargs rm -f And then this to get them back with the correct line endings: git ls | grep ".ext$" | xargs git checkout Replacing .ext with the file extensions you want to match.

现在你的项目只使用LF字符作为行结束,讨厌的CR字符将永远不会回来:)。

另一种选择是强制windows样式的行结束符。您还可以为此使用.gitattributes文件。

更多信息: https://help.github.com/articles/dealing-with-line-endings/#platform-all

正如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'

但它不使用配置的寻呼机设置,这就是为什么我更喜欢前者。

有一个选项,如“对待^M换行时,差异”?

Git 2.16(2018年第一季度)将会出现一个问题,因为“diff”命令家族学会了忽略行末回车中的差异。

参见Junio C Hamano (gitster)提交e9282f0(2017年10月26日)。 帮助:Johannes Schindelin (dscho)。 (由Junio C Hamano—gitster—在commit 10f65c2中合并,2017年11月27日)

diff: ignore-cr-at-eol 一个新的选项——ignore-cr-at-eol告诉diff机器在(完整的)行末尾处理回车,就像它不存在一样。 就像其他“——ignore-*”选项忽略各种空白差异一样,这将有助于检查您所做的实际更改,而不会被编辑器程序所做的虚假CRLF<->LF转换分心。

在我的例子中,这是一个命令:

git config  core.whitespace cr-at-eol

来源:https://public inbox.org/git/8d7e4807 - 9 -你姓名e357 - 8265 - 95 f22ab716e0@web.de / T /