所以我认为这可能与 textmate 有关,但我们在一个小团队中工作,并且在 git 中几乎相同文件的完整文件冲突存在一些问题,因为一个分支的每一行都附加了一个 ^M。
这个神秘的 ^M
角色应该做什么,它可能来自哪里?
我们的开发人员在 Windows/Mac 上使用 emacs,在 Mac 上使用 TextMate,在 Mac 上使用 coda,偶尔还会使用 wp-admin 文本编辑器。
有人曾经因为其中一个问题而遇到过这个问题吗?
在 git-config 中,将 core.autocrlf
设置为 true
以使 git 自动为您的平台正确转换行尾,例如为全局设置运行此命令:
git config --global core.autocrlf true
Someone is not converting their line-ending characters correctly。
我认为是 Windows 用户,因为他们喜欢他们的 CRLF。 Unix 喜欢 LF,Mac 喜欢 CR,直到它以 Unix 的方式出现。
要使 ^M 在 git 中消失,请键入:
git config --global core.whitespace cr-at-eol
学分:https://lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/
git diff
在比较文件时仍将 ^M 考虑在内。使用 git config --global --unset core.whitespace
删除此设置(来自 this thread)。
--global
以仅配置当前存储库。
^M
是0x0d
,即回车符。如果您的显示器看起来像
line 1^M line 2^M
那么该文件必须来自 Windows,因为 Windows 上的标准换行符序列是 CR
LF
(0x0d 0x0a
),而标准换行符序列仅由 Unices 上的 LF
组成。
如果文件来自 Mac OS 9 或更早的系统,您会看到它为
line 1^Mline 2^M
因为回车后没有换行符。
我在 Mac OS 上使用 Android Studio (JetBrains IntelliJ IDEA),我的问题是 ^M 开始出现在我在 GitHub 上的拉取请求中的一些文件中。对我有用的是更改文件的行分隔符。
在编辑器中打开所需的文件转到文件转到行分隔符,然后为您选择最佳选项(对我来说是 LF - Unix 和 OS X(\n) )
根据下一篇文章,此问题是操作系统之间混淆行尾的结果:http://jonathonstaff.com/blog/issues-with-line-endings/
您可以在此处找到更多信息:https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48
https://i.stack.imgur.com/XbPMY.png
它们与 DOS 风格的行尾和 Unix 风格之间的区别有关。查看 Wikipedia article。您也许可以找到一个 dos2unix 工具来提供帮助,或者简单地编写一个小脚本来自己修复它们。
编辑:我找到了以下 Python 示例代码 here:
string.replace( str, '\r', '' )
M-: (replace-string "\r" "")
。
除了查询替换,您还可以使用 Mx delete-trailing-whitespace
在 Emacs 中,行尾的 ^M
表示回车符 (\r) 后跟换行符 (\n)。如果有人在 Windows 上编辑文件(其中行尾是回车符和换行符的组合)并且您在 Unix 或 Linux 中编辑(其中行尾只是换行符),您会经常看到这种情况。
字符的组合通常是无害的。如果您使用源代码管理,您可以配置文本文件签入格式,以便为您神奇地调整行。或者,您可以使用自动为您“修复”文件的签入和签出触发器。或者,您可以只使用 dos2unix 之类的工具来手动调整。
将以下内容放入您的 ~/.emacs
(或等效项)中
(defun dos2unix ()
"Replace DOS eolns CR LF with Unix eolns CR"
(interactive)
(goto-char (point-min))
(while (search-forward "\r" nil t) (replace-match "")))
然后您就可以简单地使用 M-x dos2unix
。
我不久前遇到了这个问题。 ^M 代表回车,在 Ctrl-Q Ctrl-M
上搜索(这将创建一个文字 ^M)将允许您在 Emacs 中获得该字符的句柄。我按照这些思路做了一些事情:
M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]
如果您的系统上没有安装 dos2unix 实用程序,您可以创建自己的实用程序以摆脱 Windows 结束符:
vi ~/dos2unix.bash:
具有以下内容
#!/bin/bash
tr -d '\r' < $1 > repl.tmp
mv -f repl.tmp $1
在您的 ~/.bashrc 中,添加以下行:
alias 'dos2unix=~/dos2unix.bash'
申请
dos2unix file_from_PC.txt
将删除 file_from_PC.txt 中行尾的 ^M 个字符。您可以使用 cat 检查是否有这些:
cat -v file_from_PC.txt
正如大家所提到的。这是不同的行尾样式。 MacOSX 使用 Unix 换行符 - 即 LF(换行)。
Windows 使用 CR(回车)和 LF(换行)作为行尾。由于您同时使用Windows和Mac,这就是问题的根源。
如果您在 Windows 中创建一个文件,然后将其带到 Mac 上,您可能会在行尾看到这些 ^M 字符。
如果你想删除它们,你可以在 emacs 中很容易地做到这一点。只需突出显示并复制 ^M 字符并使用查询替换 ^M 即可完成。
编辑:其他一些可能有帮助的链接。 Link
这可以帮助您配置 emacs 以使用特定类型的行尾样式。 http://www.emacswiki.org/emacs/EndOfLineTips
使用 emacs 命令单行来摆脱 ^Ms 的最直接方法之一:
C-x h C-u M-| dos2unix
分析:
C-x h: select current buffer
C-u: apply following command as a filter, redirecting its output to replace current buffer
M-| dos2unix: performs `dos2unix` [current buffer]
*nix 平台具有开箱即用的 dos2unix
实用程序,包括 Mac(带有 brew
)。在 Windows 下,它也被广泛使用(MSYS2、Cygwin、user-contributed 等)。
我的解决方案是使用此 Emacs Wiki Article 中的以下 elisp 函数。
(defun dos2unix ()
"Not exactly but it's easier to remember"
(interactive)
(set-buffer-file-coding-system 'unix 't) )
对缓冲区执行函数M-x dos2unix
并保存文件,所有^M
都会消失。
不定期副业成功案例分享