主机:Windows 7(64位)
客户机:Ubuntu 14.04(64位)
我在处理 CRLF 换行符转换为 LF 时遇到了问题。这导致共享文件夹中的 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
在我的Vagrantfile中,我将shell provisioner参数
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
根据Vagrant文档:
二进制(布尔值)- Vagrant会自动将Windows行尾替换为Unix行尾。如果设置为true,则Vagrant不会这样做。默认情况下,它为“false”。如果shell provisioner通过WinRM进行通信,则默认为“true”。
问题出在哪里?我是否忽略了文档中的某些内容?
更新 1: 我已尝试按照这个 Stack Overflow 回答中的建议编辑我的本地 Git 设置,但没有成功。此外,我已在项目的根目录下添加了一个 .gitattributes
文件,并在该文件中添加了以下内容:
# detect all text files and automatically normalize them (convert CRLF to LF)
* text=auto
我还阅读了Git提供的"处理换行符"文档。当我提交到我的存储库时,CRLF会转换为LF,但是当我在Windows工作区检出更改时,LF会转换为CRLF。这正是我想要的Git工作流程。问题出在Vagrant上。我设置的
binary
标志没有按照文档描述的方式执行。
更新2: 将
s.binary = true
更改后问题得到解决。然而,我认为文档中的措辞需要重新审视。文档指出:“如果这个标志为真,则 Vagrant 不会 进行此操作 [将 CRLF 更改为 LF]”。据我理解,如果设置了此标志,Vagrant 将 不会 将 CRLF 更改为 LF。然而,如果将其设置为 true,则 CRLF 会被更改为 LF。
git
的行尾处理只对在文件系统和git数据库之间移动的数据产生影响。它不会在共享文件夹上进行递归的dos2unix操作。如果你有一个专门用于Windows和Linux的独立工作目录,并使用git pull
在它们之间移动代码,那么它将非常有效。你可以拥有带有LF结尾的规范提交版本,以及带有CRLF行尾的Windows检出版本。(以及没有转换或强制转换为LF结尾的Linux检出版本。) - Peter Cordes1.7.1
。 - Jonathan