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

当前回答

博士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

其他回答

在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文件,您可以轻松删除想要删除的行。(或者你可以在它们前面加上“#”来注释掉它们。)

为什么要在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

博士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

如果git补丁已经在windows机器上生成,并且您正在使用它,您可以在Linux中使用dos2unix实用程序格式化补丁。

find -name "*.patch"| xargs dos2unix

这将解决^M在EOL,你将能够git应用补丁在你的linux机器。

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

git config  core.whitespace cr-at-eol

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