Vagrant中的Windows CRLF到Unix LF问题

Vagrant中的Windows CRLF到Unix LF问题,vagrant,virtual-machine,vagrantfile,eol,Vagrant,Virtual Machine,Vagrantfile,Eol,我正在使用Vagrant配置一些虚拟机。情况如下: 主机:Windows 7(64位) 来宾:Ubuntu 14.04(64位) 我在将CRLF行结尾转换为LFs时遇到问题。这会导致来宾计算机中共享文件夹中的bash脚本失败(见下文) 在我的vagrant文件中,我已将shell privisioner参数binary设置为false # Provision the VM ubuntu.vm.provision "shell" do |s| # replace Windows line en

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

主机:Windows 7(64位)

来宾:Ubuntu 14.04(64位)

我在将CRLF行结尾转换为LFs时遇到问题。这会导致来宾计算机中共享文件夹中的bash脚本失败(见下文)

在我的vagrant文件中,我已将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
根据流浪汉文件:

binary
(布尔)-Vagrant自动将Windows行结尾替换为Unix行结尾。若这是真的,那个么流浪汉不会这么做。默认情况下,这是“false”。如果shell provisioner正在通过WinRM进行通信,则默认为“true”

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


更新1: 我已尝试按照中的建议编辑本地Git设置,但没有成功。此外,我还在项目的根目录中添加了一个
.gittributes
文件,并在该文件中添加了以下内容:

# detect all text files and automatically normalize them (convert CRLF to LF)
*       text=auto
我还阅读了Git提供的文档。当我提交到我的存储库时,CRLF将转换为LFs,但当我在Windows工作区中签出更改时,LFs将转换为CRLFs。这正是我在Git工作流中想要的行为。问题在于流浪汉。我设置的
binary
标志没有按照文档描述的方式执行


更新2
更改
s.binary=true
修复了该问题。然而,我认为文件中的措辞应该重新处理。文件中说明“如果此[标志]为真,则Vagrant不会执行此[将CRLF更改为LF]。”据我当时了解,如果设置了此标志,Vagrant不会将CRLFs更改为LFs。但是,如果设置为true,则CRLFs将更改为LFs。

正如上面在我的更新中指定的那样,更改
s.binary=true
修复了该问题。然而,我认为文件中的措辞应该重新处理。文件中说明“如果此[标志]为真,则Vagrant不会这样做[将CRLF更改为LF]。”据我当时了解,如果设置了此标志,Vagrant将不会将CRLFs更改为LFs。但是,如果设置为true,则CRLFs将更改为LFs。

您是对的,这是误导性的。我已经提出了建议,并且在文档页面上对此进行了更正

所以现在它说:

binary
(布尔)-Vagrant自动替换Windows行结尾 具有Unix行结尾如果这是
false
,那么流浪汉就不行了 这个
。默认情况下,这是
false
。如果shell供应器是 通过WinRM进行通信时,默认为
true

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

s.binary = true

替代解决方案包括:

  • 通过以下方式手动更改行尾:

    • 使用
      dos2unix
      命令
    • 使用
      ex
      命令,例如

      ex +'bufdo! %! tr -d \\r' -scxa *.sh
      
  • 在Bashrc文件中添加以下行(例如,
    ~/.Bashrc
    ):

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

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

    如果您在Windows上安装了Git,最常见的错误是在安装过程中选择“签出Windows样式”选项,因此您应该重新安装它并选择:按原样签出和提交Unix样式的行结束(
    core.autocrlf
    设置为
    input
    )或按原样签出,按原样提交(
    core.autocrlf
    设置为
    false

  • 考虑在存储库()中创建git规范化文件,以确保在签出或签入时都没有CRLF行结尾,例如:

    *.sh     text eol=lf
    
    因此,人们编辑您的配置脚本时,不会打断行尾

  • 另请阅读:GitHub帮助

  • 相关:

或许可以完成上述内容:

2020年9月,在Windows 10计算机上使用Vagrant 2.2.10时,默认行为显然是尝试替换Windows行结束符。但是,这意味着,如果在Vagrant文件中使用Linux行结束符,它将不起作用

我被几个稍微不同的错误弄糊涂了,比如

"Vagrantfile:1: syntax error, unexpected tIDENTIFIER, 
expecting end-of-input [+ reference to different places in the Vagrantfile]"
通过猜测,我终于想到了将我的行尾从LinuxLF改为WindowsCR+LF的想法,这一切都很顺利

TL;DR:在windows上使用Vagrant,在您的应用程序中使用windows行结束符(CR+LF) 流浪汉档案


你应该回答你自己的问题,因为你已经解决了。而且,
git
的行尾内容只对文件系统和git数据库之间的数据移动有影响。它不会在你的共享文件夹上执行递归dos2unix。如果你在windows和linux上有一个单独的工作目录,并且在两者之间移动代码,这将非常有效不过,您可以使用带有LF结尾的规范提交版本,以及带有CRLF行结尾的Windows签出(以及没有转换的Linux签出,或带有强制到LF结尾的Linux签出)您当时使用的是哪个流浪汉版本?@DeanRather我使用的是最新的,
1.7.1
这是个好消息!谢谢。
*.sh     text eol=lf
"Vagrantfile:1: syntax error, unexpected tIDENTIFIER, 
expecting end-of-input [+ reference to different places in the Vagrantfile]"