每个文件的 Perforce 行尾数

Perforce Line Endings per file

我的基于 Perforce 的项目支持 Linux 和 Cygwin 平台,具有相同的 shell 脚本(例如 build_project.sh)。但是 Perforce 将文本文件的行尾默认为本地平台 (Docs)。这会导致 .sh 脚本中的 \r\n 换行符在 Cygwin 上失败。

到目前为止我想到的一些想法:

  1. 有没有办法让 Cygwin 接受 \r\n 文件?(无需 运行 dos2unix,文件以只读方式获取)。

  2. 有没有办法将特定文件设置为文本,但每个人都使用 Unix 行结尾?(我猜,"no" , 但我想我会检查一下。)

  3. 当然我可以将整个工作区的行尾设置为\n (unix)。但这使得 Windows 客户不满意他们的 .bat 文件是 \n 而不是 \r\n。此外,如果设置是针对每个工作区的(我不记得了),那么工作区设置对于新 Windows 用户来说会稍微困难一些,因为他们必须设置该选项。

  4. .sh 文件设置为 "binary",但随后我们丢失了这些文件的文本差异。 有解决办法吗?这是常见的(好的)技巧吗?

这是一个相当小的问题,但我怀疑你们中的一些人对此模式有 BKM。

谢谢。

编辑:Craig 在 this question 中的回答似乎暗示使用 Unix 行结尾只会留下带有 \r\n 的文件,如果它们最初是以这种方式提交的话。

编辑:要强制 bash(即 Cygwin)接受以 \r\n 结尾的文件,可以在脚本中指定 set -o igncr。如果有人期望 Cygwin 用户可能不太了解 Unix(我的情况),或者当我们出于某些其他原因无法在下面的解决方案中全局强加触发器时,这很好。

我相信当您安装 Cygwin 时,您可以将其配置为使用 Windows 行尾。撇开这一点不谈:

如果您对每个人都使用 "unix" LineEnd,那么您的所有文本文件都将具有内部一致的行结尾(但不一定与客户端平台一致)。这是因为 Windows 文件最终会将 \r 作为该行内容的一部分,因此当以 "unix" 格式同步时,它们将具有 \r\n结尾。

执行此操作时需要注意的是混合和匹配 LineEnd 设置——如果有人使用 "win" 或 "local" LineEnd 同步同一个文件,现在他们有 \r\r\n结局!因此,如果您想使用每个文件的行结束计划,请确保每个人都使用 "unix" 作为他们的 LineEnd。使用触发器很容易做到这一点,例如:

Triggers:
    form-in client "sed -i %quote%s/LineEnd:.*/LineEnd: unix/%quote% %formfile%"