0

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

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

#!/usr/bin/perl

Linux VM 将其视为命令

#!/usr/bin/perl^M

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

4

2 回答 2

1

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

使用的算法git如下:

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

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

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

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

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

这是这两种方法的秘诀

于 2014-11-27T10:43:17.673 回答
0

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

*.pl text eol=lf

这解决了问题。

于 2014-12-01T12:50:55.777 回答