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
- 通过将
选项设置为core.autocrlf
或input
,在OS X上配置Git以正确处理行尾 如果您在Windows上安装了Git,最常见的错误是在安装过程中选择“签出Windows样式”选项,因此您应该重新安装它并选择:按原样签出和提交Unix样式的行结束(false
设置为core.autocrlf
)或按原样签出,按原样提交(input
设置为core.autocrlf
)false
- 考虑在存储库()中创建git规范化文件,以确保在签出或签入时都没有CRLF行结尾,例如:
因此,人们编辑您的配置脚本时,不会打断行尾*.sh text eol=lf
- 另请阅读:GitHub帮助
- 相关:
"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]"