git:编辑文件导致^ M在使用git diff时出现

时间:2014-08-01 15:18:18

标签: linux git vim gedit

我在本地git仓库中有几个源文件。这些文件是从远程git仓库中提取的。当我做一个" $ git status"我看到以下内容:

$git status

# On branch master
nothing to commit, working directory clean

但是,当我编辑任何源文件(使用vim或gedit)时,^ M总是被添加到我添加的行的末尾。换句话说,在我进行更改后,我会看到以下内容:

$git status

# On branch master
# Changes not staged for commit: 
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   sourcefile1.c
#
no changes added to commit (use "git add" and/or "git commit -a")

$git diff sourcefile1.c
...
+ This is a test line ^M
...

我不知道为什么会这样,但它似乎与我使用的编辑器无关,也不与git本身有关。我知道有一种方法可以强制git to ignore ^M,但我真的想知道出了什么问题,为什么要插入这些^ M,以及如何阻止这种情况发生。

我正在使用Ubuntu和Linux内核3.11.0

我感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

当你执行git-diff时,如果在一行的末尾有一个CR(^ M),它会发出警告。这被认为是“空白错误”并且默认情况下将以红色显示,而不管是否存在真正的差异。您可以通过创建包含行<{p>的.gitattributes文件来关闭它

* whitespace=cr-at-eol

这不会影响文件内容,只会禁用git-diff的警告。

你没有说文件最初是否有CRLF行结尾,但是Vim很可能不会在没有警告的情况下将它从Unix转换为DOS行结尾。我发现git中的行结束转换真的很痛苦而且令人困惑,只需在.gitattributes中通过添加一行来关闭它们

* -text

这会阻止git进行任何魔术转换,并让它留给你。

您可能想检查工作目录中的所有文件,以查看它们当前有哪些行结尾(Vim应该在状态栏中告诉您)。另请参阅Git line endings after normalization了解几个可以从一个转换为另一个的git别名。如果这是一个仅限Linux的仓库,那么将所有内容一次性转换为Unix格式可能是一个好主意。

答案 1 :(得分:3)

我曾经遇到过这个问题,我可以用“dos2unix”程序来解决它。我认为FDinoff是正确的,因为vim使用dos行结尾,因为该文件最初具有dos格式。要将其更改回unix格式,请安装dos2unix(如果您还没有)。对于Ubuntu,您可以通过以下方式执行此操作:

sudo apt-get install dos2unix

然后使用此命令转换文件格式,例如

dos2unix sourcefile1.c

在此之后,如果文件格式确实存在问题,则在添加新行时不应该看到^ M.