【问题标题】:Are CRLF lines ok in a Rails project deployed on Linux?在 Linux 上部署的 Rails 项目中是否可以使用 CRLF 行?
【发布时间】:2009-01-15 10:15:10
【问题描述】:

我有一个 Git 存储库(最初是 CVS,然后是 SVN,现在是 Git),其中包含一个已在 Linux 上部署一段时间的 Rails 项目。一切似乎都运行良好。

现在我已转换为 git,我看到 我在存储库中的许多文件都包含 CRLF 行结尾。我希望它保持一致 (LF),但不能以丢失每个具有 CRLF 行结尾的文件的编辑历史为代价。

你能想出我不能保留文件原样的任何原因吗?我似乎记得 shell 脚本或 cron 文件有问题,或者没有响应 @ 987654325@很好。

另外,我知道所有关于 Git 选项 core.autocrlfcore.safecrlf 的信息,但是有没有办法让它 在结帐时将所有文本文件从 CRLF 转换为 LF(对于 linux 端) ...即 core.autolf 选项或类似的东西?

【问题讨论】:

  • 我不明白您为什么说“丢失 [原文如此] 每个具有 CRLF 行结尾的文件的编辑历史记录”。添加使行尾一致的提交如何导致您“丢失编辑历史记录”?
  • 一些版本控制系统(即 Subversion)查看一个行尾已更改的文件,并认为文件中的每一行都已更改。
  • 如颠覆和Git。似乎 Git 在内部只使用 LF,所以 CR 只是文本的一部分,如果它改变了,那行就改变了。我不会丢失编辑历史记录,但是通过该换行提交来区分文件会显示整个文件已被更改。

标签: ruby-on-rails linux git deployment newline


【解决方案1】:

如果您可以重写存储库的历史记录(请参阅problems with rewriting history),您可以使用 git filter-branch 将 CRLF 转换为 LF:

git filter-branch --tree-filter 'find . -path './.git' -prune -o -type f -exec dos2unix \{} \;' HEAD

请注意,如果您的存储库中有二进制文件,则必须改进 find 命令以排除它们。

【讨论】:

  • 刚刚用 Ubuntu 的 tofrodos 包(版本 1.7.6-2)中的 dos2unix 进行了尝试,它不会单独留下二进制文件。因此,如果您的存储库中有二进制文件,则应改进 find 命令以排除二进制文件。
  • 是的,如果我能找到一个好的方法来确保并保留二进制文件,这将起作用。
  • 看起来,至少在 dos2unix 6 中,dos2unix 会跳过二进制文件,所以这应该可以工作。
【解决方案2】:

comment davitenio 的回答和 Daniel Beardsley 的评论;我相信您可以使用这个小程序作为 dos2unix 的包装器:

#!/bin/sh
for f in $@; do
    if [ $(file -b -n -i -m /dev/null $f | grep -c "text") -gt 0 ]; then
        dos2unix $f
    fi
done

尽管可能仍有一些极端情况会失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多