【问题标题】:Prevent EOL normalization for CSV files防止 CSV 文件的 EOL 规范化
【发布时间】:2014-01-27 00:37:16
【问题描述】:

我有一个可用于 WindowsLinux 的源代码库。

我知道 Git 会自动将 EOL 转换为本地标准:\r\n 在 Windows 和 \n 在 Linux 上。

这不是源文件的问题。

但我有一些 CSV 文件,它们使用带有给定 EOL 字符 (\r\n) 的固定格式,不应更改,但 Git 也会转换它们,破坏了一些代码。

我试图通过在 .gitignore 文件旁边的根目录下创建一个 .gitattributes 文件来防止 CSV 文件的 EOL 转换,其中包含以下内容:

*.csv    -text

我已经应用了我所理解的内容:http://git-scm.com/docs/gitattributes

但 Git 仍在 Linux 上将 \r\n 转换为 \n

我应该使用 auto.crlf 等其他设置吗?

请注意,我对 Linux 本地存储库的控制有限,因为它由 持续集成服务器 Jenkins 管理。

感谢您的任何意见。

【问题讨论】:

  • linux上的文件扩展名是区分大小写的。您的 CSV 文件实际上是 *.CSV 吗?尝试在您的 .gitattributes 文件中添加一些大小写变体。
  • 你试过*.csv eol=crlf吗?
  • @PaulHicks:谢谢,但所有扩展名都是小写的“csv”。
  • @AchalDave:感谢您的建议,但其他一些 CSV 文件可能会被格式化为 \n 而不是 \r\n 所以我可以' t 应用统一的转换策略,我想禁用任何转换。

标签: git github eol end-of-line


【解决方案1】:

请注意,git 使用 LF 作为 EOL 的内部表示。

这意味着在您的情况下,*.csv 文件在添加/提交时已更改。

所以解决方案大致是这样的:

  1. 删除所有 *.csv 文件,提交更改
  2. 编辑 .git 属性,提交
  3. 重新添加所有 *.csv 文件,再次提交

其实可以在一次提交中全部完成,使用以下命令:

### ... update .gitattributes
git rm --cached '*.csv'
### ... find -name '*.csv' -print0| xargs -0 unix2dos
git add '*.csv'
git add .gitattributes
git commit

解释:

  • git rm --cached 从索引中删除所有 csv 文件,将它们留在磁盘上;
  • 确保文件有 CRLF 行结尾(我以 unix2dos 为例)
  • git add '*.csv' 根据新版本的 .gitattributes 将它们添加回来,这次没有任何转换

【讨论】:

    猜你喜欢
    • 2021-01-09
    • 2017-03-11
    • 2017-08-30
    • 2011-04-16
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多