【问题标题】:How do I get chef cookbooks to be downloaded in Unix format on Windows?如何在 Windows 上以 Unix 格式下载厨师食谱?
【发布时间】:2026-02-12 18:20:10
【问题描述】:

我正在使用 Vagrant、Chef solo 和 berkshelf 在 Windows 7 上使用 VirtualBox 运行 Linux VM。

Cookbooks 是从 git 下载的,并以 windows 行结尾。其中之一是 Perl 脚本,然后将其上传到 vm 并执行。但是它失败了,因为第一行是

#!/usr/bin/perl

Linux 虚拟机将此视为命令

#!/usr/bin/perl^M

如何配置需要它的工具(可能是 Chef?)以下载 Unix 格式的 .pl 文件?

【问题讨论】:

    标签: git vagrant chef-solo berkshelf


    【解决方案1】:

    好吧,现在用配置设置解决问题似乎为时已晚

    git使用的算法如下:

    1. 索引时间 git 可以将 text file 从特定于平台的行尾样式(即 Windows 上的 CRLF,Linux 和 Mac 上的 LF,可能是旧 Mac 上的 CR)转换为“内部 EOL 表示”,即 LF
    2. 结帐时,git 将内部表示形式转换为所有文本文件中特定于平台的 EOL

    控制是否应用此逻辑的设置称为core.autocrlf

    因此,要最终解决问题,您应该将存储库准备为“跨平台”,即重新索引所有(必要的)提交中的文件,以便将它们作为“转换的文本文件”放入索引中。它是否是不应修改现有提交的公共存储库?如何解决问题的秘诀取决于“宣传”。

    你需要决定什么对你来说更重要:

    1. 您需要在存储库中的所有现有提交中使用正确的行结尾。但是,所有现有提交都将被覆盖,并且存储库的其他用户必须重新克隆它,然后重新应用他们的所有更改(有很多琐碎的冲突)
    2. 您希望通过仅为实际分支中的*提交创建修复来修复行尾。现有的结帐将照常获得新的提交,潜在的用户问题将会减少。

    这是两种方法的recipe

    【讨论】:

    • 它是公共存储库:github.com/silinternational/addressbook。我不希望它是跨平台的。我希望它在 Windows 上使用 LF 结尾。
    • 抱歉,这是基础仓库。实际上就是这本食谱:github.com/onehealth-cookbooks/apache2
    【解决方案2】:

    由于我无法更改说明书存储库,我所做的就是在本地克隆它,然后添加一个包含此行的文件 .gitattributes

    *.pl text eol=lf
    

    这解决了问题。

    【讨论】: