我正在使用perforce来管理一些代码。我在本地机器和unix机器上设置了一个工作区。然而,最近perforce开始在行尾添加^M个字符,这导致在unix环境中运行代码时出现问题。在编辑文件时,如何在本地设置perforce不执行此操作。我正在使用Notepad++进行本地编辑
发布于 2012-11-30 06:37:40
我建议对这两个客户端都使用Unix行结尾。
Unix行尾,不管名称如何,都会告诉perforce客户端而不是在文件同步时修改行尾,而不是原来的提交方式。在两个客户端上都设置了此设置后,如果您在Windows上创建一个文件并将其同步到Unix,它将仍然具有Windows行结尾,但在Unix上应该不会造成问题,并且perforce不会删除/添加导致^M的字符。
一个小缺点是,Windows计算机将需要Unix行结束识别实用程序,如Notepad++,但这听起来对您来说不是问题。
在我们的团队环境中,Unix,Mac和Windows都在同一个仓库中使用,我们所有的客户端都被Unix服务器上的一个简单的一行触发器强制使用Unix行结尾,这样就没有人会遇到这个问题(它也会强制提交不变的和rmdir,但您可以选择剥离它们):
clientspec form-in client "sed -i -e s/LineEnd.*/LineEnd:unix/ -e s/submitunchanged/revertunchanged/ -e s/normdir/rmdir/ %formfile%"发布于 2012-05-24 02:21:22
听起来您需要在客户端规范中将LineEnd选项设置为"share“。
请参阅:http://www.perforce.com/perforce/doc.current/manuals/cmdref/client.html#1040665
发布于 2018-11-27 10:41:05
Perforce文档试图简化其EOL设置。它失败了,因为EOL问题总是很复杂,不能简化。这里总结了所有不同的p4 client设置“真正”做了些什么。这是通过慢慢阅读关于这个主题的整个Perforce文档,一些other stackoverflow answers,当然还有一些试验和错误(提示:p4 client + p4 diff -f ...)来学到的。
unix:没有转换,因为Perforce假设它的内部数据库完全是‘LF标准化的’,即使这不是严格执行的!More below.win:在输入时转换CRLF -> LF,在outputlocal:上转换LF -> CRLF的默认值。在Windows上执行win转换,在macOS X、Linux和任何其他Unix上不执行(unix)转换-包括Windows子系统Linux.share:= "Cleanup CRLF“。在输入时将CRLF转换为LF,在output.mac:pre-macOS上没有转换,所以让我们忽略它以保持事情稍微简单一些与通常的情况一样,the caveat间接描述了关键的设计问题,这比该主题的所有其他文档都要详细:
例如,在
unix工作区中保存以CRLF行结尾的文本文件,然后提交该文件,会导致文件存储在仓库中,并且每行末尾都有额外的CR字符。当这些文件同步到其他unix工作空间时,它们将具有CRLF行结束符,而不是正确的LF行结束符;当这些文件同步到win工作区时,它们将具有CRCRLF行结束符(因为原始文件中的每个LF都转换为CRLF行结束符)。
请注意,同一页上的前面语句给出了(错误!)印象中的“一切都是LF内部”。
虽然没有在内部严格执行LF,但Perforce手册警告说,当在内部发现一些非LF结束行时,一些操作可能会遇到困难。希望在存储CRLF时只出现spurious but harmless ^M characters?好消息是,lone CRs和之前的macOS现在已经死了。
PS:除非为时已晚,否则使用unix并让编辑器处理行尾;而不是版本控制。几乎所有的编辑器都很擅长这一点,而且比版本控制更好。例如,在版本控制中没有终止转换是将一些build.sh和一些其他build.bat文件放在同一位置的唯一实用方法。
https://stackoverflow.com/questions/10721294
复制相似问题