Vagrant中的Windows CRLF到Unix LF问题

Jon*_*han 17 virtual-machine eol vagrant vagrantfile

我正在使用配置一些虚拟机Vagrant.情况如下:

主持人:Windows 7(64位)

访客:Ubuntu 14.04(64位)

我有一个问题,让CRLF行结束转换为LFs.这导致共享文件夹中的bash脚本在来宾计算机中失败(参见下文).

vagrant@vagrant-host:/vagrant/bin$ sudo bash build-ubuntu-14.04.1-c
make.sh
build-ubuntu-14.04.1-cmake.sh: line 5: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 19: $'\r': command not found
: invalid option04.1-cmake.sh: line 21: set: -
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
build-ubuntu-14.04.1-cmake.sh: line 22: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 24: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 26: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 29: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 36: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 42: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 46: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 48: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 50: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 226: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

在我的Vagrantfile中,我将shell privisioner参数设置binary为false.

# Provision the VM
ubuntu.vm.provision "shell" do |s|
  # replace Windows line endings with Unix line endings
  s.binary = false

  s.inline = "sudo apt-get update;
              sudo bash vagrant/bin/build-ubuntu-14.04.1-cmake.sh"
end
Run Code Online (Sandbox Code Playgroud)

根据Vagrant文​​档:

binary(布尔值) - Vagrant自动用Unix行结尾替换Windows行结尾.如果这是真的,那么Vagrant就不会这样做.默认情况下,这是"假".如果shell配置程序通过WinRM进行通信,则默认为"true".

这是什么问题?我是否忽略了文档中的内容?


更新1:我已尝试按照此Stack Overflow应答中的建议编辑我的本地Git设置,但没有运气.另外,我已将一个.gitattributes文件添加到项目的根目录中,并将以下内容添加到该文件中:

# detect all text files and automatically normalize them (convert CRLF to LF)
*       text=auto
Run Code Online (Sandbox Code Playgroud)

我还读过Git提供的"处理行结尾"文档.当我提交到我的存储库时,CRLF会转换为LF,但是当我在Windows工作区中检出更改时,LF会转换为CRLF.这是我在Git工作流程中想要的确切行为.问题在于Vagrant.binary我设置的标志不执行文档描述的方式.


更新2:更改s.binary = true修复了问题.但是,我认为文件中的措辞应该重新解决.文档说明"如果这个[标志]为真,那么Vagrant 将不会这样做[将CRLF更改为LF]." 据我所知,如果设置了此标志,Vagrant将不会将CRLF更改为LF.然而,CRLFs 改变的LF如果设置为true.

ken*_*orb 12

你是对的,文档binary是误导性的.我已经提出了一个pull-request,这已在文档页面上得到纠正.

现在它说:

binary(布尔值) - Vagrant自动用Unix行结尾替换Windows行结尾.如果是这样false,那么Vagrant就不会这样做.默认情况下这是false.如果shell配置程序通过WinRM进行通信,则默认为true.

因此,CRLF要用Unix行结尾(LF)替换Windows行结尾(),您需要设置:

s.binary = true
Run Code Online (Sandbox Code Playgroud)

替代方案包括:

如果您使用Git对代码进行版本控制,则应该:

  • 通过将core.autocrlf选项设置为input或,在OS X上配置Git以正确处理行结尾false.

    如果您已安装Git On Windows,最常见的错误是在安装期间选择Checkout Windows样式选项,因此您应该重新安装它并选择:Checkout as-is并提交Unix样式的行结尾(core.autocrlf设置为input)或按原样结帐,按原样提交(core.autocrlf设置为false).

  • 考虑在您的repository(.gitattributes)中创建git规范化文件,以确保没有CRLF行结束,无论是在结账时还是在checkin上,例如:

    *.sh     text eol=lf
    
    Run Code Online (Sandbox Code Playgroud)

    所以人们编辑你的配置脚本,他们不会打破行结尾.

  • 另请阅读:在GitHub帮助中处理行结尾.

  • 相关:'\ r':找不到命令 - .bashrc/.bash_profile.


Jon*_*han 7

正如我在更新中所述,更改s.binary = true修复了问题.但是,我认为文件中的措辞应该重新解决.文档说明"如果这个[标志]为真,那么Vagrant将不会这样做[将CRLF更改为LF]." 据我所知,如果设置了此标志,Vagrant将不会将 CRLF 更改为LF.然而,CRLFs 改变的LF如果设置为true.